首页-达尔闻    全部    毕业设计| 基于STM32 的手势控制点阵显示设计

毕业设计| 基于STM32 的手势控制点阵显示设计

本系统以 STM32 为核心处理器,主要负责实现:点阵显示屏的刷新功能、芯片自带的 RTC 时钟功能、温度的计算与显示功能、红外光电开关的检测功能、与 ESP8266 物联网 WiFi 模组串口通信功能、与 STC8 下位机的串口通信功能等、以 STC8 单片机作为从机系统,主要负责、与手势识别模块的串口通信功能OLED 显示功能、与主机 STM32 之间的串口通信功能等。
收藏
  • 大学的最后一课就是毕业设计,记录下自己的毕业设计,也算是对自己大学四年的总结。今天毕设来自FightingBoom,他非常详细的分享了制作的过程,以及在设计中会遇到的一些坑。FightingBoom是一位非常愿意分享的小伙,开通了自己的公众号,想和他共同交流技术的,可以关注下。

     

    下面FightingBoom正式开始毕设分享:

    01项目背景及资源分享

    在网上有看到一个视频,如下:

    点击观看

    视频来源网络我感觉这个操作很清奇,让人耳目一新,就想着用这个来做毕设,当然也少不了我导师给我的建议和帮助,十分感谢。视频呈现的效果,比我模仿的要更流程一些。我的毕设优化不够,所以就想换一种更新的传感器和显示方式等。本文中的部分内容是直接从毕业论文中复制过来的。有不足之处还请多多指教!谢谢!

    ESP8266 当做 Arduino 烧录程序,使用 ESP8266 获取天气的链接失效了,不过下边会讲一点。

    相关资源如程序、用到的一些数据手册等等,可以在“达尔闻说”微信回复:STM32手势控制,获取。

     

    02系统功能及核心器件

    本系统以 STM32 为核心处理器,主要负责实现:

    1)点阵显示屏的刷新功能

    2)芯片自带的 RTC 时钟功能

    3)温度的计算与显示功能

    4)红外光电开关的检测功能

    5)与 ESP8266 物联网 WiFi 模组串口通信功能

    6)与 STC8 下位机的串口通信功能等

    7)以 STC8 单片机作为从机系统,主要负责

    8)与手势识别模块的串口通信功能

    9)OLED 显示功能

    10)与主机 STM32 之间的串口通信功能等

    具体的操作如下:

      确保整个系统接线无误后,上电,然后需要手动遮挡红外光电开关超过 3 秒,实现系统开机。

      进入开机动画,会有一个加载界面,显示一条横线从上往下扫屏,然后切换到主界面的显示。

      主界面可以显示内容有时间、日期、温度、天气,整个过程都是用手势来控制的。

      用手势遮挡光电开关超过 2 秒,系统进入设置状态,在这里可以设置时间、日期等。

      具体操作可以通过手势左滑右滑切换要设置的某一位,上滑下滑调整数字大小,然后手势下压(向前靠近传感器)来保存设置并退出。

    这个毕设用的控制核心是:STM32 控制器STM32F103ZET6和STC8 控制器:STC8A8K64S4A12。STM32 我直接使用的 EU 的最小系统板,用起来一般,我有同学自己画的控制板,可以尝试自己画一块;STC8 使用朋友画的最小系统的控制板。

    除了上面两个核心控制器之外,还需要一些外围器件:

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

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

    ● PAJ7620 手势识别传感器;

    ● 0.96 寸 OLED 显示屏;

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

     

    03相关设计原理及框图

    该系统主要是以 STM32 为核心处理器展开,集成了一个点阵屏显示系统、一个下位机手势检测系统、一个 ESP8266 物联网模块、一个温度传感器等。

    整个系统集手势识别,红外检测,物联网,串口通信,IIC 通信,SPI 通信等先进技术于一体。

    用作下位机的 STC-8 单片机用来实时检测不同手势,同时用 OLED 显示当前识别值,然后通过串口通信反馈给 STM32 主控芯片。

    当主控芯片收到下位机的信息后,根据返回的不同手势识别码,进行相应的设置/操作,以此来实现滚屏,调整时间等功能。

    时钟利用 STM32 内置的 RTC 时钟来完成。外加有温度传感器 DS18B20 ,可以用来实时获取当前周围环境的温度大小。

    当地天气状况则由 ESP8266 模块,通过公用的心知天气 API 来联网获取,并在模块内部对获取到的信息进行 JSON 解析,再将我们需要的信息用串口发送给主控板。

    主控板在收到对应的信息后,进行简单处理即可显示在点阵屏上。

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

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

    整体系统设计框图如下:

    硬件部分系统框图如下:

    软件部分设计思路:

     

    04主要硬件系统设计

    32 * 80 点阵显示屏

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

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

    RTC时钟

    STM32 内置的 RTC 时钟就是一个独立的定时器,它有一组连续计数的计数器,可以产生定时器中断,通过相关程序配置,可以间接实现时钟日历的功能。通过修改定时器内部计数器的初值可以来设置当前时间日期。结合外围电路,用来获取当前时间、日期等信息,用 RTC 中断返回给主控后,经过处理,得到正确的时间日期。

    DS18B20 温度传感器

    该模块的作用是帮助我们实时获取当前周围环境的温度值。而后通过单总线的方式将温度数据返回给主控板,经过处理之后,温度值即可正常显示在点阵屏上。

    主要实现功能为:对周围环境温度的读取,内部的处理,数据的存储,以及数据的传输等功能。

    ESP8266 物联网 WiFi 模组

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

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

    STC8 从机系统的设计

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

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

    2)将获取到的手势类型值显示在 OLED 上,作为与实际显示结果的对比。

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

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

    PAJ7620 手势识别模块

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

    工作流程如下图:

     

     

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

    1)STM32 与点阵接口:

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

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

    4)定时器中断,RTC 中断接口:

    5)与下位机和 ESP8266 通讯串口:

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

    7)时钟晶振对应接口:

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

    9)STC8 单片机 IIC 接口:

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

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

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

    3)在系统各模块进行连接的时候,要充分考虑到模块位置,接线方式,以及这样排列放置的优缺点,抗干扰性能等。

    4)在焊接跳线时,要镀锡,避免导线断路,否则出问题很难排查,在可能造成短路的地方,一定要提前做好预防,避免器件的烧毁。针对功率大的器件,还需要考虑散热等问题。

     

    06软件程序设计

    程序部分不会一一讲解,可以直接去看代码(在“达尔闻说”微信回复:STM32手势控制),下边着重讲一下 ESP8266 部分代码。

    1)物联网模组 ESP8266

    本系统使用了基于 ESP8266 的 NODMCU 开发板,可以直接用 Arduino IDE 对其进行编程。

      在程序中需要包含 ESP8266 模组 WIFI 以及 ArduinoJson 的头文件;

      定义需要连接到的 WIFI 名称,密码等信息;

      设置需要连接的心知天气的 API 接口网址,以及 API KEY 等;

      设置我们需要获取天气状况的地点,我在这里默认设置了郑州为获取天气的地点;

      还有要解析的语言类型,最后对串口的波特率,获取天气的时间间隔,获取内容的大小做了一些定义;

    具体程序代码如下图:

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

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

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

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

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

    4)开机动画功能实现

    在整个系统上电后,需要遮挡红外光电传感器 3s 以上,系统才能 “开机” ,伴随着开机动画的出现,最后定格在时间日期的显示上。

    实现过程简单的来说就是先逐一点亮每一列,实现进度条的加载,而后再逐行点亮,即可实现向下的滚动效果,然后在显示过后的数组后边填充上开机动画结束后要显示的欢迎界面,即可实现想要的效果。

    具体实现代码如下:

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

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

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

    概括来说主函数依次执行功能模块的初始化函数,如果系统第一次上电的话,则还需要设置初始时间。

    接着就执行开机动画函数,全部都执行完毕后,主函数进入死循环,如果不遮挡红外光电传感器,则默认显示在时间日期界面。

    此时可以使用手势控制屏幕滚动,实现左右切换,如果遮挡红外光电传感器超过 2 秒以上,则会进入到设置界面,同样的在设置完成退出后,程序又继续回到更新后的时间日期的滚动显示界面。

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

    还需继续改进的地方:

      主程序文件内容太多,没有做到很好的拆分,阅读较困难;

      代码不够精简,优化程度不高;

      整个程序在设计的时候,条理分支不是很清楚,思路不够清晰;

      整个系统设计之初的功能需求没有全部实现;

      实际用户体验不是太好,还需要继续优化。

     

    07综合测试问题记录

    综合测试问题记录

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

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

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

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

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

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

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

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

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

    3)温度传感器测试

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

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

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

    4)物联网模组测试

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

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

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

    5)系统联合测试

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

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

    每周四,达尔闻的毕设分享系列为大家分享过往的毕设项目,如果你有项目愿意分享,可以联系妮姐(微信:459888529),所有热心分享的小伙伴将会获得达尔闻礼品一份。

    欢迎2021届毕业生加入微信交流群,与大家共同交流,请加妮姐微信(459888529),备注:2021毕设。