摘 要:基于ESP32为主芯片设计环境监测系统,获取环境中的温湿度、光照强度、气压、海拔、紫外线强度、烟雾浓度、二氧化碳含量、甲醛含量、TVOC含量、PM2.5含量等一系列环境信息以及实时时钟信息,通过LED灯、OLED屏实现环境信息的状态显示和信息值的屏幕显示,基于语音合成模块实现环境信息的语音播报,通过RS 232串口、串口转USB、以太网、WiFi、蓝牙等多种接口将环境信息报送至上位机,通过多种接口或调试指令对ESP32的工作状态进行管理。详细介绍了该系统的整体设计、硬件设计、软件设计。通过联调演示,证明该系统各项功能正常、运行稳定,可用于办公室、农业大棚、储物仓库等场景的环境监测,也为同类方案或产品提供参考和借鉴。
关键词:ESP32;传感器;环境监测;屏幕显示;语音播报;上位机
中图分类号:TP29 文献标识码:A 文章编号:2095-1302(2024)05-00-04
0 引 言
ESP32是乐鑫信息科技提供的微控制器(Micro Control Unit, MCU)芯片,采用两个哈佛结构Xtensa LX6 CPU构成双核系统,片上集成通用型输入输出(General Purpose Input/Output, GPIO)、通用异步收发传输器(Universal Asynchronous Reveiver Transmitter, UART)、集成电路总线(Inter Integrated Circuit, I2C)、串行外设接口(Serial Peripheral Interface, SPI)、模数转换(Analog to Digital Convert, ADC)等控制器以及WiFi收发器和蓝牙收发器,兼具功能强大、性能稳定、体积精巧、价格低廉的优势[1]。本文将ESP32作为主芯片,结合一系列外部器件,设计一套环境监测系统,监测环境中的多项参数,可用于办公室内、农业大棚、储物仓库等场景的环境监测,也为同类方案或产品提供参考和借鉴[2-4]。
1 系统整体设计
整个环境监测系统由供电模块、主芯片、采集模块、状态显示模块、状态上报接口、上位机组成[5-6],如图1所示。
供电模块负责提供主芯片及各种外围设备工作所需的电压。ESP32作为主芯片,片内充分利用处理器核、各种控制器、WiFi及蓝牙收发器等资源,对外则驱动各种外围设备。采集模块包括AHT20温湿度传感器、BH1750光照强度传感器、BMP180气压海拔传感器、S12SD紫外线强度传感器、MQ-2烟雾浓度传感器、JW01模组二氧化碳甲醛总挥发性有机化合物(Total Volatile Organic Compounds, TVOC)含量三合一传感器、ZPH02模组PM2.5含量传感器等传感器模块,以及PCF8563实时时钟、AT24C256存储芯片、4路输入按键。状态显示模块包括绿、黄、红状态显示LED灯,有源蜂鸣器,SSD1306-OLED显示屏。状态上报接口包括RS 232串口接口、串口转USB接口、基于W5500实现的RJ 45以太网接口、基于SYN6658语音合成模块实现的LINE音频线接口和语音播报喇叭,以及ESP32提供的WiFi和蓝牙接口。上位机可以是串口、网口、USB接口的PC,也可以是WiFi和蓝牙接口的手机等无线设备。ESP32的上报接口同时提供CS(客户端-服务器)和BS(浏览器-服务器)服务,上位机可以使用按协议设计的终端软件,或者使用网页浏览器,来访问ESP32的状态信息或对ESP32的工作状态进行管理。
2 硬件设计
基于ESP32芯片模组与各外围设备器件设计硬件平台,各模块的内部电路硬件均稳定,需要着重注意搭建时的硬件连接关系[7]。ESP32与各外围设备的连接关系如图2所示。
供电设计:调试阶段可以使用MINI-USB接口为ESP32供电,MINI-USB联合ESP32的电压输出管脚为采集模块、状态显示模块、状态上报接口的各器件供电,调试完成后使用可充电锂电池为主芯片和各外围设备供电。
GPIO接口的外设:选用ESP32的4路IO实现数字输入功能,外接输入按键。选用ESP32的4路IO实现数字输出功能,分别接绿色、黄色、红色的LED灯和有源蜂鸣器。
ADC接口的外设:选用ESP32的2路IO实现ADC模拟输入功能,分别外接S12SD紫外线强度传感器、MQ-2烟雾浓度传感器。ESP32以模拟量读取ADC管脚的值,当管脚上的电压为3.3 V时,读值4095为最大值,当管脚上电压为0 V时,读值0为最小值,中间区域可作线性比例处理,从而获取S12SD的紫外线强度和MQ-2的烟雾浓度。
I2C接口的外设:选用ESP32的2路IO管脚实现I2C总线,ESP32作为主机发出I2C时序控制一系列不同从机地址的I2C外围设备,从而读取AHT20的温湿度信息、BH1750的光照强度信息、BMP180的气压信息,进一步计算出海拔信息,控制OLED显示屏动态显示各状态信息,读取或设置PCF8563的实时时间信息,访问AT24C256存取工作参数。
UART接口的外设:ESP32片上有三个串口控制器(Serial0、Serial1、Serial2),通信波特率都配置为9 600 b/s,8位数据位,1位停止位,无校验位。Serial0的输出实现调试打印功能,便于调试观测代码流程,Serial0的输入实现调试命令解析功能,解析出正确的指令后可以设置PCF8563的时间、设置ESP32的工作参数并存入AT24C256。Serial1、Serial2的RX线分别接JW01模组、ZPH02模组,这两个模组正常工作时,会将获取的环境信息按协议格式以串口格式的包发出,每包定常为8字节,且包头有固定的标识,包尾有校验值。ESP32收到模组的串口包后,基于状态机即可解析出包中间的字节从而获取环境信息。Serial1的TX线分成两路,一路接串口转USB器件,一路接TTL电平转RS 232电平器件,分别对PC提供USB接口和RS 232接口的串口上报接口。Serial2的TX线接到SYN6658语音合成模块,ESP32遵照协议通过串口向SYN6658发送待合成的文字信息,文字信息由固定的汉字编码加变化的环境信息值合并而成,SYN6658实现文字转语音的合成功能,输出语音信息到LINE音频线,LINE线可以进一步接音响或耳机,同时SYN6658通过所接的喇叭播报语音。
SPI接口的外设:选用ESP32的4路IO管脚实现SPI总线,通过SPI时序控制W5500模块,W5500内部硬件集成TCP/IP协议栈,W5500模块对外提供RJ 45以太网接口[8]。W5500提供了套接字编程接口,支持TCP和UDP协议。ESP32对W5500进行UDP编程,从而对上位机提供CS服务,ESP32对W5500进行TCP编程,实现HTTP服务功能,从而对上位机提供BS服务。
WiFi接口: ESP32运行片上WiFi的AP基站功能,ESP32的WiFi具备无线局域网(Wireless Local Area Networks, WLAN)网卡属性且运行dhcpd服务程序。手机等无线设备通过WLAN接入ESP32后,ESP32为无线设备分配WLAN同网段的IP地址,在此基础上ESP32与无线设备基于TCP/IP协议互联,两者能通过UDP和TCP协议进行网口套接字通信。
蓝牙接口:ESP32可以将片上蓝牙功能虚拟化为串口,手机等无线设备的蓝牙也使用串口模式,ESP32与无线设备基于蓝牙虚拟串口进行串口通信。
3 软件设计
使用Arduino工具对ESP32进行软件开发和烧写,Arduino工具通过导入芯片包实现ESP32的底层驱动功能,用户只需调用驱动层的接口函数,即可进行业务功能的应用层开发。Arduino工具提供程序框架,提供初始调用一次的setup函数和随后轮询调度的loop函数供用户填充,用户需在setup函数里填充初始化功能,在loop函数里填充需运行的业务功能[9]。
在setup函数里,需要执行的操作如图3所示。首先初始化调试串口,然后依次初始化各类通信总线,以及对总线上所接的传感器外设进行初始化[10]。还需从AT24C256读取工作参数,例如访问外设的时间间隔,默认100 ms,以及环境信息的告警阈值,例如温度的告警上下限、二氧化碳含量的告警上下限等。初始化W5500后,配置以太网口的UDP和TCP套接字;初始化WiFi后,配置WLAN网口的UDP和TCP套接字;初始化蓝牙后,配置蓝牙虚拟串口。
在loop函数里执行业务流程如图4所示。首先从各个传感器读取环境信息和时间信息,对于I2C接口的传感器,读写交互后,从外设寄存器获取信息;对于ADC接口的传感器,读ADC功能管脚的模拟值获取信息;对于UART接口的传感器,接收串口字节后基于状态机解析后获取信息。新读的值与最近5次历史值整合计算平均值,作为当前有效值,用结构体变量存储。然后使用OLED显示屏显示环境信息,因OLED屏幕大小有限,每轮loop函数只显示所有环境信息的其中几条。同时通过LED灯显示环境状态,若环境状态值均正常,则绿灯亮;如果环境状态值稍微超出正常范围,则黄灯亮;如果环境状态值严重超出正常范围,则红灯亮,且蜂鸣器响,提醒人采取相应措施,例如通过通风降低二氧化碳含量。此外,如果检测到按键有按下动作时,经软件防抖处理后,运行相应的功能,按键1对应功能为语音播报时间信息,按键2对应功能为语音播报环境信息。再者,基于状态机解析蓝牙串口收到的字节,解析出命令包,基于套接字检测是否收到WiFi或以太网口的UDP命令包,如果是查询命令,则将环境信息结构体变量中的值按协议返回;如果是配置命令,则修改工作状态;如果是HTTP的GET请求,则返回Web页面的应答。之后,将本轮环境值通过串口报送给上位机。最后,判断是否需执行Serial0调试命令,之后进行延时等待,退出本轮loop函数,进入下一轮loop函数。
参考Linux系统的shell命令行,对Serial0的输入指令进行功能解析,当输入的指令满足一定格式时,则执行相应功能。例如“SETTIME:2023-04-10 10:53:00”是设置时间,“SETTEMPU:60”是设置温度告警上限。
为了通过上位机对环境监测系统的状态进行显示和控制,可以在上位机开发终端软件,使用软件控件调用操作系统的API,基于串口或网口编程与ESP32通信,也可以不用终端软件而直接使用网页浏览器访问ESP32。
4 联调演示
基于ESP32芯片模组与各外围设备器件实现演示板,按硬件设计连接各信号线,制作完整的演示板如图5所示。
ESP32程序正常启动运行后,LED状态灯显示正常,OLED屏翻页逐条显示各项环境信息的值,如图6所示。
PC通过以太网口接入演示板,运行PC上设计的终端软件,能更新显示环境信息,且能对ESP32的工作状态进行配置。在PC浏览器输入ESP32的以太网IP地址,ESP32会返回环境信息。手机上能搜到并接入ESP32的WiFi信号,在手机浏览器输入ESP32的WLAN的IP地址,ESP32会返回环境信息。上位机通过浏览器访问ESP32的界面如图7所示。
按下演示板上的按键1,喇叭会播报时间信息。按下演示板上的按键2,喇叭会播报环境信息。在调试串口输入设置时间、设置工作参数等命令,演示板均有正常响应。
调整演示板所处环境的温度、光照等状态,演示板上显示和上报的环境信息会随之变化,且与温度计等仪器测得的值接近一致,可见本系统各项功能均正常,且运行稳定。
5 结 语
本文设计了基于ESP32的环境监测系统,完成了多项环境信息的采集、多种方式的显示、多种接口的上报,可用于办公室内、农业大棚、储物仓库等场景的环境监测,也为同类方案或产品提供参考和借鉴。
本系统还可优化调整,例如,为了节省功耗,也许并不需要多个传感器同时工作,也不需要多种上报接口同时工作,可以在硬件上添加使能设计,在软件上规划ESP32的工作参数,做合理调度;在运行过程中,按需动态地使能访问各外围设备。
参考文献
[1]王忠. ESP32在物联网通信课程教学中的应用[J].物联网技术,2022,12(4):128-129.
[2]何经伟.基于ESP32的办公环境信息监测系统[J].电子技术与软件工程,2019,8(24):153-154.
[3]孔宁.基于ESP32的畜场环境监测系统设计与实现[J].现代牧业,2022,6(4):37-43.
[4]陈星星.基于ESP32的粮仓远程温湿度监控系统[J].电子技术与软件工程,2018,7(14):94.
[5]肖鑫海.基于STM32的环境监测系统设计[J].化工自动化及仪表,2023,50(1):33-36.
[6]夏长权.基于STM32的环境监测系统设计[J].电子制作,2023,31(4):3-7.
[7]任肖丽.基于STM32的环境监测系统设计[J].集成电路应用,2021,38(8):14-15.
[8]王鹏.基于W5500以太网模块的温湿度实时在线采集系统设计[J].通讯世界,2020,27(3):67-68.
[9]谢明玮.基于Arduino的物联网家居硬件系统设计与实现[J].物联网技术,2023,13(2):78-81.
[10]乐万德. Arduino串口通信控制系统的研究[J].电子设计工程,2022,30(4):69-73.
作者简介:张来洪(1989-),男,硕士,中级工程师, 研究方向为嵌入式技术、电台主控及波形。
关海伟(1989-),男,硕士,中级工程师, 研究方向为嵌入式技术、电台主控及波形。
鲁 兴(1992-),男,博士,中级工程师, 研究方向为嵌入式技术、通信技术。
张 扬(1993-),男,硕士,中级工程师, 研究方向为嵌入式技术、上位机软件设计。
收稿日期:2023-05-07 修回日期:2023-06-05