杨力,孟令亚

(盐城三新供电服务有限公司,江苏盐城,224600)

0 引言

时代不断发展,人们对环境质量的要求越来越高,对便携式环境监测设备的需求变大,传统的温湿度计仅可以显示温度湿度时间等。嵌入式技术不断发展,家居也越来越智能化。本文设计了一款基于Arduino的智能化的温湿度监测系统,可以实时显示温湿度信息在LCD液晶屏上,还可以通过无线通信模块将信息发送给手机APP,方便人们远程查看温湿度信息。整个系统具有功耗低、精度高、可靠性强等优点,极大地便利了人们的生活。

1 系统方案设计

1.1 整体方案设计

总体设计方案包括:微处理器、显示模块、温湿度传感器和无线通信模块[1]。

系统框图如图1所示。

图1 系统框图

1.2 各模块方案

1.2.1 微处理器方案选择

采用Arduino微处理器作为MCU。Arduino微处理器价格便宜、性能强大、拓展性好、抗干扰能力强,采用C语言开发。IDE配置简单,无需配置复杂的驱动程序、寄存器与库函数。

1.2.2 显示模块方案选择

LCD1602是一款字符型液晶显示屏,可显示字母数字符号。LCD1602液晶工作温度为0℃~+55℃,工作电压为-4.5~+5.5V,能够同时显示16字符2行的字母或数字。成本低廉,编程容易,符合本设计的需求。

1.2.3 传感器模块方案选择

采用DHT11温湿度传感器作为温湿度采集模块。DHT11温湿度传感器工作电压为3.3~5V,采用4针单排直插的封装工艺,精度在±2℃,量程范围是0℃~50℃。编程简单,成本较低,适合本设计使用。

1.2.4 无线通信模块方案选择

采用ESP8266为核心的开发板WiFiduino进行数据传输。WiFi具有信号强度高、传输距离远、功耗低、安全性极高、性价比高等特点。集成了ESP8266模块的WiFiduino开发板为物联网提供了简单便捷的实现方式,手机端下载WiFiduino官网提供的BLINKER APP。BLINKER是一个物联网接入项目,IOS、安卓、鸿蒙都支持,本地、远程都支持,蓝牙、WiFi都支持。WiFiduino开发板可以实现与DHT11相连接采集温湿度信息,并且发送给手机端的BLINKER,符合本文的环境监测系统的使用场景。

2 电路设计

硬件电路部分包括Arduino微处理器、WiFiduino模块、DHT11温湿度传感器和LCD1602液晶显示模块的电路设计及连接[2]。

2.1 电路连接示意图

电路连接示意图如图2和图3所示。

图2 Arduino连接示意图

图3 WiFiduino连接示意图

2.2 LCD1602液晶模块

LCD1602原理图如图4所示。液晶显示屏与Arduino的AD12、AD11、AD10、AD9、AD8、AD7这六个I/O引脚连接,其中AD12、AD11号引脚是控制线,也就是说传输“我要写”之类的握手信号。AD10、AD9、AD8、AD7是数据传输口。LCD的VSS接GND,VDD接5V,AO号接用于调节背光的电阻,RS接Arduino 12号引脚,RW号接GND,E引脚接Arduino 11号引脚,D0,D1,D2,D3不接,D4接Arduino 10号引脚,D5接Arduino 9号引脚,D6接Arduino 8号引脚,D7接Arduino7号引脚,A接5V,K接GND。

图4 LCD1602原理图

2.3 DHT11温湿度传感器模块

DHT11温湿度传感器封装后实物示意图和引脚功能说明如图5所示。

图5 DHT11实物示意图

电路连接示意图如图6所示。

图6 DHT11电路连接示意图

3号引脚悬空不接线,接线时只要将1号引脚接到5V的VDD上,4号引脚接到Arduino GND上,2号引脚引脚接Arduino的AD4引脚,接WiFiduino的WD1引脚。

DATA引脚需要接出一个5kΩ的上拉电阻。因为单片机在复位以后,I/O引脚处于浮空状态,跳变输出高低电平信号,无法正常工作,因此需要一个4.7kΩ左右的电阻将电位钳制在高电平,又不影响电平信号的正常输出,用以保证数据的正确传输。

3 程序设计

3.1 程序设计目标

通过调用DHT11的库函数,实现DHT11的温湿度采集和发送给Arduino主控制器功能。给Arduino编写主函数,实现从DHT11接收温湿度数据,让数据发送给LCD1602液晶屏显示的功能。对WiFiduino模块进行编程,接收DHT11温湿度传感器的数据,同时发送给手机APP[3]。

3.2 主函数设计

3.2.1 主函数流程图

主函数流程图如图7所示。

图7 主函数流程图

3.2.2 核心代码及分析

程序分析:首先引入liquidcrystal和dht的库函数,定义连接Arduino开发板上的引脚编号为12、11、10、9、8、7。引入DHT11和BLINKER库函数,定义DHT11的DATA数据线连接WiFiduino的引脚编号设置波特率为115200,如果波特率设置错误,会导致COM6端口监视器出现humi和temp显示的乱码错误,在串口通过print语句输出湿度数据和温度数据。

程序分析:在lcd第一行显示"Humidity(%)",第二行显示"Temperature(C)"这里的lcd.setCursor的功能是将光标移动到指定位置。BLINKER_LOG语句为开启调试输出(Debug) 后可以使用BLINKER_LOG()打印输出调试信息,这里是为了显示出湿度信息h,和温度信息t。在Blinker.print这条语句中,如果基于MQTT协议传输时,中间的dealy必须大于1000ms否则会发生只显示第一条语句的错误,然后系统delay 5000ms,也就是每5s向APP发送一次温度湿度信息。

3.3 DHT11函数设计

3.3.1 DHT11函数流程图

DHT11函数流程图如图8所示。

图8 DHT11函数流程图

3.3.2 DHT11模块核心代码及分析

程序分析:设置数据缓冲区,定义5个八位的数组40位数据,用来存储数据采集的结果。cnt给每一个数据的每一位输入值时计数用。idx给5个数组计数用。清空数据缓冲区,首先把5个八位的数组全部填0,也就是初始值为0。将引脚定义为输出,由Arduino给DHT11写数据。启动DHT11先发送18ms的低电平,再发送20~40μs的高电平[4],收到这样的电平信号,引脚定义为输入引脚,传感器开始采集数据。接收数据先要读取80μs的低电平信号,要设置一个超时程序,若超过了等待时长,返回一个异常信息。在80μs的低电平信号之后是80μs的高电平信号,也要设置一个超时程序。设置for循环来读取40位的数据。对于每一位数据,都是由一个低电平和一个高电平组成,区分这该位数据是1还是0取决于高电平的时常,如果高电平的时常为70μs则表示1,如果高电平的时常为26~28μs则表示0,因此读取每一位数据时,都是先等待至50μs的低电平信号结束,再判断高电平信号的时常,根据这个时常来判断该位数据是1还是0。40位数据第1个8位是湿度的整数部分,第3个8位是温度的整数部分,以上两句代码将数据分别放在这两个变量中,再校验数据是否正确[5]。

3.4 LiquidCrystal函数设计

如图9所示,LiquidCrystal库函数程序先进行初始化,再定义给用户使用的高级指令,用户使用的指令由子函数COMMOND构成,COMMOND函数由data push子函数构成,最后定义data push底层函数功能。即可实现用户定义指令功能。

图9 LiquidCrystal函数流程图

WiFiduino中定义的高级控制命令如表1所示。

表1

4 调试

DHT11置于面包板上与Arduino连接,WiFiduino接相同电位的三根线相连接,DHT11采集周围环境的温度湿度数据。Arduino和WiFiduino可以同时接收到DHT11采集到的温度和湿度信息,Arduino与LCD1602显示屏相连接,用于显示采集到的温度湿度信息。WiFiduino 是集成了ESP8266 WiFi模块的高度集成的开发板,可以将采集到的温度湿度信息通过WiFi或者MQTT协议来向手机发送温湿度信息,同时在手机端下载BLINKER APP,可以看到温湿度信息,PC端可以通过Arduino或者WiFiduino的串口在PC上显示温湿度信息。

测试结果如图10、图11、图12所示。图10中LCD 1602可以显示当前环境的温湿度,图11为BLINKER APP上显示的由WiFiduino发送的温湿度信息,图12为系统整体照片。

图10 温湿度液晶显示

图11 APP端截图

图12 系统整体图片

5 总结

在本设计实验过程中也遇到了一些问题,比如WiFiduino和BLINKER比较新颖,IDE存在BUG,在使用Arduino IDE过程中,编译WiFi_BUTTON函数时出现了报错,通过联系编译器开发者得以解决。在烧写程序到WiFiduino时会占用引脚,导致下载失败,重新插拔即可下载完成。在连接LCD1602时最好连接一个10kΩ大小的电阻,可以帮助LCD1602调节到合适的对比度,在实验中一开始没有接,导致背光太亮无法观察温湿度。经过测试,本设计电路与软件皆可以正常运行,实现全部预设的功能,且运行稳定、数据精确,后续可以将面包板改进为PCB,将各个模块焊接,有利于批量生产使用。