想要自動化監控目前的氣溫和濕度嗎?就讓我們使用 ESP32 和 DHT sensor 系列來自製一個溫濕度監測計吧!
目錄
準備硬體元件
這次製作需要準備的材料為:
- ESP32 (這邊以 NodeMCU-ESP32 為例)
- DHT sensor (這邊以 DHT22 為例)
DHT sensor 系列比較
DHT sensor 是溫濕度合一的偵測器,常看到的型號會是 DHT11(藍色)DHT22(白色),主要的差異如下
DHT11 | DHT22 / AM2302 | |
工作電壓 | 3 ~ 5 V | 3 ~ 5 V |
工作電流 | 偵測時,最大 2.5 mA | 偵測時,最大 2.5 mA |
濕度範圍 | 20 ~ 80%,5% 誤差 | 0 ~ 100% ,2 ~ 5% 誤差 |
溫度範圍 | 0 ~ 50°C,±2°C 誤差 | -40 ~ 80°C,±0.5°C 誤差 |
偵測頻率 | 最大 1Hz | 最大 0.5Hz |
其中特別注意的是,目前網路賣家上標示 DHT22 的 sensor 通常會是 AM2302 (package DHT22),兩者沒有特別的差異,只有在後面程式宣告時略有不同。
連接 ESP32 與 DHT22
這邊以的 DHT22 (也就是 AM2302,後續以 DHT22 稱之) 來做示範。
DHT22 三個 pin 依照電路板上印刷分別為 +, out, -,也就是 Vcc, Signal, GND。
DHT22 Signal 部分有他自己定義的時序,這部分我們不用擔心,交給 lib 處理即可。所以我們將 Signal pin 拉到 ESP32 任一 GPIO ,另外再共接 Vcc, GND 即可。
我們這邊以 nodeMCU-32S 為例,使用 GPIO 27 作為與 DHT22 Signal 連接腳。
ESP32 (nodeMCU-32S) | DHT22 (AM2302) |
GPIO 27 | Signal |
3.3V | Vcc |
GND | GND |
安裝 DHT library – DHT sensor library for ESPx
首先安裝 DHT library,讓他為我們處理掉麻煩的訊號處理。這邊以 platformIO 為例,若使用 Arduino IDE 請用 library manager 搜尋安裝。
到 platformIO 的 Libraries 頁籤搜尋 dht sensor
往下拉一點後會看到 DHT sensor library for ESPx,點開他。
點擊 Add to Project 就完成!
開始撰寫程式碼
我們使用 arduino framework 來進行開發。為了註解清晰指明是哪一行,前面會括弧行號:
- (L1) include arduino.h 和 DHTesp.h
- (L4) 緊接著宣告 DHTesp 實體,這樣在 setup() 和 loop() 才都能引用
- (L7) 在 step() 裡面呼叫 dht.setup(),宣告 GPIO 27 接到 DHT sensor signal pin,以及使用的 sensor 型號為 AM2302
- (L10) 在 loop() 裡面撰寫我們撈 sensor 資料的程式碼
- (L11) 透過 dht.getTempAndHumidity() 可以一次撈回溫度和濕度資料,但這個方法並不會告訴我們是否撈成功,必須在後面自行使用 dht.getStatus() 來判斷
- (L13) 如果 dht.getStatus() 回傳非 0,可能會是 timeout 或是 checksum 錯誤,我們可以透過 dht.getStatusString() 來得知。經驗上發生錯誤通常是接線沒接好導致,重新連接即可排除。
- (L16) sensor 剛上電時去撈資料,雖然不會回報錯誤,但數值通常會是 NaN,所以我們也需要判斷一下撈回的資料是否有效
- (L20) 最後我們就可以印出溼度和溫度在 UART console 囉!
- (L26) 我們讓偵測的頻率為約 0.5Hz
#include <Arduino.h>
#include "DHTesp.h"
DHTesp dht;
void setup() [
dht.setup(27, DHTesp::AM2302);
}
void loop() {
TempAndHumidity data = dht.getTempAndHumidity();
if (dht.getStatus() != 0) {
Serial.println("DHT sensor error status: " + String(dht.getStatusString()));
} else if (isnan(data.humidity) || isnan(data.temperature)) {
Serial.println("Data is NaN!");
} else {
Serial.print("Humidity: ");
Serial.print(data.humidity);
Serial.print("% Temperature: ");
Serial.println(data.temperature);
}
delay(2000);
}
非常簡單對吧!下一篇我們再讓偵測到的數據可以直接顯示出來,不需要透過電腦 UART 來監看!
延伸閱讀:如何使用 ESP32 做類比輸出 DAC?做個 80 年代的指針溫濕度表吧!
參考資料
DHT sensor library for ESPx github repo
DHT11, DHT22 and AM2302 Sensors Overview