摘要:超簡(jiǎn)單深度睡眠模式下遠(yuǎn)程采集溫濕度信息項(xiàng)目背景相關(guān)技術(shù)深度睡眠模式溫濕度采集數(shù)據(jù)收發(fā)前后端實(shí)現(xiàn)后端前端項(xiàng)目背景自己用收納箱做了一個(gè)用于存放打印耗材的干燥箱,想用閑置的開(kāi)發(fā)板和溫濕度傳感器做一個(gè)遠(yuǎn)程溫濕度監(jiān)測(cè)的小項(xiàng)目。
自己用收納箱做了一個(gè)用于存放3D打印耗材的干燥箱,想用閑置的ESP8266開(kāi)發(fā)板和DHT11溫濕度傳感器做一個(gè)遠(yuǎn)程溫濕度監(jiān)測(cè)的小項(xiàng)目。
因?yàn)闇貪穸刃畔⒌牟杉⒉恍枰^(guò)頻繁,另一方面為了降低整體的功耗,所以打算使用ESP8266的深度睡眠模式來(lái)每隔半個(gè)小時(shí)或一個(gè)小時(shí)上傳一次溫濕度的信息,這樣能大大降低整個(gè)項(xiàng)目的功耗,延長(zhǎng)使用時(shí)間。
esp8266的三個(gè)睡眠模式包括調(diào)制解調(diào)器睡眠、輕度睡眠和深度睡眠(具體信息可以參考文章-ESP8266睡眠模式)。深度睡眠模式是8266三個(gè)主要睡眠模式中功耗最低的一種,在該模式下esp8266的所有應(yīng)用程序數(shù)據(jù)都不會(huì)執(zhí)行,相當(dāng)于8266處于關(guān)機(jī)狀態(tài),只有8266的RST引腳接收到低電平信號(hào)后8266才會(huì)被喚醒(開(kāi)機(jī))。這里可以將8266的GPIO16(D0)引腳與RST引腳相連,通過(guò)GPIO16號(hào)引腳向RST引腳發(fā)送低電平將8266喚醒。
esp8266進(jìn)入深度睡眠模式可以通過(guò)調(diào)用函數(shù) ESP.deepSleep(30e6); (單位us,30e6表示睡眠30秒)來(lái)實(shí)現(xiàn),深度睡眠模式下最多睡眠時(shí)長(zhǎng)4,294,967,295 μs 也就是大概71分鐘。
esp8266進(jìn)入深度睡眠模式的示例代碼如下:
void setup() { Serial.begin(115200); Serial.setTimeout(2000); // Wait for serial to initialize. while(!Serial) { } //Serial.println("即將進(jìn)入深度睡眠模式,睡眠時(shí)長(zhǎng)為30秒"); //ESP.deepSleep(30e6); Serial.println("即將進(jìn)入深度睡眠模式,將一直處于深度睡眠狀態(tài),直到RST接收到低電平信號(hào)才被喚醒"); ESP.deepSleep(0); }void loop() { Serial.println("深度睡眠模式下,loop函數(shù)中的代碼將不會(huì)被執(zhí)行");}
注意: 深度睡眠模式下,esp8266只會(huì)執(zhí)行setup函數(shù)中位于deepSleep()函數(shù)之前的代碼程序,loop中的代碼將永遠(yuǎn)不會(huì)被執(zhí)行。
溫濕度信息的采集主要由DHT11傳感器來(lái)完成,傳感器的data引腳接8266的GPIO4(D2)引腳,使用SimpleDHT庫(kù)來(lái)實(shí)現(xiàn)溫濕度信息的采集,主要代碼如下:
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");}
項(xiàng)目中數(shù)據(jù)的收發(fā)主要通過(guò)部署在阿里云服務(wù)器上的MQTT服務(wù)端來(lái)完成,我的阿里云服務(wù)器是windows系統(tǒng)(操作簡(jiǎn)單些,代碼可以隨時(shí)修改運(yùn)行,主要也用于跑其他軟件),也可以在自己的電腦上搭建,搭建非常簡(jiǎn)單,具體的搭建流程可以參考MQTT環(huán)境搭建。
MQTT信息收發(fā)的測(cè)試使用MQTT.fx軟件,非常方便。
ESP8266開(kāi)發(fā)板通過(guò)MQTT發(fā)送信息的代碼如下:
//發(fā)布MQTT信息void pubMQTTmsg(String state){ //建立發(fā)布主題。主題名稱為“topic” String topic = "Mymqtt/module2/led"; char publishTopic[topic.length() + 1]; strcpy(publishTopic, topic.c_str()); //建立發(fā)布信息。 String sendMessage = state; char publishMsg[sendMessage.length() + 1]; strcpy(publishMsg, sendMessage.c_str()); //實(shí)現(xiàn)8266向主題發(fā)布信息 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."); }}
其他完整代碼可以點(diǎn)擊文章末尾github鏈接查看。
這次上位機(jī)及數(shù)據(jù)的顯示使用Node.js來(lái)實(shí)現(xiàn),后端用Node.js來(lái)接收MQTT消息,接收到溫濕度消息后將相關(guān)數(shù)據(jù)存入到阿里云服務(wù)器上的MySql數(shù)據(jù)庫(kù),并通過(guò)前端網(wǎng)頁(yè)來(lái)展示,前后端數(shù)據(jù)的交互使用socket來(lái)實(shí)現(xiàn)。
MySql配置信息如下:
var mysql = require("mysql")var connection = mysql.createConnection({ host: "你的服務(wù)器IP", user: "用戶名", password: "密碼", port: "端口,一般是3306", database: "數(shù)據(jù)庫(kù)名稱",})connection.connect()
MQTT配置信息如下:
var mqttUrl = "mqtt://服務(wù)器IP:61613"var option = { username: "MQTT服務(wù)器用戶名", password: "MQTT服務(wù)器密碼", clientId: "客戶端ID",}
訂閱MQTT主題的代碼如下:
//訂閱的MQTT主題client.subscribe("Mymqtt/module1/willMessage", { qos: 0 }) //設(shè)備一的狀態(tài)信息client.subscribe("Mymqtt/module1/DHT11", { qos: 0 }) //溫濕度client.subscribe("Mymqtt/module1/light", { qos: 0 }) //光照client.subscribe("Mymqtt/module2/willMessage", { qos: 0 }) //設(shè)備二的狀態(tài)信息client.subscribe("Mymqtt/module2/led", { qos: 2 }) //燈的狀態(tài)信息console.log("訂閱成功")
主題名稱根據(jù)自己的需要改,不能與其他主題名稱重復(fù)。(module2是我遠(yuǎn)程控制燈的項(xiàng)目)
接收MQTT消息并發(fā)送前端的部分代碼如下:
//監(jiān)聽(tīng)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是因?yàn)榻邮誐QTT消息時(shí)有可能會(huì)同時(shí)接收多條相同的消息,所以3秒內(nèi)只接收一條同一主題的消息。
溫濕度信息插入數(shù)據(jù)庫(kù)的代碼如下:
//將溫濕度信息插入到數(shù)據(jù)庫(kù)中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");});
其他完整代碼見(jiàn)文章末尾鏈接。
前端的效果如圖:
頁(yè)面上面可以顯示設(shè)備的狀態(tài),即“離線”還是“在線”,也可以顯示設(shè)備上次離線時(shí)的時(shí)間。下面可以顯示傳感器最近一次上報(bào)的溫濕度信息,圖表顯示最近10次的溫濕度信息,當(dāng)有新的信息到來(lái)時(shí)也會(huì)動(dòng)態(tài)更新。
這里的圖表使用的是ECzharts的圖表插件,可以根據(jù)數(shù)據(jù)的變化動(dòng)態(tài)顯示曲線,也可以在折線圖和條形圖之間進(jìn)行切換,還可以放大某一區(qū)域或?qū)?dāng)前數(shù)據(jù)畫(huà)面下載。他們網(wǎng)站上有著各式各樣的圖表插件,可以很簡(jiǎn)單、方便地把自己的數(shù)據(jù)通過(guò)插件動(dòng)態(tài)顯示出來(lái),這是他們的官網(wǎng)-ECharts官網(wǎng)
注: 本項(xiàng)目中開(kāi)發(fā)板每10分鐘上報(bào)一次溫濕度信息,即8266上報(bào)一次溫濕度信息后會(huì)進(jìn)入深度睡眠模式,10分鐘后被喚醒再次上報(bào)后進(jìn)入深度睡眠,如此循環(huán)。
github地址:https://github.com/Fishghost98/TemHumProject
碼云地址:https://gitee.com/Fishghost/TemHumProject
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/123693.html
摘要:基于的與通信連接,實(shí)現(xiàn)溫濕度數(shù)據(jù)互傳,控制第一步,在實(shí)現(xiàn)將傳感器數(shù)據(jù)采集之后,并且完成配網(wǎng)步驟,可以正常通過(guò)模塊正常將數(shù)據(jù)發(fā)送到云平臺(tái)之后進(jìn)行以下閱讀,上述內(nèi)容可以跳轉(zhuǎn)到以下鏈接進(jìn)行查看具體操作。 ...
摘要:教程傳送門(mén)基于平臺(tái)開(kāi)發(fā)連接巴法云簡(jiǎn)介實(shí)驗(yàn)準(zhǔn)備硬件軟件實(shí)驗(yàn)步驟點(diǎn)燈實(shí)驗(yàn)發(fā)送溫濕度指令升級(jí)總結(jié)關(guān)于巴法云專注于開(kāi)源,智造,創(chuàng)新,分享。 Arduino教程傳送門(mén)????...
摘要:下面是演示視頻物聯(lián)網(wǎng)文章目錄前言一準(zhǔn)備二操作步驟配置配置三效果展示總結(jié)前言實(shí)現(xiàn)萬(wàn)物互聯(lián)第一步,千里點(diǎn)燈,然后添加你想要的模塊就可以了,接下來(lái)我們進(jìn)入正文。 前面學(xué)習(xí)...
摘要:具體操作如下創(chuàng)建自己的設(shè)備進(jìn)入到阿里云控制臺(tái),找到物聯(lián)網(wǎng)平臺(tái),創(chuàng)建屬于自己的設(shè)備點(diǎn)擊公共實(shí)例進(jìn)行創(chuàng)建里面有個(gè)設(shè)備管理,點(diǎn)擊產(chǎn)品,里面有個(gè)創(chuàng)建產(chǎn)品輸入名稱即可,然后選擇標(biāo)準(zhǔn)品類這里我創(chuàng)建的是溫濕度檢測(cè)。 ...
摘要:開(kāi)發(fā)方式是樂(lè)鑫為開(kāi)發(fā)者提供的物聯(lián)應(yīng)開(kāi)發(fā)平臺(tái),包括基礎(chǔ)平臺(tái)以及上層應(yīng)開(kāi)發(fā)示例,如智能燈智能開(kāi)關(guān)等。指令開(kāi)發(fā)方式作為芯片,指令開(kāi)發(fā)也是必不可少的。開(kāi)發(fā)方式即,意為運(yùn)行在單片機(jī)上的。 ...
閱讀 2773·2021-11-18 10:02
閱讀 2356·2021-09-30 09:47
閱讀 1931·2021-09-27 14:01
閱讀 3217·2021-08-16 11:00
閱讀 3229·2019-08-30 11:06
閱讀 2462·2019-08-29 17:29
閱讀 1604·2019-08-29 13:19
閱讀 501·2019-08-26 13:54