(超简单)ESP8266深度睡眠模式下远程采集温湿度信息
(超簡單)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發送信息的代碼如下:
其他完整代碼可以點擊文章末尾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深度睡眠模式下远程采集温湿度信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 发票OCR识别技术太屌了,哈哈哈哈
- 下一篇: SAP-ABAP-SE14丢失的数据如何