[STM32U5]

【STM32U599J-DK测评】工业温度仪表盘

[复制链接]
1259|6
手机看帖
扫描二维码
随时随地手机跟帖
HonestQiao|  楼主 | 2024-2-28 21:27 | 显示全部楼层 |阅读模式
本帖最后由 HonestQiao 于 2024-3-5 17:00 编辑

#申请原创# 在 STM32U599J-DK 开发板上,提供了一个MEMS温度传感器:
1875965df296401640.png
这篇评测分享,就是使用X-CUBE-MEMS,获取温度传感器数据,并在屏幕上进行显示,最终的效果如下:
3130165df29c410676.png


一、功能设计
这个工业温度仪表盘要显示当前的温度数据,每秒刷新一次。
同时,还要累计历史数据,显示5分钟的平均值,以及15分钟的平均值。


二、硬件了解
从开发板的手册,可以了解到温度传感器的具体位置(U18):
4041165df2950c28fc.png

从官方提供的原理图中,可以看到具体的型号为STTS22H:
6807665df2a1807fcb.png

关于其详细信息,可以从ST官网查看:https://www.st.com/zh/mems-and-sensors/stts22h.html

从上面的电路原理图可知,其连接到了I2C3,对应的引脚为PH7-SCL、PH8-SDA。

三、TouchGFX界面设计
1. 图片准备:
首先,准备好一张背景图:
7621165df2a9877f14.png
这张图是经过仔细挑选的,搭配STM32U599J-DK的屏,完美。

并在TouchGFX项目中,添加该图片:
2161165df2b955a134.png

2. 字体文件准备
另外,还需要准备一个LED字体:
45265df2ac54381d.png

并将该字体文件,放置到项目对应的目录下:
9022665df2afa44645.png

3. 字体设置:
对界面中,要显示的字号设置对应的字体规格:
5025265df2b2065e48.png
5457865df2b20780c5.png

对于显示数值的部分,还有从特殊处理:
7433865df2b61d462a.png

然后,在Config进行如下设置,确保最后字体能够正常调用:
1021065df2b812cb03.png

4 界面设计:
参考小图,进行界面的设计:
5452265df2bb099fba.png

对于要动态显示数值的元素,需要做wildcard设置:
8585965df2bf8ecd2f.png


设计完成后,可以点击预览,查看效果:
9907965df2c228a168.png


四、STM32CubeMX配置
ST官方提供了X-CUBE-MEMS,其中已经对STTS22H温度传感器提供了支持,可以很方便的通过配置集成,然后在程序中读取数据。
1. 安装X-CUBE-MEMS1
通过包管理,安装需要的模块:
9386565df2d024b44c.png

2. MEMS模块传感器安装:
4082465df2d3392bc1.png

从上述界面,点击X-CUBE-MEMS1,进入包管理:
1559665df2d49c0e44.png
安装其中的STTS22H和ENV_SENSOR两个即可。

3. I2C3启用:
因为STTS22H连接到了I2C3,对应的引脚为PH7-SCL、PH8-SDA,在I2C3配置中开启并进行设置:
9323965df2d6cf2ca9.png

4. 设置STTS22H
默认情况下,需要将STTS22H的Addr脚接地:
7170165df2de468cb2.png

因此需要做如下的配置:
8699565df2df079b94.png

并设置使用I2C3:
9188765df2dfacfc93.png

设置完成后,关闭STM32CubeMX,自动生成最新的代码。

五、代码编写
代码部分,分为两个部分,分别是初始化STTS22H,以及在MPV代码中获取温度传感器的数据,并进行呈现。

1. 初始化STTS22H
在main.c中,使用如下的代码完成初始化:
1961665df2eb2ee401.png

2. 温度传感器数据读取
这个部分的处理,参考了ST官方TouchGFX手册的后端通信部分:https://support.touchgfx.com/zh-CN/docs/development/ui-development/touchgfx-engine-features/backend-communication#sampling-from-gui-task

在MVP架构中:
7729265df2f18ba29b.png
帧率为60Hz,也就是1秒刷新60次。
在这个分享中,温度读取不需要太高的速度,所以直接在帧刷新的过程中,进行温度传感器数据的读取。

在Model的预定一种,添加对应的属性:
9947365df2fd9568d9.png
其中,counter用于计数,每60次进入一次读取。
temperature用于当前温度数据的测量,temps使用了向量vector来存储历史的数据。

tick()调用中,添加对应的代码:
5489465df2fbb3013c.png

在上述代码中,会调用SENSOR接口,读取STTS22H的数据,然后存放到temps中,并计算5分钟和15分钟的平均值。
计算完毕后,通过modelListener->notifyTemperatureChanged(temp1, temp2, temp3),通知监听其的控制器,进行数据的更新处理。

在ModelListener中,有一个空的virtual函数定义:
2658265df30ba48bed.png

其实际定义在对应的控制器中:
2540665df30e251e6d.png
4556765df30ee7a7f0.png

最终,调用关联的view,进行温度值的设置。

在View中,做最终的呈现处理:
1155065df312c7b94c.png
2214165df313bd3928.png

在上述代码中,需要将要显示的数据,使用字符串的模式,存入对应的Buffer中。
而这些Buffer,通过之前的界面设计,自动生成到代码中,具体在ScreenViewBase中查看:
1633265df318a4e1f7.png

将上面的处理流程总结一下:
  • 屏幕每秒刷新60次,也就是帧率为60Hz
  • 在Model中,判断刷新的次数,每60次,也就是间隔1秒,进行一次温度数据的读取,并将读取到的数据进行存储
  • 在Model中,根据存储的数据,取得当前值,以及计算5分钟平均值和15分钟平均值
  • 在Model中,计算完毕,通过ModelListener发出通知,要更新数据
  • 在Presenter中,接收到通知,并调用自己当前关联的View的接口,进行温度值的设置
  • 在View中,进行实际的界面处理。


六、实际效果
编译上述代码,下载到开发板,最终的效果如下:

七、参考资料
在研究学习过程中,参考了很多资料,以下为还记得的部分。
对所有的资料,特此表示感谢:
  • STTS22H 精度为0.5°C的低压、超低功耗I2C/SMBus 3.0温度传感器
  • C++ vector计算数组之和
  • C++ vector 容器浅析
  • C++浮点数组(vector, valarray)的二进制存取/读写
  • 【STM32H750B-DK评测】6.传感器数据读取及TouchGFX界面显示实战
  • TouchGFX后端通信
  • TouchGFX之文本和字体
  • 测评汇总:STM32U599J-DK
  • TouchGFX: 第二部分–TextArea外观和通配符

使用特权

评论回复
药无尘| | 2024-2-29 11:12 | 显示全部楼层
这个板子好漂亮,楼主也好厉害,实现的效果真棒

使用特权

评论回复
HonestQiao|  楼主 | 2024-2-29 14:05 | 显示全部楼层
药无尘 发表于 2024-2-29 11:12
这个板子好漂亮,楼主也好厉害,实现的效果真棒

好板子+用心设计=好效果

使用特权

评论回复
ClarkLLOTP| | 2024-2-29 16:51 | 显示全部楼层
这个圆形屏幕真的很不错

使用特权

评论回复
问天少年| | 2024-2-29 16:57 | 显示全部楼层
板子太漂亮了,好想拥有一块

使用特权

评论回复
trucyw| | 2024-2-29 18:45 | 显示全部楼层
板子太漂亮了,好想拥有一块,@ST 是不是每人实现一下

使用特权

评论回复
好贴,点赞

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

86

帖子

2

粉丝