目录

​一、前言​

​二、项目背景及资源分享​

​三、项目简介​

​1、项目名称​

​2、系统框架​

​3、功能简介​

​4、控制核心​

​5、最小系统:​

​6、外围模块:​

​四、相关设计原理及框图​

​1、系统设计的原理​

​2、手势识别原理​

​3、系统设计框图​

​4、硬件部分系统框图​

​5、软件部分设计思路​

​五、硬件系统设计​

​1、32 * 80点阵显示屏​

​1.1 模块作用​

​1.2 实现功能​

​1.3 内部电路​

​2、RTC时钟​

​2.1 简介​

​2.2 模块作用及实现功能​

​3、DS18B20温度传感器​

​3.1 简介​

​3.2 模块作用及实现功能​

​4、ESP8266物联网WiFi模组​

​4.1 简介​

​4.2 模块作用及实现功能​

​5、STC8从机系统的设计​

​5.1 简介​

​5.2 模块作用及实现功能​

​6、PAJ7620手势识别模块​

​6.1 简介​

​6.2 模块作用及实现功能​

​7、各个模块与控制器接口定义​

​8、系统硬件设计小结​

​8.1 硬件部分设计的优点​

​8.2 硬件部分设计的缺点​

​8.3 硬件部分设计的改进及建议​

​六、软件程序设计​

​1、物联网模组ESP8266​

​2、屏幕滚动功能实现​

​3、时间日期设置​

​4、开机动画功能实现​

​5、主函数​

​6、软件设计小结​

​七、综合测试问题记录​

​1、点阵显示屏刷新部分测试​

​2、下位机STC-8与手势识别模块测试​

​3、温度传感器测试​

​4、物联网模组测试​

​5、系统联合测试​

​八、总结​



一、前言

大学四年真是快呀,不知不觉就毕业半年了!回头看看走过的路,总要留下一点痕迹才是,这里就对我的毕业设计进行一个总结,也算给以后的自己记录,留下一点东西。也给有兴趣的各位一个参考的实例。

二、项目背景及资源分享

在网上有看到一个视频,参考网址:​​手势控制的点阵时钟​​;感觉这个操作很清奇,让人耳目一新,就想着用这个来做毕设,当然也少不了我导师给我的建议和帮助,十分感谢。

ESP8266当做Arduino烧录程序:​​http://m.elecfans.com/article/584883.html​​;使用ESP8266获取天气的链接失效了,不过下边会讲一点。

这个视频的实现效果,很流畅, 很棒,但是我模仿做出来的还没达到这种程度,优化不够。然后就是换了一些新的传感器,换了一些显示方式等。本文中的部分内容是直接从毕业论文中复制过来的。有问题还请指出!谢谢

相关资源的百度云链接如下,主要包括程序,用到的一些数据手册等等。

链接:​​https://pan.baidu.com/s/11Vo0-9oMFYzqaxTQ4s09Iw​

提取码:xjen 

三、项目简介

1、项目名称

基于STM32手势控制显示系统的设计;

2、系统框架

本系统以STM32为核心处理器,主要负责实现点阵显示屏的刷新功能,芯片自带的RTC时钟功能,温度的计算与显示功能,红外光电开关的检测功能,与ESP8266物联网WiFi模组和STC8下位机的串口通信功能等。以STC8单片机作为从机系统,主要负责与手势识别模块的串口通信功能,OLED显示功能以及与主机STM32之间的数据传输功能等。

3、功能简介

确保整个系统接线无误后,上电,然后需要手动遮挡红外光电开关超过3秒,实现系统开机;然后进入开机动画,会有一个加载界面,接着会有一条横线从上往下扫屏,然后切换到主界面的显示。主界面显示有时间,日期,温度,天气,整个过程都是用手势来控制的。然后手势遮挡光电开关超过2秒,系统进入设置状态,在这里可以设置时间,日期等,具体可以通过手势左滑右滑切换要设置的某一位,上滑下滑调整数字大小,然后手势下压(向前靠近传感器)来保存设置并退出。

4、控制核心

STM32F103ZET6;

STC8A8K64S4A12。

5、最小系统:

STM32我直接使用的EU的最小系统板,用起来一般,我有同学自己画的控制板,可以尝试一下;

STC8的最小系统用的朋友自己画的板子。

6、外围模块:

闲鱼买的一个32 * 80的双色点阵显示屏;

ESP8266 WIFI模块(CP2102 NodeMCU开发板);

PAJ7620手势识别传感器;

0.96寸OLED显示屏;

光感式传感器(光电开关),有的也叫红外开关;

四、相关设计原理及框图

1、系统设计的原理

该系统主要是以STM32为核心处理器展开,集成了一个点阵屏显示系统,一个下位机手势检测系统,一个ESP8266物联网模块,一个温度传感器等。整个系统集手势识别,红外检测,物联网,串口通信,IIC通信,SPI通信等先进技术于一体。

用作下位机的STC-8单片机用来实时检测手势情况,同时用OLED显示当前识别值,然后通过串口通信反馈给STM32,当主控收到下位机的信息后,根据返回上来不同的码值,进行相应的设置,以此来实现滚屏,调整时间等功能。时钟利用STM32内置的RTC时钟来完成。外加有温度传感器DS18B20,可以用来实时获取当前周围环境的温度大小。当地天气状况则由ESP8266模块,通过公用的心知天气API来联网获取,并在模块内部对获取到的信息进行JSON解析,再将我们需要的信息用串口发送给主控板。主控板在收到对应的信息后,进行简单处理即可显示在点阵屏上。

2、手势识别原理

PAJ7620 是一款先进的光学数组式传感器,芯片内置有光源以及环境光抑制滤波器集成的 LED。传感器镜头和手势感测器集成在一个较小的立方体模组内,能够在黑暗或低光环境下工作[4]。PAJ7620 内部自带 LED 驱动器,传感器感应阵列、目标信息提取阵列和手势识别阵列等。

PAJ7620 在工作时通过内部 LED 驱动器,驱动红外 LED向外发射红外线信号,当传感器阵列在有效的距离中探测到物体时,目标信息提取阵列会对探测目标进行特征原始数据获取,获取的数据会存在寄存器中,同时手势识别阵列会对原始数据进行识别信息处理,最后将处理得到的手势结果存到寄存器中,用户可根据 I2C 接口对原始数据和手势识别的结果进行读取。

3、系统设计框图

毕业设计 —— 基于STM32手势控制显示系统的设计_时钟温度


4、硬件部分系统框图

毕业设计 —— 基于STM32手势控制显示系统的设计_时钟温度_02


5、软件部分设计思路

毕业设计 —— 基于STM32手势控制显示系统的设计_时钟温度_03


五、硬件系统设计

1、32 * 80点阵显示屏

1.1 模块作用

主要用做信息显示装置,模块内部已经集成了74HC595锁存器,74HC138译码器等芯片,因此主控板在控制点阵的时候相对比较容易,相关底层驱动程序的编写也比较容易。

1.2 实现功能

实现了单色显示时间,日期,星期,温度,天气等信息,并可随控制进行开机动画,时间日期的更改等操作。

1.3 内部电路

整个大的点阵都是用小的8*8点阵拼装而成,因此这里只用一块小点阵来简要描述内部原理图,具体内部电路如下图所示:

毕业设计 —— 基于STM32手势控制显示系统的设计_点阵_04

2、RTC时钟

2.1 简介

STM32内置的RTC时钟就是一个独立的定时器,它有一组连续计数的计数器,可以产生定时器中断,通过相关程序配置,可以间接实现时钟日历的功能。通过修改定时器内部计数器的初值可以来设置当前时间日期。RTC时钟模块可以使用备用电源供电,也就是说在系统关机或休眠时,RTC时钟不会受到影响,会在后备区域一直计数,并且可以在系统复位或者唤醒后,实时返回当前时间日期值。但是在系统复位后,内部会自动禁止访问RTC以及后备区域,防止用户误操作。因此在设置的时候,需要先取消备份区域的写保护。

2.2 模块作用及实现功能

模块作用:利用芯片内部的RTC时钟,结合上外围电路,用来获取当前时间日期等信息,用RTC中断返回给主控后,经过处理,得到正确的时间日期。

实现功能:实现了时间、日期、星期等信息的获取。

3、DS18B20温度传感器

3.1 简介

DS18B20温度传感器是“一线总线”接口的温度传感器。该温度传感器与传统的热敏电阻等测温元件相比优势在于,新型、体积尺寸小、适用电压宽、与微处理器接口简单等,综合成本,性能等方面考虑,选用此芯片。

DS18B20温度传感器一个重要特点就是一线总线通信方式,通俗来讲就是单总线结构,该结构使用简洁,组网方便。测量温度范围比较大,在-55~+125摄氏度,测量精度为±0.5摄氏度。使用过程中数据以单总线方式传输,抗干扰能力强。

且该温度传感器可以直接读出被测温度,可以童工简单的程序控制实现9~12位的数字值读数方式。工作电压为3~5.5伏特内,拥有多种封装,可以使系统的设计更加灵活、方便。在使用时,设定的分辨率及报警温度等信息会存储在 EEPROM 中,在掉电后仍然可以保存。

3.2 模块作用及实现功能

该模块的作用是帮助我们实时获取当前周围环境的温度值。而后通过单总线的方式将温度数据返回给主控板,经过处理之后,温度值即可正常显示在点阵屏上主要实现功能为对周围环境温度的读取,内部的处理,数据的存储,以及数据的传输等功能。

4、ESP8266物联网WiFi模组

4.1 简介

物联网模块主要采用乐鑫开发的ESP8266芯片,以及安信可利用此芯片搭建的低功耗串口-WiFi模组,方便用户进行二次开发,模块内部接入云端服务,可以实现物联网的相关控制。

模块内部集成了32位超低功耗MCU,可使用16位精简模式指令集,模块主频可以支持80MHz和160MHz,可以支持实时操作系统,硬件上还集成有板载天线等。还支持标准的网络接口协议。可以自定义联网功能,也可单独使用。

4.2 模块作用及实现功能

ESP8266模组主要用来定时向心知天气公用API发送指令,来获取本地天气状况,把得到的数据在内部进行json解析后,将有用的信息通过串口发送给主控板。

总体上来讲实现了系统联网的功能,并且可以从网上实时获取天气状况。

5、STC8从机系统的设计

5.1 简介

STC8A8K64S4A12是STC公司推出的最新型单片机,不需要外部晶振和外部复位电路,拥有超高速的8051内核(1T),比传统8051单片机速度约快12倍以上,指令代码等完全兼容传统8051内核。拥有多达20个中断源以及4级中断优先级等。

毕业设计 —— 基于STM32手势控制显示系统的设计_温度传感器_05


5.2 模块作用及实现功能

用此单片机作为下位机,只用来实现与PAJ7620手势识别芯片的IIC通信以及控制OLED显示两种功能。整个从机系统的软件设计流程如下:

(1) 与手势识别模块通过I2C进行通信,用来实时获取当前手势类型值,并存储起来备用。

(2) 将获取到的手势类型值显示在OLED上,作为主控对检测结果的对比。

(3) 在显示到OLED的同时,通过串口将手势类型值发送给主控,便于主控板对下位机信息的获取。

(4) 主程序中一直在检测手势类型值,检测到就用串口发送给上位机。

6、PAJ7620手势识别模块

6.1 简介

手势识别模块采用了“原相科技”的PAJ7620芯片, PAJ7620 是其推出的一款先进的光学数组式传感器,芯片内置光源以及环境光抑制滤波器集成的 LED,模块所用传感器镜头及手势感测器全部集成在一个很小的立方体模组内,并且还能够在黑暗或低光环境下工作。芯片内部提供接近检测功能,可以用于感测物体接近或离开。此外,PAJ7620还具有以下特点:

(1) 采用安全可靠的IIC接口,支持高达400Khz的通信速率。

(2) 芯片内置9个手势类型(上,下,左,右,前,后,顺时针转动,逆时针转动,挥动),支持输出中断。

(3) 传感器支持接近检测功能,同时支持检测物体体积的大小和环境亮度。

(4) 芯片具有较低的功耗。

(5) 抗灯光干扰。

6.2 模块作用及实现功能

主要用来实现手势类型的检测,以及内部数据的处理与保存。在得到处理结果的时候,将获取到的手势类型值通过I2C返回给单片机。

工作流程如下图:

毕业设计 —— 基于STM32手势控制显示系统的设计_点阵_06

7、各个模块与控制器接口定义

STM32与点阵接口

毕业设计 —— 基于STM32手势控制显示系统的设计_时钟温度_07

毕业设计 —— 基于STM32手势控制显示系统的设计_点阵_08


温度传感器,光电开关,LED灯,KEY按键接口

毕业设计 —— 基于STM32手势控制显示系统的设计_时钟温度_09


手势识别模块数值,方向,符号等

毕业设计 —— 基于STM32手势控制显示系统的设计_温度传感器_10


定时器中断,RTC中断接口

毕业设计 —— 基于STM32手势控制显示系统的设计_温度传感器_11


与下位机和ESP8266通讯串口

毕业设计 —— 基于STM32手势控制显示系统的设计_ESP8266获取天气_12


用到的手势方向接口,光电开关不同颜色的线对应的接口

毕业设计 —— 基于STM32手势控制显示系统的设计_温度传感器_13


时钟晶振对应接口

毕业设计 —— 基于STM32手势控制显示系统的设计_点阵_14


STC8单片机与手势识别模块IIC通讯接口,点阵显示屏双色显示模式切换

毕业设计 —— 基于STM32手势控制显示系统的设计_点阵_15


STC8 IIC接口

毕业设计 —— 基于STM32手势控制显示系统的设计_手势识别_16


8、系统硬件设计小结

8.1 硬件部分设计的优点

(1) 主控芯片功能强大,成本低,操作简单,使用方便,代码编写容易;

(2) 显示屏价格实惠,抗干扰能力强,使用便捷;

(3) 硬件模块化程度相对较高,焊接印刷工艺良好,性能稳定;

(4) 布线相对简单,不易造成干扰。

8.2 硬件部分设计的缺点

(1) 成本相对较高,多使用了一个STC8单片机作为下位机;

(2) 产品外部包装不是很好,全部裸露;

(3) 显示颜色单调,亮度体验感觉不太好;

(4) 接口太多,布线不够整洁,容易连线错误;

8.3 硬件部分设计的改进及建议

在硬件设计的时候,要综合全局来考虑,简单步骤如下:

首先是对模块,芯片的选型,要考虑到性能需要满足我们的设计要求,以及成本在可承受范围内。

接着在设计电路的时候要注意布线规则,在不影响性能的情况下芯片排列要尽可能的美观,便于后期焊接。

在系统各模块进行连接的时候,要充分考虑到模块位置,接线方式,以及这样排列放置的优缺点,抗干扰性能等,在焊接跳线时,要镀锡,避免导线断路,否则出问题很难排查,在可能造成短路的地方,一定要提前做好预防,避免器件的烧毁。针对功率大的器件,还需要考虑散热等问题。

六、软件程序设计

程序部分不会一一讲解,可以直接去看代码,下边着重讲一下ESP8266部分代码。

1、物联网模组ESP8266

本系统使用了基于ESP8266的NODMCU开发板,可以直接用Arduino IDE对其进行编程。在程序中首先包含了ESP8266WIFI以及ArduinoJson的头文件,然后定义了需要连接到的WIFI名称,密码等信息;接着设置需要连接的心知天气的API接口网址,以及API KEY等;然后就是设置我们需要获取天气状况的地点,我在这里默认设置了郑州为获取天气的地点;还有要解析的语言类型,最后对串口的波特率,获取天气的时间间隔,获取内容的大小做了一些定义。具体程序代码如下图:

毕业设计 —— 基于STM32手势控制显示系统的设计_点阵_17

定义了一个结构体,用来存储我们需要从网页中提取数据的类型,主要信息有城市名称,天气,温度,更新时间等,如下图:

毕业设计 —— 基于STM32手势控制显示系统的设计_手势识别_18


2、屏幕滚动功能实现

屏幕滚动功能的实现主要是通过改变缓冲数组中的值来实现的,目前只实现了最简单的整屏向左向右移动,以向左滚动为例,代码如下:

毕业设计 —— 基于STM32手势控制显示系统的设计_ESP8266获取天气_19


3、时间日期设置

时间日期的设置使用了一个红外光电传感器,当传感器被遮挡超过2S时,进入设置模式,从时间的最右边,也就是秒的个位开始,然后检测手势识别模块的返回值,向上加1,向下为减1,向左为切换到秒的各位,向右为日期年份的十位,以此类推。

在设置完成后,手势识别模块返回向前或向后,即为保存。用两种类型都作为保存是因为手在向前运动,离开的时候极大可能会造成误检测,因此将远离也用作保存。

整个设置都结束并且也保存完成之后,再次遮挡红外光电传感器,超过2S即视为退出设置,恢复到正常显示界面。红外光电传感器初始化程序如下图:

毕业设计 —— 基于STM32手势控制显示系统的设计_点阵_20

4、开机动画功能实现

在整个系统上电后,需要遮挡红外光电传感器3S以上,系统才能“开机”,伴随着开机动画的出现,最后定格在时间日期的显示上。实现过程简单的来说就是先逐一点亮每一列,实现进度条的加载,而后再逐行点亮,即可实现向下的滚动效果,而后在显示过后的数组后边填充上开机动画完毕后要显示的欢迎界面,即可实现想要的效果。具体实现代码如下:

毕业设计 —— 基于STM32手势控制显示系统的设计_时钟温度_21


用while循环在一行当中逐列点亮LED,实现进度条加载功能,具体如下:

毕业设计 —— 基于STM32手势控制显示系统的设计_点阵_22


用while循环来逐行点亮屏幕,知道最后一行,然后跳出while循环,如下图:

毕业设计 —— 基于STM32手势控制显示系统的设计_手势识别_23

毕业设计 —— 基于STM32手势控制显示系统的设计_ESP8266获取天气_24



5、主函数

主函数内部程序主要是一些功能模块的初始化,以及一些函数的调用,分步介绍如下:

毕业设计 —— 基于STM32手势控制显示系统的设计_时钟温度_25

毕业设计 —— 基于STM32手势控制显示系统的设计_温度传感器_26

概括来说主函数依次执行功能模块的初始化函数,如果系统第一次上电的话,则还需要设置初始时间,接着就执行开机动画函数,全部都执行完毕后,主函数进入死循环,如果不遮挡红外光电传感器,则默认显示在时间日期界面,此时可以手势控制屏幕滚动,实现左右切换,如果遮挡红外光电传感器超过2秒以上,则会进入到设置界面,同样的在设置完成退出后,程序又继续回到时间日期的滚动显示界面。

6、软件设计小结

整个手势控制显示系统的程序编写,基本按照从部分到整体的结构来设计,针对不同的模块,基本都可以用不同的C文件来编写,方便后续的修改与维护。在编写过程中,有良好的代码注释风格,良好的函数以及变量命名规则,通俗易懂。

但是主程序文件内容太多,没有做到很好的拆分,阅读较困难;代码不够精简,优化程度不高;整个程序在设计的时候,条理分支不是很清楚,思路不够清晰;整个系统设计之初的功能需求没有全部实现;实际用户体验不是太好,还需要继续优化。

七、综合测试问题记录

1、点阵显示屏刷新部分测试

在程序编写初期,点阵显示屏刷新总是出现乱码,后来经过排查之后发现点阵显示屏与主控板的接线不是很好,中间有的可能出现了接触不良,断路的情况,导致屏幕出现乱码。

在进一步测试时发现左右滚屏出现前一屏的内容还在的问题,后经过排查发现是在向左或者向右滚屏之后没有及时把上一屏的内容清空,也就是没有把数组内的数值清零,这样会导致如果前一屏显示的内容比后一屏显示的内容长的话,在滚动到后一屏显示时,前一屏的数据还停留在屏幕上。后来在程序中进行了数组清空操作。

在加入手势识别模块后,主控板与点阵显示屏的通信特别容易受到干扰,主要表现为出现屏幕抖动,闪屏等问题,在经过几天的调试之后还是没有解决问题,最后采取了用一块单片机作为下位机来保持与手势识别模块的通信,至此,点阵显示屏恢复正常。

最后经过多次调优测试稳定后,点阵显示屏基本保持正常,并在这里把程序备份。

2、下位机STC-8与手势识别模块测试

在程序编写初期,发现单片机不管怎样都无法收到返回值,后经检验,是单片机的I2C接口接线错误,导致无法与模块进行通信。

接着在编写OLED显示时,出现初始UI界面有显示,但是手势类型信息没有显示,后经排查发现是忘了更新缓存到OLED导致的。

最后在串口发送时,由于初始化设置错误,导致单片机不能成功发送数据给主控,后经排查,修改了对应参数设置后,整个模块使用正常。

3、温度传感器测试

该部分程序在编写初期,采用的是普通模式来读取温度值,在调试的时候发现温度值固定显示在85.5摄氏度,经过程序多处修改测试,包括更换温度传感器DS18B20芯片,问题依然没有解决。

后来采用定时器中断方式来定时读取温度值,在代码移植过程中,出现变量名输入错误,单总线接口以及方向使用错误,又导致温度不能正常显示,后来经过对问题部分的修改调试,温度值可以正常显示。

在随后的测试中发现温度值变化不是很灵敏,这个问题在后来的优化中没有进一步明显的实际效果,暂时搁置。

4、物联网模组测试

刚开始再给ESP8266模组烧录固件的时候,多次出现错误,后经过与同学的沟通讨论,采取用官方软件烧录固件的方式,最终固件烧写成功。

在调试程序过程中,刚开始由于API密匙填写错误,导致无法获取数据。后来经过排查,解决问题。

在处理接收到的返回信息是,发现很多无用的数据,影响串口传输,也不利于数据处理,解决办法是在程序中把不需要的信息删除掉,不让通过串口发送,便于主控板接收处理数据。

5、系统联合测试

从最初的部分到最后所有模块都基本可以实现功能时,开始系统的整体调试,在整体调试过程中有一个最大的问题是无论我怎么修改定时器中断优先级,实际结果均无太大改变,在一次一次的尝试之后,发现定时器中断分组设置在中断初始化之后,我把定时器中断分组的配置修改到定时器中断初始化函数之前,问题终于解决,这个问题使我印象非常深刻,以后一定会谨记。

最后系统整体测试基本没出现太大的问题,主要是对一些功能的完善以及代码的优化,以及效率的提升。最终整体效果比较稳定。

八、总结

1、记得当时应该是做了快两个月,然后算是对自己学习的综合能力做了一次检验,继续努力。

2、当时答辩的时候,ESP8266联网模块出现了一点问题,没能成功演示,真是掉链子,说明做的东西还是不够稳定。

3、有问题或者有兴趣进一步了解的同学,可以联系QQ:1446227671。能力范围内的会尽力帮助大家~~~