如何用 ESP32 快速做溫溼度監測? 使用 DHT sensor 來達成智慧家居!

想要自動化監控目前的氣溫和濕度嗎?就讓我們使用 ESP32 和 DHT sensor 系列來自製一個溫濕度監測計吧!

準備硬體元件

這次製作需要準備的材料為:

  1. ESP32 (這邊以 NodeMCU-ESP32 為例)
  2. DHT sensor (這邊以 DHT22 為例)

DHT sensor 系列比較

DHT sensor 是溫濕度合一的偵測器,常看到的型號會是 DHT11(藍色)DHT22(白色),主要的差異如下

DHT11DHT22 / AM2302
工作電壓3 ~ 5 V3 ~ 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
如何用 ESP32 快速做溫溼度監測? 使用 DHT sensor 來達成智慧家居!
DHT11

其中特別注意的是,目前網路賣家上標示 DHT22 的 sensor 通常會是 AM2302 (package DHT22),兩者沒有特別的差異,只有在後面程式宣告時略有不同。

如何用 ESP32 快速做溫溼度監測? 使用 DHT sensor 來達成智慧家居!
DHT22 / AM2302

連接 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 快速做溫溼度監測? 使用 DHT sensor 來達成智慧家居!
ESP32 (nodeMCU-32S)DHT22 (AM2302)
GPIO 27Signal
3.3VVcc
GNDGND

安裝 DHT library – DHT sensor library for ESPx

首先安裝 DHT library,讓他為我們處理掉麻煩的訊號處理。這邊以 platformIO 為例,若使用 Arduino IDE 請用 library manager 搜尋安裝。

到 platformIO 的 Libraries 頁籤搜尋 dht sensor

如何用 ESP32 快速做溫溼度監測? 使用 DHT sensor 來達成智慧家居!

往下拉一點後會看到 DHT sensor library for ESPx,點開他。

如何用 ESP32 快速做溫溼度監測? 使用 DHT sensor 來達成智慧家居!

點擊 Add to Project 就完成!

如何用 ESP32 快速做溫溼度監測? 使用 DHT sensor 來達成智慧家居!

開始撰寫程式碼

我們使用 arduino framework 來進行開發。為了註解清晰指明是哪一行,前面會括弧行號:

  1. (L1) include arduino.h 和 DHTesp.h
  2. (L4) 緊接著宣告 DHTesp 實體,這樣在 setup() 和 loop() 才都能引用
  3. (L7) 在 step() 裡面呼叫 dht.setup(),宣告 GPIO 27 接到 DHT sensor signal pin,以及使用的 sensor 型號為 AM2302
  4. (L10) 在 loop() 裡面撰寫我們撈 sensor 資料的程式碼
  5. (L11) 透過 dht.getTempAndHumidity() 可以一次撈回溫度和濕度資料,但這個方法並不會告訴我們是否撈成功,必須在後面自行使用 dht.getStatus() 來判斷
  6. (L13) 如果 dht.getStatus() 回傳非 0,可能會是 timeout 或是 checksum 錯誤,我們可以透過 dht.getStatusString() 來得知。經驗上發生錯誤通常是接線沒接好導致,重新連接即可排除。
  7. (L16) sensor 剛上電時去撈資料,雖然不會回報錯誤,但數值通常會是 NaN,所以我們也需要判斷一下撈回的資料是否有效
  8. (L20) 最後我們就可以印出溼度和溫度在 UART console 囉!
  9. (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

Written by J
雖然大學唸的是生物,但持著興趣與熱情自學,畢業後轉戰硬體工程師,與宅宅工程師們一起過著沒日沒夜的生活,做著台灣最薄的 intel 筆電,要與 macbook air 比拼。 離開後,憑著一股傻勁與朋友創業,再度轉戰軟體工程師,一手扛起前後端、雙平台 app 開發,過程中雖跌跌撞撞,卻也累計不少經驗。 可惜不是那 1% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。