超简单深度睡眠模式下温湿度信息远程采集的背景相关技术深度睡眠模式下温湿度采集数据收发前端实现后端前端项目背景我用收纳盒做了一个存放打印耗材的干燥箱,想用闲置的开发板和温湿度传感器做一个远程温湿度监控的小项目。
(超简单)ESP8266深度睡眠模式下温湿度信息的远程采集项目背景相关技术ESP8266深度睡眠模式DHT11温湿度采集MQTT数据收发器Node.js前端和后端实现
项目背景:我用收纳盒做了一个存放3D打印耗材的干燥箱,想用闲置的ESP8266开发板和DHT11温湿度传感器做一个远程温湿度监控的小项目。因为温湿度信息的采集不需要太频繁,另一方面为了降低整体功耗,计划使用ESP8266的深度睡眠模式,每半小时或一小时上传一次温湿度信息,这样可以大大降低整个项目的功耗,延长使用时间。
相关技术esp8266深度睡眠模式ESP8266的三种睡眠模式包括调制解调器睡眠、浅睡眠和深度睡眠(详见第四篇+ESP8266睡眠模式)。深度睡眠模式是8266三种主要睡眠模式中功耗最低的。在这种模式下,esp8266的所有应用数据都不会被执行,也就是说8266处于关闭状态,只有在8266的RST引脚接收到低电平信号后,8266才会被唤醒(开启)。这里可以将8266的GPIO16(D0)引脚与RST引脚相连,通过GPIO16引脚向RST引脚发送低电平唤醒8266。Esp8266可以通过调用函数ESP.deepSleep(30e6)进入深度睡眠模式;(单位美制,30e6表示睡眠30秒),深度睡眠模式下最大睡眠时长为4294967295s,约为71分钟。
esp8266进入深度睡眠模式的示例代码如下:
void setup(){ serial . begin(115200);serial . settimeout(2000);//等待串行初始化。而(!Serial) {} //Serial.println("进入深度睡眠模式,睡眠30秒");//esp . deep sleep(30e 6);Serial.println("我马上就要进入深度睡眠模式了,我会一直保持深度睡眠状态,直到RST接收到低电平信号");esp . deep sleep(0);}void loop() {Serial.println("深度睡眠模式下,不会执行循环函数中的代码");}注意:在deepSleep模式下,esp8266只会执行setup函数中deep sleep()函数之前的代码程序,循环中的代码永远不会执行。
DHT11温湿度采集温湿度信息的采集主要由DHT11传感器完成。传感器的数据引脚连接到8266的GPIO4(D2)引脚,利用SimpleDHT库实现温湿度信息的采集。主要代码如下:
void getHumChk(){ int err = SimpleDHTErrSuccess;if ((err = dht11.read(&temp_read,&米虎_read,NULL))!= SimpleDHTErrSuccess){ serial . print(" Read DHT 11失败,err = ");serial . println(err);延时(1500);返回;} Serial.print("哼:");Serial.print(米虎_里德);serial . print(" % ");serial . print(" tem:");serial . print(temp _ read);serial . println(" * C ");} MQTT数据收发项目中的数据收发主要通过部署在阿里云服务器上的MQTT服务器来完成。我的阿里云服务器是windows系统(操作简单,代码可以随时修改运行,主要用来运行其他软件),也可以在自己的电脑上搭建。构建非常简单,具体构建过程可以参考MQTT环境。
MQTT信息收发的测试使用MQTT.fx软件,非常方便。ESP8266开发板通过MQTT发送信息的代码如下:
//发布MQTT信息void pubMQTTmsg(字符串状态){ //建立发布主题。主题名为“topic”String topic = " mymqtt/module 2/LED ";char publish topic[topic . length()+1];strcpy(publishTopic,topic . c _ str());//创建发布信息。String sendMessage = statechar publish msg[sendmessage . length()+1];strcpy(publishMsg,sendmessage . c _ str());//实现8266发布信息if(mqttclient . publish(publish topic,publish msg)){ serial . print(" publish topic:");serial . println(publish topic);Serial.print("发布消息:");serial . println(publish msg);} else { Serial.println("消息发布失败。");}}其他完整代码可点击文末github链接查看。
Node.js前端和后端实现了后端。这次通过Node.js实现上位机和数据显示,后端通过Node.js接收MQTT消息,接收到温湿度消息后,将相关数据存储在阿里云服务器上的MySql数据库中,通过前端网页显示。前端和后端数据的交互通过socket实现。
MySql配置信息如下:
var MySQL = require(" MySQL ")var connection = MySQL . create connection({ host:"你的服务器IP ",user:"用户名",password:"密码",port:"端口,一般是3306 ",database:"数据库名" ,})connection.connect() MQTT配置信息如下。
var MQT URL = " MQTT://server IP:61613 " var option = { username:" MQTT服务器用户名",password: "MQTT服务器密码",clientId:"客户端Id "。}订阅mqtt主题的代码如下:
//subscribed MQTT主题client . subscribe(" mymqtt/module 1/will message ",{qos: 0 }) //设备1状态信息client . subscribe(" mymqtt/module 1/DHT 11 ",{qos: 0 }) //温湿度client . subscribe(" mymqtt/module 1/light ",{QoS:0 })//光照client . subscribe(" mymqtt/module 2/will message ",{ QoS:0 })//状态信息client . subscribe(" mymqtt/module 2/LED ",{ QoS(module2是我的遥控灯项目)
接收MQTT消息和发送前端的部分代码如下:
//监听MQTT消息client.on ("message ",function (topic,message){ if(topic = = " mymqtt/module 1/will message "){ now time = new date()。gettime();t = now time -last time;if(t > 3000){ will message 1 = message . tostring();时间=新日期()。toLocaleString("中文",{ hour 12:false });console.log(时间);console . log(" topic:"+topic+" message:"+will message 1);socket.emit("module1 ",{ msg:will message 1 });socket.emit("time ",{ msg:time });} lasttime = nowtime} else if(topic = = " Mymqtt/module 2/will message "){ will message 2 = message . tostring();console . log(" topic:"+topic+" message:"+will message 2);socket.emit("module2 ",{ msg:will message 2 });} else if(topic = = " Mymqtt/module 1/light "){ light = message . tostring();Console.log("主题:"+主题+"消息:"+灯);socket.emit("light ",{ msg:light });这里使用Nowtime、lasttime和t是因为在接收MQTT消息时有可能同时接收到多条相同的消息,所以3秒内只接收到一条相同主题的消息。
将温度和湿度信息插入数据库的代码如下:
//将温湿度信息插入数据库;var JSON = JSON . parse(message . tostring());var addDht11 = "INSERT INTO dht11(温度、湿度)值(?,?)";var temperature = parse int(JSON . temperature);var湿度= parse int(JSON . weather);var addSqlParams =[温度,湿度];connection.query(addDht11,addSqlParams,function (err,result){ if(err){ console . log("[INSERT ERROR]-",err . message);返回;} console.log("插入成功");});关于其他完整的代码,请参见文章末尾的链接。
前端前端效果如图:页面上可以显示设备的状态,即“离线”或“在线”,也可以显示设备最后一次离线的时间。下面你可以显示传感器上报的最新温湿度信息,图表显示最近10次的温湿度信息,有新信息来时会动态更新。
这里的图表使用了ECzharts的图表插件,可以根据数据的变化动态显示曲线,在折线图和条形图之间切换,放大某个区域或者下载当前数据图片。他们的网站上有各种图表插件,可以简单方便地动态显示他们的数据。这是他们的官网-ECharts官网。
注:本项目中,开发板每10分钟上报一次温湿度信息,即8266上报一次温湿度信息后会进入深度睡眠模式,10分钟后唤醒后再次进入深度睡眠,以此类推。
Github地址:https://github.com/Fishghost98/TemHumProject码云地址:https://gitee.com/Fishghost/TemHumProject
评论前必须登录!
注册