TA的每日心情 | 开心 昨天 08:14 |
---|
签到天数: 332 天 连续签到: 22 天 [LV.8]以坛为家I
|
本帖最后由 eefocus_3914144 于 2024-3-21 22:27 编辑
【工程简介】
STM32H735-DK拥有强大的图形库,开发板上板载了10/100M的网终收发器。使用STMCubeIDE+STM32CubeMAX+TouchGFX可以快速的实现图形化的网络项目。而MQTT则是目前流行的物联网通信协议,使用他可以快速实现物联网。本项目是结合以上的工具来实现的一个智能取暖器的工程。这个工程原来在我的另外的一篇里使用ESP32来实现的工程:【Arrow 有好料】DFR0654智能取暖器之成品篇本工程在他的基础之上添加方便的图形化控制。
【工程实现的硬件】
1、基于ESP32的取暖器
2、STM32H735-DK
【开发用的软件】
STMCubeIDE+STM32CubeMAX+TouchGFX+Lwip
【项目思维图】
取暖器的流程图,可以移步到ESP32的智能取暖器的工程查阅。
【实现步骤】
1、移植TouchGFX,这个步骤在前面的试用帖:【STM32H735-DK 测评】TouchGFx控制LED亮灭及图标切换 - 板卡试用已经详细介绍过了。
2、创建控制界面。
1)新建一个屏,用于取暖器的控制,放于两个text控件,一个用于显示实时温度,另一个用于显示设置的目标温度。
放置一个slider控制,用于设节设置的温度值。放置一个toggle button控件,用于开关取暖器。如下图所示。
2)设置Text Area个控件的属性值,如下图所示。
3)设置slider的属性,设置最大最小值,我这里设置值为15-30,因为取暖器的目标植也就这么,设置默认为20。具体见下图。
4)设置各个控件的图标,这里大家可以自由设置,我没有美工支持,比较随便。
5)设置按键、solider的触发函数,一个是开关的函数,一个是设置温度的函数。
6)同时创建一个返回的按键,方便屏幕的切换。
【代码实验】
1、首先是TouchGFX的代码实现,我们遵循Model_Pesenter_View的方式来实现。使用TouchGFX Desiger生成代码后,使用stm32CubeIde打开工程。
添加按键以及温度的设置的功能函数,是view-persenter-model的函数的添加。
1)打开屏函数heatContrlView.hpp,添加代码如下:
- <font size="4">virtual void funSetValue(int value);
- virtual void funOpenClose();</font>
复制代码 这一步是声明两个虚拟函数。
在heatContrlView.cpp中实现它,代码如下:
- <font size="4">
- void heatContrlView::funSetValue(int value)
- {
- Unicode::snprintf(textTempSetValueBuffer, TEXTTEMVALUE_SIZE, "%d", value);
- textTempSetValue.invalidate();
- presenter->setHeartexpectation(value);
- }
- void heatContrlView::funOpenClose()
- {
- presenter->setHeartOnOff(butHeartSwitch.getState());
- }</font>
复制代码 2)在heatContrlPresenter.hpp中添加代码如下:
- <font size="4">void setHeartexpectation(int value);//设置目标温度
- void setHeartOnOff(bool state); //开关</font>
复制代码 在heatContrlPresenter.cpp中,添回代码如下,它就是把参数传递给Model。
- <font size="4">void heatContrlPresenter::setHeartexpectation(int value)
- {
- model->setHeartexpectation(value);
- }
- void heatContrlPresenter::setHeartOnOff(bool state)
- {
- model->setHeartOnOff(state);
- }</font>
复制代码 3)在Mode.hpp中添加实现对网络的具体实现:
- <font size="4">void Model::setHeartexpectation(int value)
- {
- pub_setValue(value);
- }
- void Model::setHeartOnOff(bool state)
- {
- pub_setonoff(state);
- }</font>
复制代码 到此由屏发给下位机的TouchGFX方便的代码就到此,接下来实现接收到取暖器发送过来的温度值由TouchGFX显示到屏上来。
4)在model.cpp中我们声明由C传过来的两个参数,一个是温度值extern float heartValue;,还有一个就是接收的状态extern uint8_t myheartstate;。在头文件我们要先引用bsp_mqtt.h的引用。- <font size="4">#include <stdio.h>
- extern "C" {
- #include "bsp_mqtt.h"
- }</font>
复制代码 在tick函数中,我们判断是否接收到了更新,如果接收到了,把参数传给presenter,再由present发送给view来展示实时温度值。
首先我们在modellister.hpp实现一个virtual void setHeartValue(float value) {}
我们在model.cpp中实现:
- <font size="4">void Model::tick()
- {
- if(myheartstate == 1)
- {
- modelListener->setHeartValue(heartValue);
- myheartstate = 0;
- }
- }</font>
复制代码 把参数传递给persenter后,把接收状态清零。
在heatContrelPresenter.cpp中我们把参数传递给view,当然要在heatContrelPresenter.hpp中声明一下。
- <font size="4">void heatContrlPresenter::setHeartValue(float value)
- {
- view.setHeartValue(value);
- }</font>
复制代码 最后我们在heatContrlView.cpp
- <font size="4">void heatContrlView::setHeartValue(float value)
- {
- Unicode::snprintfFloat(textTemValueBuffer, TEXTTEMPSETVALUE_SIZE, "%.1f", value); //更新温度值
- textTemValue.invalidate(); //刷新
- }</font>
复制代码 到次,我们的TouchGFX的代码就实现完比,代码我会附在后面,如果有兴趣可以下载下来交流学习。
3、在bsp_mqtt的代码中,我这里基于【STM32H735-DK 测评】基于lwip的mqtt移植这篇的基础上修改(如果从头来写,太长了)。
在mqtt的处理中,我们在mqtt接收的回调函数mqtt_rec_data_process中实现对接收到的温度值的json进行解析,中间我们要移植cJSON库,移植非常简单,大家就把cJSON源码下载下来,放到User/Core目录下面的src下面就行了。具体教程,在本章不做多介绍。在回调函数中,我们先对接收到的数据进行解析,如果解析错误,直接清空buff,如果解板到温度值,测把他存入变量中,同时更新状态值,以便TouchGFX的取走。代码如下:
- <font size="4">__weak int mqtt_rec_data_process(void* arg, char *rec_buf, uint64_t buf_len)
- {
- cJSON *json;
- printf("recv_buffer = %s\n", rec_buf);
- json = cJSON_Parse(rec_buf);//进行json解析
- if(json == NULL)
- {
- printf("json fmt error:%s\r\n.", cJSON_GetErrorPtr());
- }
- else
- {
- cJSON *Temper = cJSON_GetObjectItem(json, "Temperature"); //获取温度值
- if (!Temper) {
- printf("no Temperature!\n");
- } else{
- heartValue = strtod(Temper->valuestring,NULL); //更新温度值
- printf("value:%.1f\n",heartSetValue);
- myheartstate = 1; //更新状态
- }
- cJSON_Delete(json);
- }
- return 0;
- }</font>
复制代码 接下来是创建两个mqtt的发布命令的函数
- <font size="4">void user_pub_set(int setValue )
- {
- char sen_buff[4] = {0};
- sprintf(sen_buff,"%d",setValue);//将温度设置值格式为字符串
- bsp_mqtt_publish(s__mqtt_client_instance,"/lugl/hearset",sen_buff,2,1,0); //发布
- osDelay(100);
- }</font>
复制代码
- <font size="4">void user_pub_onoff(int setValue )
- {
- if(setValue == 1)
- {
- bsp_mqtt_publish(s__mqtt_client_instance,"/lugl/heartonoff","on",2,1,0); //如果是开则发布on
- }
- else
- {
- bsp_mqtt_publish(s__mqtt_client_instance,"/lugl/heartonoff","off",3,1,0); //如果是关则发布off
- }
- }</font>
复制代码 同时我们把两个发布命令声明到.h文件中,方便TouchGFX调用。
到些,我们的所有工程都编写完毕,我们下载到开发板中,使用MQTT进行调试。
这是接收到数据用开发板的打印信息(注:由于TouchGFX点用了usart3,所以不能使用stlink的虚拟串口打印了,要使用扩展接口的uart7进行打印)。
使用MQTT调试助手进行调试:
【评测体验】
这个工程可以说是一个大工程,从工程设计、调试,花了差不多一个星期的时间,涉及到前后端、mqtt服务器等等,需要有很强的综合能力。我也是建立在前期的基础之上来增加工程,也花了半个月的时间。总的来说STM32H735-DK这块开发板的开发环境非常友好。查找资料也比较方便。但是一模一样的东西是没有的,大多是查找STM32H743的工程资料,通过自己的修改来实现自己特有的功能,在STM32H735这个版上实现Lwip+mqtt目前还没有找到一样的工程资料。附工程源码网盘连接:链接:https://pan.baidu.com/s/1cQpPKi-HAXmfkEicnRFKYg?pwd=1ah7 提取码:1ah7
--来自百度网盘超级会员V6的分享
【附工程视频介绍】
|
|