本帖最后由 lansebuluo 于 2022-10-22 10:14 编辑
分布式温湿度采集系统
一、简介
在我的成长过程中,从没有网络到网络遍布各个角落,也就这二十几年时间,科技的快速发展,给我们的生活带来了极大的便利。在一个网络互联的时代,多少要感受、融入和利用网络带给我们的便利,这次就是为了更进距离的接触网络,才有了这个项目-分布式温湿度数据采集系统。作为一个集控系统通过WIFI网络和广域网,把散落在各个位置的温湿度数据信息采集到系统内,并保存;可通过集控系统设置每个点位的温湿度报警值,当采样数据超过设定限值时,在采样点进行灯光或声音报警。当需要查看数据时,可以通过网络,连接集控系统,调取当前数据,可回看历史数据。
集控系统采用了STM32H745I-DISCO开发板+HLK-W800-KIT的WIFI模块,不要小看这个WIFI模块,这也是一个开发板,不是作为数据透传功能使用的。
主要特点:
1、温湿度无线采集点(仅需5V供电)
2、MQTT传输,收集数据配置采样点
3、独立集控系统STM32H745I-DISCO
4、数据保存及历史数据查看
5、上位机软件连接集控系统
6、web配置WIFI网络
二、系统框图
硬件部分:
1、集控:STM32H745I-DISCO开发板
2、WIFI功能:海凌科HLK-W800-KIT开发板
3、温湿度传感器:SHT20
硬件功能分为两部分:
1、温湿度采样点,使用海凌科HLK-W800-KIT开发板扩展读取温湿度传感器SHT20,IO引脚控制蜂鸣器和LED。
2、集控点,使用STM32H745I-DISCO开发板与海凌科HLK-W800-KIT开发板组成
软件功能框图分为三部分:
1、上位机软件,用于网络连接集控点,读取集控点的数据和配置各个采样点信息。
2、集控点软件,通过MQTT协议,订阅采集点温湿度数据,保存数据。
3、采集点软件,WIFI连接路由器,读取温湿度数据,并发送数据到MQTT服务器。
三、功能说明
STM32H745I-DISCO开发板
STM32H745I-DISCO探索套件是用于STM32H745I MCU的全面演示和开发平台,MCU基于STMicroelectronics的Arm® Cortex®-M7和-M4双核微控制器。板载以太网RJ45接口,扩展4GB eMMC,引脚引出接口STMod+可灵活扩展。
软件设计图如下
在STM32H745I上移植了FreeRTOS实时操作系统作为软件整体运行的调度。FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。
使用LWIP网络协议栈完成与上位机软件的连接。LwIP是轻型IP协议,有无操作系统的支持都可以运行,尤其适合在低端的嵌入式系统中使用,支持ICMP协议、UDP(用户数据报协议)、TCP(传输控制协议)等。
使用FatFs文件系统,这样操作文件一样,操作扩展的eMMC存储器。FatFs 是一个通用的文件系统(FAT/exFAT)模块,适合在小型嵌入式系统中实现FAT文件系统。
编写了UART驱动程序,用于连接无线网络扩展,接收MQTT服务器数据,并发送有效数据到MQTT服务器。
WIFI扩展模块(海凌科HLK-W800-KIT)
联盛德一款WIFI芯片W800开发板,内核为平头哥XT804,工作频率 240MHz,内置 DSP、浮点运算单元与安全引擎,内置 2MB Flash,288KB RAM,内置 UART、GPIO、SPI、SDIO、I2C、I2S、7816、ADC、TouchSensor 等数字接口,功能非常强大,而且价格很低,极具竞争力。
用于连接无线路由器或WIFI热点,实现与广域网的互通,发布和订阅指定MQTT服务端报文。接收MQTT服务端数据,并把数据转换到UART端口,发送给STM32H745I-DISCO开发板;接收UART端数据,并把数据通过广域网发送到MQTT服务端。发送的信息为采样点的温度、湿度限值和使能/禁止报警。
使用FreeRTOS开源实时操作系统作为系统调度,web配网方式连接WIFI无线热点,热点信息保存在内置的FLASH中。
采集点(海凌科HLK-W800-KIT)
用于连接无线路由器或WIFI热点,实现与广域网的互通,发布和订阅指定MQTT服务端报文。接收MQTT服务端数据,读取SHT20传感器温湿度数据,并把数据通过广域网发送到MQTT服务端。接收温度、湿度限值和使能/禁止报警配置信息并保存。
软件设计框图
WIFI连接无线热点,FLASH保存配网信息及温湿度报警信息,I/O控制蜂鸣器及LED,I2C接口读取SHT20温湿度传感器,web配网。
上位机软件
采用了VC++编写的MFC单文档程序,使用socket套接字连接TCP服务器,通过界面设置要连接TCP服务器的IP及端口号。配置采样点的温湿度报警值,读取采集点实时温湿度值,获取历史数据,并通过表格的方式浏览。
四、作品源码
download.eeworld.com.cn/detail/lansebuluo/625223
download.eeworld.com.cn/detail/lansebuluo/625224
download.eeworld.com.cn/detail/lansebuluo/625225
download.eeworld.com.cn/detail/lansebuluo/625226
五、作品功能演示视频
分布式温湿度采集系统-分布式温湿度采集系统-EEWORLD大学堂
六、项目总结
在做这个项目中,应用到的技术包括FreeRTOS实时操作系统、LWIP轻型IP协议栈、MQTT协议、FatFs文件系统、Socket、VC++MFC单文档程序等。尽管这个项目的功能基本完成,毕竟只是抽取业余时间,很多细节还不够完善,大体框架应该不存在问题,这只是一个实践项目,作为学习使用应该还不错。
在看到这个活动前,很多MCU芯片供应不稳定,国产替代之路正快速蔓延,正好看到W800芯片,自己也想往嵌入式系统靠拢,学习一下MQTT编程,因为最近这个比较火。本来自己习惯使用TI的C2000系列芯片,结果没货,只能找了STM32H745I作为代替,刚开始接触,还是花了一些时间,尤其是移植LWIP后,想利用有线网络实现与广域网的连接,LWIP开启DNS功能,不过尝试了很多配置,终究不能与广域网相连,为了项目能够实现功能,最终放弃,改用UART扩展WIFI模块连接广域网,降低一些难度。
刚开始规划这个项目的时候,毕竟不是很熟悉,完全没有考虑到工作量,做起来才知道,各个方面都要学习,包括VC++、LWIP、MQTT、FreeRTOS,经过这个项目后,技术方面应该有了很大提升,非常感谢得捷电子和EEWORLD提供的机会,让我成长很多,同样要感谢杜杜管理员热心督促和鼓励,让我能够更好的把握时间及时完成。
发帖汇总
【2022得捷电子创新设计大赛】物料开箱-STM32H745I-DISCO - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
【2022得捷电子创新设计大赛】分布式温湿度采集系统-简要设计概要 - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
【2022得捷电子创新设计大赛】分布式温湿度采集系统-采集端原理图 - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
【2022得捷电子创新设计大赛】分布式温湿度采集系统-STM32H745I-DISCO基础学习 - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
【分布式温湿度采集系统】+STM32H745I-LWIP程序 - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
【分布式温湿度采集系统】+STM32H745I-FreeRTOS点灯 - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
【分布式温湿度采集系统】+STM32H745I-LWIP调试过程 - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
【分布式温湿度采集系统】+WIFI模块扩展板V2 - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
【分布式温湿度采集系统】+W800WIFI+温湿度传感器 - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
【分布式温湿度采集系统】+温湿度采集模块 - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
【分布式温湿度采集系统】+WIFI数据接收模块 - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
【分布式温湿度采集系统】+MQTT调试 - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
【分布式温湿度采集系统】+MFC软件 - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
【分布式温湿度采集系统】作品提交 - 2022得捷电子创新设计大赛 - 电子工程世界-论坛 (eeworld.com.cn)
七、其他
应用软件:
1、TCP调试及抓包:TCPUDPDbg和IPAnalyse
2、UART和WIFI调试:Upgrade_Tools_V1.4.8
3、STM32开发编译:IAR 9.10.2
4、W800开发编译:CDK 2.12.1
5、上位机软件C++编译:VS2015
附 TCP/IP 通信协议
客户端—向服务器主动发起建立TCP连接。
服务器---监听TCP端口,等待建立TCP连接。
服务器端口:6000
客户端:PC
服务器:开发板
客户端主动发送命令请求,服务器根据收到的内容返回数据。
特殊命令除外。
在TCP协议传输的一帧数据包括三部分内容,通过帧起始的帧长度判断帧数据的结束;这三部分内容分别是帧长度SIZE、命令COMMAND、数据内容DATA,格式定义如下:**********************************************************************
BYTE * 4 + BYTE * 2 + BYTE * 2 + BYTE * (SIZE –4)
帧长度SIZE 事务元标识符 命令 数据内容 DATA
**********************************************************************
COMMAND
|
名称
|
DATA
|
备注
|
1
|
询问设备信息
|
无
|
|
2
|
配置设备信息
|
***
|
|
3
|
读取历史数据
|
***
|
|
4
|
温湿度数据
|
***
|
|
客户端发送帧:
编号
|
名称
|
字节数
|
类型
|
描述
|
1
|
长度
|
4
|
32bit无符号整型
|
4byte长度
|
2
|
事务元标示
|
2
|
16bit无符号整型
|
递增
|
3
|
命令
|
2
|
16bit无符号整型
|
固定值为0x0005
|
4
|
数据
|
0
|
|
|
例: 04 00 00 00 00 00 05 00
服务器返回数据:
编号
|
名称
|
字节数
|
类型
|
描述
|
1
|
长度
|
4
|
32bit无符号整型
|
4byte长度
|
2
|
事务元标示
|
2
|
16bit无符号整型
|
接收值
|
3
|
命令
|
2
|
16bit无符号整型
|
固定值为0x0005
|
4
|
数据
|
4
|
32bit无符号整型
|
设备名称-4个字节
|
5
|
数据
|
4
|
32bit浮点
|
温度最大值
|
6
|
数据
|
4
|
32bit浮点
|
温度最小值
|
7
|
数据
|
4
|
32bit浮点
|
湿度最大值
|
8
|
数据
|
4
|
32bit浮点
|
湿度最小值
|
9
|
数据
|
1
|
8bit无符号整形
|
温度最大值使能
|
10
|
数据
|
1
|
8bit无符号整形
|
温度最小值使能
|
11
|
数据
|
1
|
8bit无符号整形
|
湿度最大值使能
|
12
|
数据
|
1
|
8bit无符号整形
|
湿度最小值使能
|
13
|
数据
|
4
|
32bit无符号整型
|
保存的数据长度
|
14
|
数据
|
-
|
----
|
根据数据长度判断设备个数
|
例:20 00 00 00 02 00 05 00 32 36 33 44 66 66 70 42 33 33 a3 c0 00 00 a1 42 33 33 23 41 01 00 01 00 00 01 00 00
客户端发送帧:
编号
|
名称
|
字节数
|
类型
|
描述
|
1
|
长度
|
4
|
32bit无符号整型
|
不定长度,由组成内容决定长度
|
2
|
事务元标示
|
2
|
16bit无符号整型
|
递增
|
3
|
命令
|
2
|
16bit无符号整型
|
固定值为0x0007
|
4
|
数据
|
4
|
32bit无符号整型
|
设备名称-4个字节
|
5
|
数据
|
4
|
32bit浮点
|
温度最大值
|
6
|
数据
|
4
|
32bit浮点
|
温度最小值
|
7
|
数据
|
4
|
32bit浮点
|
湿度最大值
|
8
|
数据
|
4
|
32bit浮点
|
湿度最小值
|
9
|
数据
|
1
|
8bit无符号整形
|
温度最大值使能
|
10
|
数据
|
1
|
8bit无符号整形
|
温度最小值使能
|
11
|
数据
|
1
|
8bit无符号整形
|
湿度最大值使能
|
12
|
数据
|
1
|
8bit无符号整形
|
湿度最小值使能
|
13
|
数据
|
4
|
32bit无符号整型
|
保存的数据长度
|
14
|
数据
|
-
|
----
|
根据数据长度判断设备个数
|
例:20 00 00 00 00 00 07 00 32 36 33 44 66 66 70 42 33 33 a3 c0 00 00 a1 42 33 33 23 41 01 00 01 00 00 01 00 00
服务器返回:
编号
|
名称
|
字节数
|
类型
|
描述
|
1
|
长度
|
4
|
32bit无符号整型
|
4byte长度
|
2
|
事务元标示
|
2
|
16bit无符号整型
|
接收值
|
3
|
命令
|
2
|
16bit无符号整型
|
固定值为0x0007
|
4
|
数据
|
0
|
|
|
例:04 00 00 00 09 00 07
服务器发送帧:
编号
|
名称
|
字节数
|
类型
|
描述
|
1
|
长度
|
4
|
32bit无符号整型
|
不定长度,由内容决定长度
|
2
|
事务元标示
|
2
|
16bit无符号整型
|
0x0000
|
3
|
命令
|
2
|
16bit无符号整型
|
固定值为0x0008
|
4
|
数据
|
4
|
32bit无符号整型
|
名称标号-4个字节
|
5
|
|
4
|
32bit无符号整型
|
数据更新序号
|
6
|
|
2
|
16bit有符号整型
|
温度
|
7
|
|
2
|
16bit无符号整型
|
湿度
|
8
|
|
2
|
---------
|
根据数据长度,判断数据个数
|
例:10 00 00 00 09 00 08 00 32 36 33 44 01 00 00 00 ff 00 30 00
客户端发送帧:
编号
|
名称
|
字节数
|
类型
|
描述
|
1
|
长度
|
4
|
32bit无符号整型
|
不定长度,由内容决定长度
|
2
|
事务元标示
|
2
|
16bit无符号整型
|
递增
|
3
|
命令
|
2
|
16bit无符号整型
|
固定值为0x0009
|
4
|
数据
|
4
|
32bit无符号整型
|
设备名称-4个字节
|
例:08 00 00 00 05 00 09 00 32 36 33 44
服务器返回:
编号
|
名称
|
字节数
|
类型
|
描述
|
1
|
长度
|
4
|
32bit无符号整型
|
4byte长度
|
2
|
事务元标示
|
2
|
16bit无符号整型
|
接收值
|
3
|
命令
|
2
|
16bit无符号整型
|
固定值为0x0009
|
4
|
数据
|
4
|
32bit无符号整型
|
历史数据长度
|
例:08 00 00 00 03 00 09 00 00 01 00 00
服务器发送帧:
编号
|
名称
|
字节数
|
类型
|
描述
|
1
|
长度
|
4
|
32bit无符号整型
|
4byte长度
|
2
|
事务元标示
|
2
|
16bit无符号整型
|
递增
|
3
|
命令
|
2
|
16bit无符号整型
|
固定值为0x000A
|
4
|
数据
|
2
|
16bit无符号整型
|
保留1
|
5
|
数据
|
1
|
8bit无符号整型
|
保留2
|
6
|
数据
|
1
|
8bit无符号整型
|
保留3
|
7
|
数据
|
2
|
16bit有符号整型
|
温度
|
8
|
数据
|
2
|
16bit无符号整型
|
湿度
|
9
|
数据
|
-
|
---
|
根据长度判断数据个数
|
例:0C 00 00 00 03 00 0A 00 00 01 00 00 FE 00 20 00
附件
|