2026年11月11日 星期三

【ESP32 物聯網實戰 07】上雲:串接 ThingSpeak,建置雲端即時數據戰情室

在上一篇中,我們學會了使用 MQTT 協定將 ESP32 的數據發布到網路上。然而,如果只是看著終端機裡不斷跳動的純文字數字,對於非技術背景的使用者(如企業主管或農場主人)來說,是很難一眼看出趨勢與異常的。

這正是「資料視覺化 (Data Visualization)」發揮價值的時刻!今天,我們將把 ESP32 採集到的溫濕度數據,打通至全球知名的免費物聯網平台 —— ThingSpeak。我們將學習使用 HTTP Web API,把冷冰冰的數字轉化為雲端網頁上精美的即時折線圖,打造屬於你自己的專屬數據戰情室!

1. 觀念解析:什麼是 ThingSpeak 與 HTTP Web API?

ThingSpeak 是由 MathWorks(開發 MATLAB 的公司)所建立的物聯網分析平台。它允許我們在雲端建立「頻道 (Channel)」來聚合即時資料流,並自動幫我們畫成圖表。

為了把資料送到 ThingSpeak,我們這次將採用網頁開發中最經典的 HTTP Web API (RESTful API)。你可以把它想像成在瀏覽器輸入一段網址,只是我們現在是用 ESP32 用程式碼「默默地」去瀏覽這段網址,並把溫濕度數據當作「參數」夾帶在網址後面傳送出去。

ESP32 串接 ThingSpeak 雲端戰情室架構 📟 Edge Node (ESP32 邊緣節點) T: 26 H: 60 HTTP GET ?api_key=XYZ... &field1=26&field2=60 ☁️ ThingSpeak (雲端分析平台) 🔑 API Key 驗證 雲端戰情室 Dashboard Field 1 (Temperature) Field 2 (Humidity) ▲ 流程:ESP32 封裝感測數據 ➔ 透過 HTTP GET 發送 API 請求 ➔ ThingSpeak 儲存並繪製圖表
▲ ThingSpeak 雲端資料流與 HTTP API 運作架構

2. 雲端前置作業:建立 ThingSpeak Channel

在開始寫程式之前,我們必須先去雲端「開好房間」等待數據送來:

  1. 前往 ThingSpeak 官網,註冊一組免費帳號(需使用信箱驗證)。
  2. 登入後,點擊 New Channel 建立新頻道。
  3. 填寫頻道名稱(例如:資管系溫濕度監測站)。最重要的是下方欄位:勾選 Field 1 並命名為 Temperature,再勾選 Field 2 命名為 Humidity。最後點擊 Save Channel。
  4. 進入頻道後,切換到 API Keys 標籤頁。請找到並複製你的 「Write API Key」,這串亂碼是你 ESP32 上傳數據的「專屬密碼」,請妥善保存。

3. ESP32 實作:使用 urequests 發送 HTTP 請求

在 MicroPython 中,要發出網路請求非常簡單,我們只需要用到內建的 urequests 模組。請將 DHT11 溫濕度感測器接在 GPIO 4,接著在 Thonny 輸入以下程式碼:

import network
import urequests
import dht
from machine import Pin
import time

# --- 1. 基本設定 ---
SSID = "Your_WiFi_SSID"
PASSWORD = "Your_WiFi_Password"
# 將剛剛在 ThingSpeak 複製的 Write API Key 貼在下方
API_KEY = "請替換成你的_Write_API_Key"  

sensor = dht.DHT11(Pin(4))

# --- 2. 連線 Wi-Fi ---
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
print("連線 Wi-Fi 中...")
while not wlan.isconnected():
    time.sleep(0.5)
print("連線成功!IP:", wlan.ifconfig()[0])

# --- 3. 持續採集與上傳 ---
while True:
    try:
        # 讀取溫濕度
        sensor.measure()
        t = sensor.temperature()
        h = sensor.humidity()
        print(f"目前溫度: {t}°C, 濕度: {h}%")
        
        # 組合 ThingSpeak 的 Web API 網址
        # 格式:https://api.thingspeak.com/update?api_key=你的金鑰&field1=溫度&field2=濕度
        url = f"https://api.thingspeak.com/update?api_key={API_KEY}&field1={t}&field2={h}"
        
        # 發送 HTTP GET 請求
        print("正在上傳至 ThingSpeak...")
        response = urequests.get(url)
        
        # 關閉連線釋放記憶體
        response.close()
        print("上傳成功!\n")
        
    except OSError as e:
        print("感測器讀取失敗,或網路連線異常:", e)
        
    # 💡 ThingSpeak 免費版限制:兩筆資料上傳間隔必須大於 15 秒!
    # 為了保險起見,我們設定等待 20 秒
    time.sleep(20)

4. 經驗傳承:速率限制與強健性 (Robustness)

當你執行上述程式碼後,切換回電腦瀏覽器的 ThingSpeak 頁面,點擊 Private View。你會驚喜地發現,畫面上的兩張折線圖已經開始根據 ESP32 傳來的數據自動更新了!你完成了從硬體端到雲端資料庫的 End-to-End 整合!

💡 開發小提醒: 請特別留意程式碼結尾的 time.sleep(20)。許多初學者會把等待時間設為 1 秒或 5 秒,這會導致 ThingSpeak 拒絕接收資料(免費版有嚴格的 15 秒 Rate Limit)。學會閱讀並遵守各個雲端 API 的「速率限制文件」,是資管系學生與系統工程師的必修課。

5. 課後小結

今天,我們學會了使用 HTTP Web API 來傳輸數據,並成功在 ThingSpeak 上建置了雲端戰情室。這些長期的歷史資料,未來甚至能匯出成 CSV,完美對接我們之前學過的 PySpark 大數據分析系列!

然而,儀表板通常是給人「被動」去觀看的。如果溫室的溫度突然飆高,農夫不可能 24 小時都盯著螢幕。因此,在下一篇文章中,我們將為這套物聯網系統加入「主動預警」機制:串接 LINE Notify。一旦溫度超標,裝置將會自動發送警報訊息到你的 LINE 手機裡!

沒有留言:

張貼留言

熱門文章