ESP32 + DHT11 溫濕度上傳 ThingSpeak 雲端監控

使用 ESP32 搭配 DHT11 溫濕度感測器,透過 WiFi 連線將量測資料每 15 秒自動上傳至 ThingSpeak 雲端平台,只需修改三行設定即可完成,並附有接線說明、常見問題排查與延伸應用方向。

ESP32 + DHT11 溫濕度上傳 ThingSpeak 雲端監控

用 ESP32 讀取溫濕度只是第一步。如果想要隨時查看歷史趨勢、甚至讓家人也能看到資料,就需要把數據上傳到雲端平台。ThingSpeak 是一個極受歡迎,且免費的 IoT 雲端服務,支援資料圖表顯示,而且完全不需要架設自己的伺服器,非常適合初學者使用。

這篇教學會帶你從申請帳號、接線、到撰寫程式,一步一步完成這個專案。

注意:ThingSpeak 免費版每 15 秒才能上傳一次資料,範例程式中已設定好這個間隔,不需要額外調整。

準備材料

材料 數量 備註
ESP32 開發板 ×1 任何版本皆可
DHT11 感測器 ×1 裸 IC 或模組版皆可
杜邦線 若干
NodeMCU-32S 相容版本 ESP32開發板 WiFi 藍牙 可用Arduino IDE
全腳位引出,還保持迷你的身型,插上麵包後還能插杜邦線,真的是太棒了! 和NodeMCU V2幾乎一樣尺寸! 有5V供電輸出,非常方便! 有了ESP32開發板,真的可以忘記原來的那些Arduino板子了! 可以用Arduino IDE開發,但效能更強大,還內建WiFi 傑森實測記錄,大家可以到 F 粉 絲 團 B 看貼文哦! ESP32-D0WDQ6 內置兩個低功耗 Xtensa® 32-bit LX6 MCU。片上存儲包括: • 448 KB 的 ROM,用於程序啟動和內核功能
DHT11模組 DHT-11 溫濕度感測器
產品內容 一、尺寸:長30.5mmX寬12mmX高7.2mm 二、傳感器型號: DHT11溫濕度傳感器 三、工作電壓:直流5V 四、特點: 1、濕度測量範圍:20---90%RH 2、濕度測量精度:±5%RH 3、溫度測量範圍:0---50℃ 4、溫度測量精度:±2℃ 5、工作電壓:DC5V/3.3V 6、數字信號輸出 7、數據端口帶上拉電阻 8、帶3mm固定螺絲孔,方便安裝 五、接線方法: VCC → 3.3V/5V電源正極 GND →電源負極 DATA →單片機IO口

硬體接線

DHT11 腳位 ESP32 腳位 說明
VCC 3.3V 供電
GND GND 接地
DATA GPIO 4 資料訊號(程式中的 DHT_PIN)

申請 ThingSpeak 並建立頻道

  1. 前往 thingspeak.com,點擊「Get Started For Free」,用 MathWorks 帳號或 Email 免費註冊。
要用公司或學校的MIAL哦,不然會註冊不了。

2.登入後點上方 Channels → New Channel,建立一個新的頻道。

3.頻道名稱自訂(例如「室內溫濕度」),勾選 Field 1 填入「​​」、Field 2 填入「​​」,然後儲存。

4.進入頻道後點 API Keys 分頁,複製 Write API Key,等一下要貼到程式裡。

提示:Write API Key 是讓 ESP32 上傳資料的憑證,不要分享給別人。如果不小心外流,可以在同一頁面重新產生。

安裝需要的函式庫

開啟 Arduino IDE,進入「草稿碼 → 匯入函式庫 → 管理函式庫」,搜尋並安裝以下:

  1. DHT sensor library(Adafruit)— 用來讀取 DHT11 感測器
  2. Adafruit Unified Sensor — DHT 函式庫的相依套件
  3. ArduinoJson(Benoit Blanchon)— 之後做更複雜的 API 呼叫會需要

ESP32 的 WiFi 和 HTTPClient 是內建的,不需要額外安裝。


完整程式碼

複製下面這段程式,只需要修改最上面三個設定就能執行:

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <DHT.h>

// =============================================
// 【需要修改的設定】← 只需要改這三行
// =============================================
const char* WIFI_SSID     = "你的WiFi名稱";
const char* WIFI_PASSWORD = "你的WiFi密碼";
const char* TS_API_KEY    = "貼上你的Write API Key";
// =============================================

#define DHT_PIN  4      // DATA 接在 GPIO 4
#define DHT_TYPE DHT11

DHT dht(DHT_PIN, DHT_TYPE);
unsigned long lastSend = 0;

void setup() {
  Serial.begin(115200);
  dht.begin();

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("連線 WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\n已連線:" + WiFi.localIP().toString());
}

void loop() {
  // 每 15 秒上傳一次(ThingSpeak 免費版限制)
  if (millis() - lastSend < 15000) return;
  lastSend = millis();

  float temp = dht.readTemperature();
  float humi = dht.readHumidity();

  if (isnan(temp) || isnan(humi)) {
    Serial.println("DHT11 讀取失敗,請檢查接線");
    return;
  }

  HTTPClient http;
  String url = "http://api.thingspeak.com/update?api_key=";
  url += TS_API_KEY;
  url += "&field1=" + String(temp);
  url += "&field2=" + String(humi);

  http.begin(url);
  int code = http.GET();
  http.end();

  Serial.printf("溫度=%.1f°C  濕度=%.1f%%  HTTP狀態=%d\n", temp, humi, code);
}

程式說明

初始化階段(setup)

程式啟動後先開啟序列埠,然後初始化 DHT11 感測器,接著嘗試連線 WiFi。連線成功後會印出 ESP32 取得的 IP 位址。

主迴圈(loop)

每次執行 loop 都會先檢查距離上次傳送是否已超過 15 秒。如果還沒到,直接 return 跳過。到了 15 秒才讀取感測器,如果讀取到 NaN(無效值),就印出錯誤訊息並跳過這次上傳。

讀取成功後,程式把溫度和濕度拼接到 ThingSpeak 的 API URL 上,用 HTTP GET 送出,並在序列埠印出結果確認。

大家會發現,這個傳送很簡單,就是API Key,然後再依序寫上要傳的值,就這樣ThinkSpeak就會處理囉!


  HTTPClient http;
  String url = "http://api.thingspeak.com/update?api_key=";
  url += TS_API_KEY;
  url += "&field1=" + String(temp);
  url += "&field2=" + String(humi);
提示:HTTP 回傳 200 代表上傳成功,ThingSpeak 通常會回傳本次是第幾筆資料(例如 42)。如果回傳 0,通常是 API Key 填錯了。

測試驗證

  1. 在 Arduino IDE 開啟序列埠監控視窗(Baud Rate 設為 115200),燒錄程式後應該看到 WiFi 連線訊息。
  2. 等待 15 秒後,應該出現類似下面的輸出:
連線 WiFi......
已連線:192.168.1.105
溫度=28.0°C  濕度=65.0%  HTTP狀態=200
溫度=28.0°C  濕度=65.0%  HTTP狀態=200
  1. 回到 ThingSpeak 網站,進入你的頻道,應該能看到溫度和濕度的折線圖開始出現資料點。

是不是超簡單呢?至於ThinkSpeak更深入的應用就請大家自行​​​研究囉!


常見問題

DHT11 一直顯示「讀取失敗」

先確認接線正確,DATA 腳位是否對應程式中的 DHT_PIN 4。如果是裸 IC 版本,記得要接上拉電阻。另外 DHT11 需要一點暖機時間,上電後第一筆資料有時會讀取失敗,屬於正常現象。

WiFi 一直連不上

確認 SSID 和密碼沒有多餘的空格,ESP32 只支援 2.4GHz 頻段,如果你的路由器是雙頻,確認連線的是 2.4GHz 的網路名稱。

序列埠看起來正常,但 ThingSpeak 沒有資料

最常見的原因是 API Key 填錯了。回到 ThingSpeak 的 API Keys 頁面,確認複製的是「Write API Key」而不是「Read API Key」。


歡迎到傑森創工的粉絲頁留言!

https://www.facebook.com/geeksfans