摘要:超簡單深度睡眠模式下遠程采集溫濕度信息項目背景相關技術深度睡眠模式溫濕度采集數據收發前后端實現后端前端項目背景自己用收納箱做了一個用于存放打印耗材的干燥箱,想用閑置的開發板和溫濕度傳感器做一個遠程溫濕度監測的小項目。
自己用收納箱做了一個用于存放3D打印耗材的干燥箱,想用閑置的ESP8266開發板和DHT11溫濕度傳感器做一個遠程溫濕度監測的小項目。
因為溫濕度信息的采集并不需要太過頻繁,另一方面為了降低整體的功耗,所以打算使用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傳感器來完成,傳感器的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服務端來完成,我的阿里云服務器是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來接收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分鐘后被喚醒再次上報后進入深度睡眠,如此循環。
github地址:https://github.com/Fishghost98/TemHumProject
碼云地址:https://gitee.com/Fishghost/TemHumProject
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/123693.html
摘要:基于的與通信連接,實現溫濕度數據互傳,控制第一步,在實現將傳感器數據采集之后,并且完成配網步驟,可以正常通過模塊正常將數據發送到云平臺之后進行以下閱讀,上述內容可以跳轉到以下鏈接進行查看具體操作。 ...
摘要:教程傳送門基于平臺開發連接巴法云簡介實驗準備硬件軟件實驗步驟點燈實驗發送溫濕度指令升級總結關于巴法云專注于開源,智造,創新,分享。 Arduino教程傳送門????...
摘要:下面是演示視頻物聯網文章目錄前言一準備二操作步驟配置配置三效果展示總結前言實現萬物互聯第一步,千里點燈,然后添加你想要的模塊就可以了,接下來我們進入正文。 前面學習...
摘要:具體操作如下創建自己的設備進入到阿里云控制臺,找到物聯網平臺,創建屬于自己的設備點擊公共實例進行創建里面有個設備管理,點擊產品,里面有個創建產品輸入名稱即可,然后選擇標準品類這里我創建的是溫濕度檢測。 ...
摘要:開發方式是樂鑫為開發者提供的物聯應開發平臺,包括基礎平臺以及上層應開發示例,如智能燈智能開關等。指令開發方式作為芯片,指令開發也是必不可少的。開發方式即,意為運行在單片機上的。 ...
閱讀 2609·2021-11-18 10:02
閱讀 2278·2021-09-30 09:47
閱讀 1745·2021-09-27 14:01
閱讀 3109·2021-08-16 11:00
閱讀 3163·2019-08-30 11:06
閱讀 2391·2019-08-29 17:29
閱讀 1529·2019-08-29 13:19
閱讀 444·2019-08-26 13:54