智能水杯托
作者:sipower
一、作品简介(100-200字)
(设计名称、作品照片、功能介绍等。)
本次作品设计了一款智能水杯托,能检测水杯使用状态,能够提醒用户及时喝水。通过连接阿里云平台,实现时钟自动校准。还可以在云终端对水杯托进行参数设置。本次作品主要工作,其一是设计一个漂亮的界面,用起来赏心悦目。另一个就是对接阿里云,实现云享云用,智慧连接。
下图是最终的实物作品照片。
图1、作品照片
二、系统框图(图文结合)
(系统软硬件实现框图)
硬件采用STM32L496G-DISCO评估板做主控,使用一个反射型光电传感器RPR-220来探测杯子是否出现在杯托上。通过ESP8266模块连接阿里云,并获取网络时间,同步水杯状态,设置参数等操作。硬件框图如下。
图2、硬件框图
软件采用FreeRTOS系统作为基础软件平台,使用TouchGFX设计界面。系统状态机如下图。
图3、状态机
待机状态下,显示一个模拟时钟。如果超过一定时间用户未拿起水杯,进入下一个提醒状态。如果未超时就喝水,进入鼓励状态。
提醒状态下,显示文本“该喝水啦!”。如果用户拿起水杯,进入鼓励状态。
鼓励状态下,显示文本“棒棒哒!”。如果用户放下水杯,进入待机状态。如果超过一定时间用户未放下水杯,进入接水状态。
接水状态下,显示文本“接水去了吗?”。如果用户放下水杯,进入待机状态。
三、各部分功能说明(图文结合)
(各部分实现的功能说明及讲解,以图文结合的展示。)
1、UI界面实现
首先介绍一下我使用的开发环境:
TouchGFX软件版本:4.20.0
IAR EWARM软件版本:9.30.1
STM32CubeMX软件版本:6.6.1
STM32CubeProgrammer软件版本:2.11.0
开发板:STM32L496G-DISCO
桌面系统:Window11
下面介绍使用TouchGFX 4.20.0 Designer设计界面。首先基于STM32L496G-DISCO创建一个空工程,如下图。
图4、创建工程
添加背景、控件等等,如下图是添加模拟时钟。
图5、添加控件
经过一番折腾尝试,终于把界面配置好,如下图。由于不熟练,还专门增加一个屏幕,用来测试各个控件的用法。
图6、界面设计
我先在测试屏幕把用到的各个元素进行了一番尝试,并确认代码能实现,然后才向正式的主屏幕移植。如下图是测试屏幕的样子。
图7、测试屏幕
这里特别说明一下,为了模拟水杯拿起和放下,我在主界面设置了两个透明按钮来实现状态的改变。下图是其中一个按钮的说明。为了方便按到,我把上半个屏幕作为可触控区域,然后按钮放在最上层,并设置透明。在最右边添加交互,调用一个虚函数。
图8、透明按钮
下图是透明按钮交互虚函数实现的具体介绍,注意有些代码是自动生成的,有些是我添加的。
图9、虚函数实现
然后就是在<MainView.cpp>这个文件中添加代码,实现我设计的状态机。具体的代码参见附件。
通过使用TouchGFX的仿真功能进行测试除错,确定没问题了就可以一键下载到开发板,在硬件上直接测试了。调试好的界面参见视频展示。
以上,基础的界面就设计完了。整体看起来可能很简单,但是对于从零开始学习TouchGFX的人,还是要查阅多个例程,构思哪些功能能够用的上,用何种方式配置,以什么形式展示。但是一旦入了门,这个后续用起来就简单了。
2、杯子位置检测方案
我使用一个反射型光电传感器RPR-220来探测杯子是否出现在杯托上。传感器原理和实物如下图。
图10、光电传感器
检测杯子在不在位置,其实还可以用机械式压触开关,用起来更简单。之所以最后用光电式的,是因为光电式的传感器不接触,结构简单,可靠性高。这个传感器的电路设计如下图。
图11、传感器电路图
这种传感器大多数用于检测黑色标记,界限比较分明,我这拿来检测水杯,受不同水杯表面颜色影响,输出的电压信号并不一致,因此我设计了一个动态检测的方法,就是分别检测发光管打开和关闭时接收管的输出电压,然后做差值,如果没有杯子,这个差值会很小,反之则大很多,这样检测结果就比较准了。
传感器与STM32L496G-DISCO开发板的连接,采用了预留的Arduino uno接口,使用一个ADC口采集电压,一个IO口控制发光管开关。具体使用的资源如下图。
图12、Arduino uno接口
我找了一个裸板PCB,飞线焊上光电传感器,如下图。
图13、飞线板
最终连到STM32L496G-DISCO开发板的效果如下图。
图14、连好电路板
预计使用场景是下图这样的。
图15、使用场景
连接好硬件电路,接下来就是调试程序。先在STM32CubeMX里面配置ADC和IO口输出。下图是ADC配置,使用DMA转存采样数据,CPU可以不用介入任何操作,效率比较高。
图16、ADC配置
下图是IO配置,默认高电平,上拉,中速。
图17、IO配置
这里特别强调一下不要忘了配置参考源,我就是忘了配置,然而STM32CubeMX也没有提示,导致搞了好长时间才找到原因。如下图。
图18、参考源配置
接下来生成代码,在编辑器里面添加具体实现。如下代码实现了水杯检测,并发送一个消息给UI部分。硬件获得参数传递给UI,按照TouchGFX规定的MVP结构传送,具体传递过程如下图。
图19、参数传递
所有文件修改好后,编译,下载,运行,就可以了看到最终的运行结果,实物作品的使用过程见视频展示。
- 连接阿里云同步时间和数据
开发板通过ESP8266模块连接阿里云,并获取网络时间,同步水杯状态,设置参数等操作。我用的ESP8266模块是安信可出品的ESP-12S,如下图。
图20、WiFi模块
由于购买比较早,里面的固件都不支持MQTT协议,所以第一件事是先升级WiFi固件。下面链接是安信可官方页面,所有需要用到的软件包都能在这个页面找到。
https://docs.ai-thinker.com/esp8266
具体的升级教程网上很多,不再细说,此处列举一个。
https://blog.csdn.net/jdhuzb/article/details/119678009
开发板和WiFi模块硬件连接,我采用的UART1口,对应板上CN3的PMOD#2和PMOD#3引脚,如下图所示。
图21、串口接口
CN3接口可以直接提供3.3V电源,用4根线引出到WiFi模块即可,连接好的实验板如下图。
图22、连接好的实验板
硬件连接好后,开始设计软件。先用STM32CubeMX配置串口,如下图。由于要接收不定长的字符串帧数据,采用串口空闲中断+串口DMA中断实现,所以需要设置DMA通道。
图23、配置串口
串口的基本配置STM32CubeMX都会自动生成好,比较重要的是需要自己编写空闲中断回调函数,这个官方HAL库没有提供。我编写了UART1和UART2透传的回调函数,基本实现DMA全自动收发,只占用CPU非常少的资源。
其中要注意两点:其一,DMA缓冲buffer要足够长,至少要大于阿里云传回的最大报文长度。其二,开启下次中断前要清除ORE标记,防止在中断处理关闭DMA期间有数据进来,造成ORE错误。
接下来是在阿里云平台建立产品和设备,这个网上教程太多,这里不再细说,发个如下链接供参考。
https://blog.csdn.net/u014421313/article/details/125412417
下图是我在阿里云上创建的设备,带了3个属性,分别是:水杯状态,水杯在位置超时时间,水杯离开位置超时时间。
图24、阿里云上创建的设备
接下来是编写单片机的连网程序。网上各种例程较多,可能是考虑各种异常情况,大部分弄得都比较复杂,看起来头大。我这则是采用最简单粗暴的方式连接阿里云,代码结构也非常简单,适合新手练习使用。我先是在头文件《esp_mqtt.h》里面把联网信息都定义好,考虑这个只是演示项目,不需要灵活配置,就没有拆分成灵活的。
然后在《esp_mqtt.c》里面,直接用串口一帧帧发送,每帧之间留一点延时,等阿里云返回数据。
这里重点说一下数据解析回调函数。这个里面分两部分,第一部分是将接收的时间字符串里面的时分秒三个参数提取出来,用于发给模拟时钟校时。这个比较简单,找准字符串位置,直接用atoi()函数将字符串转为int数字就行了。第二部分是对收到阿里云的设置报文进行解析。网上大部分例程对于这种参数少,内容简单的json字符串,都是用字符串函数一点点提取,我觉这样比较麻烦,所以此处我直接调用了cJSON库进行解析,有种牛刀宰鸡的爽快!最终将结果都从调试串口打印出来。经过反复调试,终于实现了阿里云数据上报和订阅,具体展示参见视频。
然后是把更新的时间数据,订阅接收的设置数据同步给TouchGFX界面。最后再做一个web应用实现云端设置。
编写这部分程序时,我最开始计划用osMessageCreate创建2个指向结构体的消息队列,分别传递从阿里云获取的时间数据和设置数据给TouchGFX部分代码,然而经过反复查资料,发现由于STM32CubeMX做了从新封装,这个默认的osMessageCreate只能创建指向int32型的队列,指向指针的话还得单独分配内存空间,相当麻烦,在这我就偷个懒,只创建一个消息队列传递标志位,指示当前更新的是什么信息,而把时间数据和设置数据对应的结构体设置成全局变量,直接在TouchGFX部分代码调用。由于标志位传递遵循MVP方式,实际用起来也没什么问题。
最后设计了一个WEB端应用,用来指示和设置水杯托的参数,具体应用界面如下图。
图25、WEB端应用
四、作品源码
代码见如下链接:
https://download.eeworld.com.cn/detail/sipower/625171
五、作品功能演示视频
(视频简介+链接)
视频见如下链接:
- 设计UI,实现状态机。
https://www.bilibili.com/video/BV1WD4y1y7nF?share_source=copy_web
2、智能水杯托软硬件调试成功。
https://www.bilibili.com/video/BV1kg411Y7ts?share_source=copy_web
3、智能水杯托连接阿里云。
https://www.bilibili.com/video/BV1wD4y1C727?share_source=copy_web
4、智能水杯托之阿里云显示和设置。
https://www.bilibili.com/video/BV1QD4y1k72e?share_source=copy_web
六、项目总结
(项目文字总结+帖子分享链接汇总)
通过这次作品设计,我基本掌握了TouchGFX的开发流程,熟悉了在FreeRTOS系统上,整合TouchGFX和硬件接口的操作。通过增加WiFi模块,实现了与阿里云的通讯和物联网操作。为以后的工作增添了新的技能。
总之感谢得捷电子和EEWORLD提供的这次创作机会,你们为广大工程师学习、研究提供了经济和技术支持,对整个行业都有积极的作用,希望两家公司越办越好。
帖子链接如下:
1、开箱分享:
https://bbs.eeworld.com.cn/thread-1206983-1-1.html
2、基于STM32L496G-DISCO的TouchGFX开发环境搭建
https://bbs.eeworld.com.cn/thread-1220158-1-1.html
3、基于TouchGFX的UI设计
https://bbs.eeworld.com.cn/thread-1220165-1-1.html
4、为TouchGFX界面添加硬件支持
https://bbs.eeworld.com.cn/thread-1220212-1-1.html
5、连接阿里云同步时间和数据
https://bbs.eeworld.com.cn/thread-1220875-1-1.html
七、其他
无。
智能水杯托_作品提交.doc
(6.83 MB, 下载次数: 3)
|