微控制器的內(nèi)部存儲(chǔ)器很小,不足以長(zhǎng)時(shí)間保存傳感器生成的數(shù)據(jù),要么您必須使用一些外部存儲(chǔ)設(shè)備,要么可以使用互聯(lián)網(wǎng)將數(shù)據(jù)保存在某些云上。此外,當(dāng)傳感器部署在人無(wú)法到達(dá)或難以頻繁訪問(wèn)的極端條件站點(diǎn)時(shí),有時(shí)會(huì)變得難以管理。為了糾正這類問(wèn)題,我們總是研究我們希望從任何地方實(shí)時(shí)監(jiān)控傳感器數(shù)據(jù)的方式,而無(wú)需任何物理存在。
實(shí)時(shí)數(shù)據(jù)庫(kù)可以用在這種情況下,我們只需要連接一些可以連接到互聯(lián)網(wǎng)并能夠與云服務(wù)器交換數(shù)據(jù)的控制器。服務(wù)器數(shù)據(jù)可用于監(jiān)控實(shí)時(shí)系統(tǒng)行為、數(shù)據(jù)庫(kù)分析、統(tǒng)計(jì)分析和處理以及未來(lái)用例的解釋。有許多物聯(lián)網(wǎng)硬件平臺(tái)和云平臺(tái)可用于實(shí)現(xiàn)此目的。
我們將使用溫度和濕度傳感器 DHT11和NodeMCU ESP8266 模塊在 Google 的 Firebase 數(shù)據(jù)庫(kù)服務(wù)器上實(shí)時(shí)記錄溫度和濕度。
我們將項(xiàng)目分為兩個(gè)部分。首先,我們將從組裝硬件組件并將固件上傳到其中開(kāi)始。其次,我們將使用 Firebase 與 NodeMCU 進(jìn)行設(shè)置以交換實(shí)時(shí)數(shù)據(jù)。如果您是 ESP8266 或 Firebase 的新手,請(qǐng)按照我們之前使用 Firebase 控制 LED 的教程進(jìn)行操作。
所需組件
NodeMCU ESP8266 模塊
DHT11溫濕度傳感器
電路原理圖
DHT11溫濕度傳感器
DHT11 模塊具有帶校準(zhǔn)數(shù)字信號(hào)輸出的濕度和溫度復(fù)合體,這意味著 DHT11 傳感器模塊是用于感測(cè)濕度和溫度的組合模塊,可提供校準(zhǔn)的數(shù)字輸出信號(hào)。DHT11 為我們提供了非常精確的濕度和溫度值,并確保了高可靠性和長(zhǎng)期穩(wěn)定性。該傳感器具有電阻型濕度測(cè)量元件和 NTC 型溫度測(cè)量元件,內(nèi)置 8 位微控制器,具有快速響應(yīng)和成本效益,采用 4 針單排封裝。
我們之前使用ESP12E 更新網(wǎng)絡(luò)服務(wù)器上的 DHT11 讀數(shù),除此之外,您可以檢查所有基于 DHT11 的項(xiàng)目,我們使用 DHT11 與許多其他微控制器(如 Arduino、PIC、Raspberry 和使用它們構(gòu)建的氣象站)進(jìn)行接口。
編程 NodeMCU ESP8266 實(shí)時(shí)溫度和濕度監(jiān)測(cè)
最后給出了帶有工作視頻的完整程序。在這里,我們將解釋代碼的幾個(gè)重要部分。
首先包括使用 ESP8266 和 firebase 的庫(kù)。
#include
按照以下鏈接下載并安裝庫(kù):
https://github.com/FirebaseExtended/firebase-arduino/blob/master/src/Firebase.h
https://github.com/bblanchon/ArduinoJson
編譯時(shí),如果您收到未安裝 ArduinoJson.h 庫(kù)的錯(cuò)誤,請(qǐng)使用上面給出的鏈接安裝它。
我們將對(duì) NodeMCU 進(jìn)行編程,使其每隔 5 秒從 DHT11 傳感器讀取讀數(shù)并將其推送到 Firebase。我們將設(shè)置推送數(shù)據(jù)的路徑?,F(xiàn)在有兩個(gè)參數(shù),即。濕度和溫度在相同的父路徑和不同的子路徑中發(fā)送。
這兩個(gè)參數(shù)對(duì)于與 firebase 通信非常重要。設(shè)置這些參數(shù)將啟用 ESP8266 和 firebase 之間的數(shù)據(jù)交換。要為您的項(xiàng)目查找這些參數(shù),請(qǐng)按照我們之前關(guān)于Firebase 設(shè)置的教程進(jìn)行操作。
#define FIREBASE_HOST "your-project.firebaseio.com" // 來(lái)自 firebase id 的項(xiàng)目名稱地址 #define FIREBASE_AUTH "Uejx9ROxxxxxxxxxxxxxxxxxxxxxxxxxxxfQDDkhN" // 從 firebase 生成的密鑰
成功找到憑據(jù)后,只需在上面的代碼中替換即可。
輸入您的 Wi-Fi SSID 和密碼以連接您的網(wǎng)絡(luò)。
#define WIFI_SSID "network_name" // 輸入你的家庭或公共wifi名稱 #define WIFI_PASSWORD "password" //wifi ssid的密碼
在 NodeMCU 中定義 DHT 數(shù)據(jù)引腳。您可以在 NodeMCU 中使用任何數(shù)字 GPIO 引腳。
#define DHTPIN D4
DHT 庫(kù)適用于所有 DHT 變體,并帶有您想要用于 DHT11 或 DHT22 的 DHT 傳感器的選項(xiàng)。只需選擇正確的 DHT 傳感器并繼續(xù)。
#define DHTTYPE DHT11 // 選擇 dht 類型為 DHT 11 或 DHT22 DHT dht(DHTPIN, DHTTYPE);
連接到所選的 Wi-Fi 網(wǎng)絡(luò)并連接到 firebase 數(shù)據(jù)庫(kù)服務(wù)器。
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
開(kāi)始讀取 NodeMCU 的 D4 引腳。
dht.begin();
從 DHT 傳感器獲取濕度和溫度讀數(shù)并保存為浮點(diǎn)值。
浮動(dòng) h = dht.readHumidity(); // 讀取溫度或濕度大約需要 250 毫秒! 浮動(dòng) t = dht.readTemperature(); // 將溫度讀取為攝氏度(默認(rèn)值)
只需檢查 DHT 傳感器是否正確接線或未損壞,控制器可以從中讀取讀數(shù)。如果讀數(shù)未顯示,則可能傳感器已損壞,只需顯示錯(cuò)誤消息并返回再次檢查,而不繼續(xù)進(jìn)行。
if (isnan(h) || isnan(t)) { // 檢查是否有任何讀取失敗并提前退出(重試)。 Serial.println(F("讀取 DHT 傳感器失敗!")); 返回; }
在串行監(jiān)視器中打印傳感器數(shù)據(jù)以進(jìn)行調(diào)試,并以字符串形式保存溫度和濕度值以將其發(fā)送到 Firebase。另請(qǐng)注意,來(lái)自 DHT11 傳感器的兩次讀數(shù)之間所需的最小延遲為 2 秒,因此請(qǐng)始終使用大于 2 秒的延遲。要了解有關(guān) DHT11 的更多信息,您可以查看官方數(shù)據(jù)表。
Serial.print("濕度:"); 序列號(hào).print(h); String fireHumid = String(h) + String("%"); //將整數(shù)濕度轉(zhuǎn)換為字符串濕度 Serial.print("% Temperature: "); 序列號(hào).print(t); Serial.println("°C"); String fireTemp = String(t) + String("°C"); 延遲(4000);
最后,將溫度和濕度數(shù)據(jù)發(fā)送到路徑“your-project.firebaseio.com/DHT11/Humidity/”的firebase。
Firebase.pushString("/DHT11/Humidity", fireHumid); //設(shè)置路徑并發(fā)送讀數(shù)Firebase.pushString("/DHT11/Temperature", fireTemp); //設(shè)置路徑并發(fā)送讀數(shù)
您可以查看您的 Firebase 帳戶中的所有數(shù)據(jù)。只需轉(zhuǎn)到Firebase中“我的控制臺(tái)”中“您的項(xiàng)目”中的“數(shù)據(jù)庫(kù)”部分。
/* 將傳感器數(shù)據(jù)發(fā)送到 Firebase 數(shù)據(jù)庫(kù) */
#include// esp8266 庫(kù)
#include// firebase 庫(kù)
#include// dht11 溫濕度傳感器庫(kù)
#define FIREBASE_HOST "your-project.firebaseio.com" // 來(lái)自 firebase id 的項(xiàng)目名稱地址
#define FIREBASE_AUTH "Uejx9ROxxxxxxxxxxxxxxxxxxxxxxxxxxxfQDDkhN" // 從 firebase 生成的密鑰
#define WIFI_SSID "network_name" // 輸入您的家庭或公共 wifi 名稱
#define WIFI_PASSWORD "password" //wifi ssid 的密碼
#define DHTPIN D4 // 我們連接的數(shù)字引腳
#define DHTTYPE DHT11 // 選擇 dht 類型作為 DHT 11 或 DHT22
DHT dht(DHTPIN, DHTTYPE);
無(wú)效設(shè)置(){
序列.開(kāi)始(9600);
延遲(1000);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); //嘗試連接wifi
Serial.print("Connecting to ");
Serial.print(WIFI_SSID);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
延遲(500);
}
Serial.println();
Serial.print("連接到");
Serial.println(WIFI_SSID);
Serial.print("IP 地址為:");
Serial.println(WiFi.localIP()); //打印本地IP地址
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); // 連接到火力基地
dht.begin(); //開(kāi)始讀取dht傳感器
}
無(wú)效循環(huán)(){
浮動(dòng)h = dht.readHumidity();// 讀取溫度或濕度大約需要 250 毫秒!
浮動(dòng) t = dht.readTemperature(); // 將溫度讀取為攝氏度(默認(rèn)值)
if (isnan(h) || isnan(t)) { // 檢查是否有任何讀取失敗并提前退出(重試)。
Serial.println(F("讀取 DHT 傳感器失敗!"));
返回;
}
Serial.print("濕度:"); 序列號(hào).print(h);
String fireHumid = String(h) + String("%"); //將整數(shù)濕度轉(zhuǎn)換為字符串濕度
Serial.print("% 溫度:"); 序列號(hào).print(t); Serial.println("°C");
String fireTemp = String(t) + String("°C"); //將整數(shù)溫度轉(zhuǎn)換為字符串溫度
延遲(4000);
Firebase.pushString("/DHT11/Humidity", fireHumid); //設(shè)置路徑并發(fā)送讀數(shù)
Firebase.pushString("/DHT11/Temperature", fireTemp); //設(shè)置路徑并發(fā)送讀數(shù)
}
-
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3799瀏覽量
64388 -
DHT11濕度傳感器
+關(guān)注
關(guān)注
0文章
13瀏覽量
4784 -
NODEMCU
+關(guān)注
關(guān)注
13文章
289瀏覽量
21403
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論