ESP32 + DHT11 溫濕度上傳 ThingSpeak 雲端監控
使用 ESP32 搭配 DHT11 溫濕度感測器,透過 WiFi 連線將量測資料每 15 秒自動上傳至 ThingSpeak 雲端平台,只需修改三行設定即可完成,並附有接線說明、常見問題排查與延伸應用方向。
用 ESP32 讀取溫濕度只是第一步。如果想要隨時查看歷史趨勢、甚至讓家人也能看到資料,就需要把數據上傳到雲端平台。ThingSpeak 是一個極受歡迎,且免費的 IoT 雲端服務,支援資料圖表顯示,而且完全不需要架設自己的伺服器,非常適合初學者使用。
這篇教學會帶你從申請帳號、接線、到撰寫程式,一步一步完成這個專案。
注意:ThingSpeak 免費版每 15 秒才能上傳一次資料,範例程式中已設定好這個間隔,不需要額外調整。
準備材料
| 材料 | 數量 | 備註 |
|---|---|---|
| ESP32 開發板 | ×1 | 任何版本皆可 |
| DHT11 感測器 | ×1 | 裸 IC 或模組版皆可 |
| 杜邦線 | 若干 |


硬體接線
| DHT11 腳位 | ESP32 腳位 | 說明 |
|---|---|---|
| VCC | 3.3V | 供電 |
| GND | GND | 接地 |
| DATA | GPIO 4 | 資料訊號(程式中的 DHT_PIN) |
申請 ThingSpeak 並建立頻道
- 前往 thingspeak.com,點擊「Get Started For Free」,用 MathWorks 帳號或 Email 免費註冊。



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

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

4.進入頻道後點 API Keys 分頁,複製 Write API Key,等一下要貼到程式裡。
提示:Write API Key 是讓 ESP32 上傳資料的憑證,不要分享給別人。如果不小心外流,可以在同一頁面重新產生。

安裝需要的函式庫
開啟 Arduino IDE,進入「草稿碼 → 匯入函式庫 → 管理函式庫」,搜尋並安裝以下:
- DHT sensor library(Adafruit)— 用來讀取 DHT11 感測器
- Adafruit Unified Sensor — DHT 函式庫的相依套件
- 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 填錯了。
測試驗證
- 在 Arduino IDE 開啟序列埠監控視窗(Baud Rate 設為 115200),燒錄程式後應該看到 WiFi 連線訊息。
- 等待 15 秒後,應該出現類似下面的輸出:
連線 WiFi......
已連線:192.168.1.105
溫度=28.0°C 濕度=65.0% HTTP狀態=200
溫度=28.0°C 濕度=65.0% HTTP狀態=200
- 回到 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