温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
基于
Arduino
智能
温湿度
设计
杨力
|35智能应用0 引言时代不断发展,人们对环境质量的要求越来越高,对便携式环境监测设备的需求变大,传统的温湿度计仅可以显示温度湿度时间等。嵌入式技术不断发展,家居也越来越智能化。本文设计了一款基于 Arduino 的智能化的温湿度监测系统,可以实时显示温湿度信息在 LCD 液晶屏上,还可以通过无线通信模块将信息发送给手机 APP,方便人们远程查看温湿度信息。整个系统具有功耗低、精度高、可靠性强等优点,极大地便利了人们的生活。1 系统方案设计 1.1 整体方案设计总体设计方案包括:微处理器、显示模块、温湿度传感器和无线通信模块1。系统框图如图 1 所示。温湿度传感器微处理器无线模块显示模块手机APP 图 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.35V,采用 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 所示。GNDVCC1DAT2GND3U4温湿度R14.7KVCCD0D1D2D3D4D5D6D7D8D9D10D11D12D13GNDA5A4A3A2A1A0AREFRESETIOREFIOREF3V3VINARDUINOMISOSCKMOSID1/TX5VAD7AD8AD9AD10AD11AD12 图 2 Arduino 连接示意图基于 Arduino 的智能温湿度计设计杨力,孟令亚(盐城三新供电服务有限公司,江苏盐城,224600)摘要:本文设计了一款基于Arduino微处理器的智能温湿度计,能够实时监测当前环境的温度湿度并通过LCD液晶显示,并经WiFi模块发送到手机APP端接收。解决了传统温湿度计的不足之处。系统主要包括Arduino微处理器、温湿度传感器、显示模块、WiFi模块等,使用C语言开发。经测试,系统可以很好地实现温湿度监测、液晶显示与无线传输功能,运行稳定,适用于多种场景。关键词:Arduino;传感器;环境监测DOI:10.16589/11-3571/tn.2023.05.01736|电子制作 2023 年 3 月智能应用VCC1DAT2GND3U4温湿度R14.7KD13D12D11D10D9D8D7D6D5D4D3D2D1/TXD0/RXGNDA5A4A3A2A1A0AREFRESETIOREFIOREF3V3VINWIFIDUINOVCC 图 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。2.3 DHT11 温湿度传感器模块DHT11 温湿度传感器封装后实物示意图和引脚功能说明如图 5 所示。VDDAD12AD11AD10AD9AD8AD7VDDVSS1AO3RS4RW5E6D07D18D29D310D411D512D613D714A15K16VDD2LCD1602PR1103 1:VDD,供电,3.35V2:DATA,串行数据3:NC,空脚4:GND,接地12mm15.5mm8mm2.54mm图 4 LCD1602 原理图 图 5 DHT11 实物示意图电路连接示意图如图 6 所示。VDDR14.7KVCC1DAT2NC3GND4DHT11WD1AD4 图 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 温湿度传感器的数据,同时发送给手机 APP3。3.2 主函数设计3.2.1 主函数流程图主函数流程图如图 7 所示。开始初始化温湿度采集数据正常LCD显示APP收发YN 图 7 主函数流程图|37智能应用3.2.2 核心代码及分析#include LiquidCrystal lcd(12,11,10,9,8,7);#include#define DHT11_PIN 4#include Serial.begin(115200);Serial.print(DHT.humidity,1);Serial.print(t);Serial.println(DHT.temperature,1);程序分析:首先引入 liquidcrystal 和 dht 的库函数,定义连接Arduino开发板上的引脚编号为12、11、10、9、8、7。引入 DHT11 和 BLINKER 库函数,定义 DHT11 的 DATA数据线连接 WiFiduino 的引脚编号设置波特率为 115200,如果波特率设置错误,会导致 COM6 端口监视器出现 humi和 temp 显示的乱码错误,在串口通过 print 语句输出湿度数据和温度数据。lcd.setCursor(0,0);lcd.print(Humi(%);lcd.setCursor(0,1);lcd.print(Temp(C);BLINKER_LOG3(Humidity:,h,%);BLINKER_LOG3(Temperature:,t,*C);Blinker.print(Humi(%),h);delay(1000);Blinker.print(Temp(C),t);delay(1000);Blinker.delay(5000);程序分析:在 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 模块核心代码及分析#include dht11.hint dht11:read(int pin)uint8_t bits5;uint8_t cnt=7;uint8_t idx=0;for(int i=0;i 5;i+)bitsi=0;pinMode(pin,OUTPUT);digitalWrite(pin,LOW);delay(18);digitalWrite(pin,HIGH);delayMicroseconds(40);pinMode(pin,INPUT);unsigned int loopCnt=10000;while(digitalRead(pin)=LOW)if(loopCnt-=0)return DHTLIB_ERROR_TIMEOUT;loopCnt=10000;while(digitalRead(pin)=HIGH)if(loopCnt-=0)return DHTLIB_ERROR_TIMEOUT;for(int i=0;i40;i+)humidity =bits0;temperature=bits2;uint8_t sum=bits0+bits2;if(bits4!=sum)return DHTLIB_ERROR_CHECKSUM;return DHTLIB_OK;程序分析:设置数据缓冲区,定义 5 个八位的数组 40位数据,用来存储数据采集的结果。cnt 给每一个数据的每一位输入值时计数用。idx 给 5 个数组计数用。清空数据缓冲区,首先把 5 个八位的数组全部填 0,也就是初始值为 0。将引脚定义为输出,由 Arduino 给 DHT11写数据。启动 DHT11 先发送 18ms 的低电平,再发送 2040s 的高电平4,收到这样的电平信号,引脚定义为输入引脚,传感器开始采集数据。接收数据先要读取 80s 的低电平信号,要设置一个超时程序,若超过了等待时长,返回一个异常信息。在 80s 的低电平信号之后是 80s 的高电平信号,也要设置一个超时程序。设置 for 循环来读取 40 位的数据。对于每一位数据,都是由一个低电平和一个高电平组成,区分这该位数据是 1 还是 0 取决于高电平的时常,如果高电平的时常为 70s 则表示 1,如果高电平的时常为2628s 则表示 0,因此读取每一位数据时,都是先等待至50s 的低电平信号结束,再判断高电平信号的时常,根据这个时常来判断该位数据是 1 还是 0。40 位数据第 1 个 8位是湿度的整数部分,第 3 个 8 位是温度的整数部分,以上两句代码将数据分别放在这两个变量中,再校验数据是否正确5。38|电子制作 2023 年 3 月智能应用 3.4 LiquidCrystal 函数设计如图 9 所示,LiquidCrystal 库函数程序先进行初始化,再定义给用户使用的高