(超简单)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); (单位us,30e6表示睡眠30秒)来实现,深度睡眠模式下最多睡眠时长4,294,967,295 µs 也就是大概71分钟。

esp8266进入深度睡眠模式的示例代码如下:

void setup() {Serial.begin(115200);Serial.setTimeout(2000);// Wait for serial to initialize.while(!Serial) { }//Serial.println("即将进入深度睡眠模式,睡眠时长为30秒");//ESP.deepSleep(30e6); Serial.println("即将进入深度睡眠模式,将一直处于深度睡眠状态,直到RST接收到低电平信号才被唤醒");ESP.deepSleep(0);
}void loop() {Serial.println("深度睡眠模式下,loop函数中的代码将不会被执行");
}

注意: 深度睡眠模式下,esp8266只会执行setup函数中位于deepSleep()函数之前的代码程序,loop中的代码将永远不会被执行。

DHT11温湿度采集

温湿度信息的采集主要由DHT11传感器来完成,传感器的data引脚接8266的GPIO4(D2)引脚,使用SimpleDHT库来实现温湿度信息的采集,主要代码如下:

void getHumChk()
{int err = SimpleDHTErrSuccess;if ((err = dht11.read(&temp_read, &humi_read, NULL)) != SimpleDHTErrSuccess){Serial.print("Read DHT11 failed, err=");Serial.println(err);delay(1500);return;}Serial.print("hum:");Serial.print(humi_read);Serial.print("%");Serial.print("tem:");Serial.print(temp_read);Serial.println("*C");
}

MQTT数据收发

项目中数据的收发主要通过部署在阿里云服务器上的MQTT服务端来完成,我的阿里云服务器是windows系统(操作简单些,代码可以随时修改运行,主要也用于跑其他软件),也可以在自己的电脑上搭建,搭建非常简单,具体的搭建流程可以参考MQTT环境搭建。

MQTT信息收发的测试使用MQTT.fx软件,非常方便。
ESP8266开发板通过MQTT发送信息的代码如下:

//发布MQTT信息
void pubMQTTmsg(String state)
{//建立发布主题。主题名称为“topic”String topic = "Mymqtt/module2/led";char publishTopic[topic.length() + 1];strcpy(publishTopic, topic.c_str());//建立发布信息。String sendMessage = state;char publishMsg[sendMessage.length() + 1];strcpy(publishMsg, sendMessage.c_str());//实现8266向主题发布信息if (mqttClient.publish(publishTopic, publishMsg)){Serial.print("Publish Topic:");Serial.println(publishTopic);Serial.print("Publish Message:");Serial.println(publishMsg);}else{Serial.println("Message Publish Failed.");}
}

其他完整代码可以点击文章末尾github链接查看。

Node.js前后端实现

后端

这次上位机及数据的显示使用Node.js来实现,后端用Node.js来接收MQTT消息,接收到温湿度消息后将相关数据存入到阿里云服务器上的MySql数据库,并通过前端网页来展示,前后端数据的交互使用socket来实现。

MySql配置信息如下:

var mysql = require('mysql')
var connection = mysql.createConnection({host: '你的服务器IP',user: '用户名',password: '密码',port: '端口,一般是3306',database: '数据库名称',
})
connection.connect()

MQTT配置信息如下:

var mqttUrl = 'mqtt://服务器IP:61613'
var option = {username: 'MQTT服务器用户名',password: 'MQTT服务器密码',clientId: '客户端ID',
}

订阅MQTT主题的代码如下:

//订阅的MQTT主题
client.subscribe('Mymqtt/module1/willMessage', { qos: 0 })    //设备一的状态信息
client.subscribe('Mymqtt/module1/DHT11', { qos: 0 })          //温湿度
client.subscribe('Mymqtt/module1/light', { qos: 0 })          //光照
client.subscribe('Mymqtt/module2/willMessage', { qos: 0 })    //设备二的状态信息
client.subscribe('Mymqtt/module2/led', { qos: 2 })            //灯的状态信息
console.log('订阅成功')

主题名称根据自己的需要改,不能与其他主题名称重复。(module2是我远程控制灯的项目)

接收MQTT消息并发送前端的部分代码如下:

   //监听MQTT消息client.on("message", function (topic, message) {if (topic == "Mymqtt/module1/willMessage") {nowtime = new Date().getTime();t = nowtime - lasttime;if (t > 3000) {willMessage1 = message.toString();time = new Date().toLocaleString("chinese", { hour12: false });console.log(time);console.log("主题:" + topic + "  消息:" + willMessage1);socket.emit("module1", { msg: willMessage1 });socket.emit("time", { msg: time });}lasttime = nowtime;} else if (topic == "Mymqtt/module2/willMessage") {willMessage2 = message.toString();console.log("主题:" + topic + "  消息:" + willMessage2);socket.emit("module2", { msg: willMessage2 });} else if (topic == "Mymqtt/module1/light") {light = message.toString();console.log("主题:" + topic + "  消息:" + light);socket.emit("light", { msg: light });

这里用到nowtime、lasttime、t是因为接收MQTT消息时有可能会同时接收多条相同的消息,所以3秒内只接收一条同一主题的消息。

温湿度信息插入数据库的代码如下:

//将温湿度信息插入到数据库中
var json = JSON.parse(message.toString());
var addDht11 = "INSERT INTO dht11(temperature,humidity) VALUES(?,?)";
var temperature = parseInt(json.temperature);
var humidity = parseInt(json.humidity);
var addSqlParams = [temperature, humidity];connection.query(addDht11, addSqlParams, function (err, result) {if (err) {console.log("[INSERT ERROR] - ", err.message);return;}console.log("Insert successfully");
});

其他完整代码见文章末尾链接。

前端

前端的效果如图:

页面上面可以显示设备的状态,即“离线”还是“在线”,也可以显示设备上次离线时的时间。下面可以显示传感器最近一次上报的温湿度信息,图表显示最近10次的温湿度信息,当有新的信息到来时也会动态更新。

这里的图表使用的是ECzharts的图表插件,可以根据数据的变化动态显示曲线,也可以在折线图和条形图之间进行切换,还可以放大某一区域或将当前数据画面下载。他们网站上有着各式各样的图表插件,可以很简单、方便地把自己的数据通过插件动态显示出来,这是他们的官网-ECharts官网

成果演示:

注: 本项目中开发板每10分钟上报一次温湿度信息,即8266上报一次温湿度信息后会进入深度睡眠模式,10分钟后被唤醒再次上报后进入深度睡眠,如此循环。

B站视频演示:视频演示
github地址:https://github.com/Fishghost98/TemHumProject

(超简单)ESP8266深度睡眠模式下远程采集温湿度信息相关推荐

  1. android 夜间模式代码,Android 超简单的夜间模式如何实现?

    原标题:Android 超简单的夜间模式如何实现? 本文作者 作者: 唐子玄 实现夜间模式有很多种方式,经过多次尝试,算是找到了一种性价比较高的方式. 1 主题方式 这是最正统的方式,但工作量巨大,因 ...

  2. ESP8266 Deep-Sleep 模式下的唤醒方式

    ESP-WROOM-02D 模块进入 Deep-Sleep 睡眠:仅 RTC 处于⼯作状态,芯⽚的其他部分掉电. ESP8266 在 Deep-Sleep 模式下支持两种唤醒方式:自动唤醒和外部唤醒. ...

  3. java tcp client断开重连_ESP8266_12 ESP8266客户端模式下的TCP通信

    上一节说了UDP,这一节就聊聊TCP,毕竟它俩经常同时出现.优缺点上一节也提了一下:安全性好,速度慢. 除了这两点,还有就是: TCP通信之前是需要建立连接的,如同打电话之前先拨号一样,而UDP无连接 ...

  4. QLCDNumber制作的超简单计时器,按下空格键暂停。

    界面只有一个QLCDNumber.启动程序,开始计时,按下空格键暂停,再次按下空格键继续计时.可以用于练琴计时的朋友. #include "dialog.h" #include & ...

  5. 超超超 简单构造者模式

    需求: 电脑类用于主键构造者模式 使⽤构建者设计模式来⽣产computer(演示用了String 其实都是对象·) 主要步骤: 1.将需要构建的⽬标类分成多个部件(电脑可以分为主机.显示器.键盘.⾳箱 ...

  6. 超简单的MVP模式案例

    在说mvp之前,先说下mvc: MVC( Model View Controller):一种将逻辑和视图分隔开来的架构设计,起源于web端.其实 Android应用的开发中本身可视为一种MVC架构. ...

  7. 关于Arduino Esp8266深度睡眠(deepsleep)无法唤醒的解决办法

    问题复现 在物联实验当中,由于希望设备小型化,并能够持久使用,选用了WeMos 18650电池盾版. 这个版本在Arduino IDE当中对应 WeMos D1 R2 & mini型号. 图1 ...

  8. SYD8801低功耗【深度睡眠模式】【浅度睡眠模式】【进入睡眠模式后要等待硬件进入睡眠】【内部上拉电阻对功耗的影响】【测试低功耗步骤】

    SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机.32位ARM Cortex-M0处理器.128kB Flash存储器.以及丰富的数字接口.SYD8801片上集成了 ...

  9. 同步模式下的端口映射程序

    今天打算写一个FtpServer玩一下的,需要看看ftp软件常用命令形式(完整实现所有ftp命令太麻烦),最开始打算通过抓包看cuteftp是如何访问ftpserver的,但要把其中的命令保存下来还得 ...

最新文章

  1. 最快捷的阅读实训新闻
  2. 精通python爬虫框架-精通Python爬虫从Scrapy到移动应用(文末福利)
  3. 随便写点时间相关的模块
  4. Matrix Power Series
  5. Oracle Client安装报错:引用数据不可用于验证此操作系统分发的先决条件
  6. 【转】Android 轻松实现语音识别
  7. 阿里云安全肖力:从RSA2019看安全技术发展的十个机遇
  8. html 分页_MySQL——优化嵌套查询和分页查询
  9. curve函数 roc_sklearn-roc_curve
  10. Flutter快速上车之Widget 1
  11. 12个超好用的IntelliJ IDEA 插件!你用过几个?
  12. cmos和ttl_TTL和CMOS有什么区别?
  13. tomcat6url请求400错误(%2F与%5C)
  14. PDCA循环和GTD时间管理
  15. 解析Linux中的VFS文件系统
  16. nRF5340开发指南目录汇总
  17. 爬虫B站任意视频 弹幕文字+时间
  18. swiper插件实现轮播图
  19. 这本书能让你减肥/戒烟/工作脱困/摆脱债务/重掌生活
  20. 【IBM官方文档】DB2 SQLSTATE 消息

热门文章

  1. 你还在这样做:浏览器“记住用户名密码”?
  2. ie默认连接首页没修改
  3. vue自定封装的边框组件
  4. 路由器有外派信号但无服务器,路由器有信号没网络?4个检查你做到了吗?后悔才知道!...
  5. 日本NHK推出人工智能主播,可模拟真人主播声音播报新闻
  6. Android项目gen目下没有R.class文…
  7. python小数点处理_如何在python中打小数点
  8. 初学Python之math模块在哪里?
  9. 批量修改文件夹下文件的名字
  10. 【Unity3D】人机交互Input