【ESP32 教學】MQTT 快速上手:讓你的感測器數據輕鬆上雲端
您是否已經成功地用 ESP32 讀取到了溫濕度、光照度或任何感測器的數據,卻發現這些數據只能孤單地顯示在您電腦的序列埠監控視窗上?您是否夢想著,無論身在何處,都能用手機或電腦,即時查看您遠方裝置的狀態?
如果這正是您的困境,那麼恭喜您,您即將學會物聯網 (IoT) 世界中最核心、最普及的通訊技術——MQTT。這篇文章就是一篇為您準備的終極實戰指南,將帶您從零開始,一步步將您的感測器數據,真正地「發佈」到網際網路的雲端上。
一、MQTT 是什麼?一個超簡單的「郵局佈告欄」比喻
與其陷入複雜的技術定義,不如讓我們用一個簡單的比喻來理解。您可以把 MQTT (Message Queuing Telemetry Transport) 想像成一個雲端上的「郵局佈告欄」系統。
- 佈告欄 (Broker): 這是一台 24 小時運作的雲端伺服器,就像郵局裡那一整排的佈告欄。
- 佈告欄分類 (Topic): 每個佈告欄都有一個獨一無二的「分類主題」,例如 `home/living_room/temperature`。
- 貼公告的人 (Publisher): 您的 ESP32 感測器就是「貼公告的人」。它會將測量到的溫度數據,寫在一張紙條上,然後貼到主題為 `home/living_room/temperature` 的佈告欄上。
- 看公告的人 (Subscriber): 您的手機 App 或電腦程式,就是「看公告的人」。它只需要告訴郵局:「嘿,我對 `home/living_room/temperature` 這個主題的公告有興趣!」從此以後,只要有人在這個佈告欄上貼了新公告,郵局就會自動通知他。
MQTT 的優點: 這個系統非常輕量、高效且可靠,特別適合用在網路不穩定或需要省電的物聯網裝置上。
二、實戰專案:打造一個 MQTT 雲端溫濕度計
我們的目標很簡單:讓 ESP32 每 5 秒讀取一次溫濕度,並透過 MQTT 發佈到一個免費的線上 Broker,然後我們用電腦的網頁瀏覽器,就能即時看到這些數據。
專案硬體準備清單
- 主控板: 任何一款 ESP32 開發板 x 1
- 感測器: DHT22 溫濕度感測器模組 x 1 (或 DHT11)
- 其他: 杜邦線、麵包板。
軟體與函式庫設定
請確保您的 Arduino IDE 已經安裝了 ESP32 的開發板支援,並透過「程式庫管理員」安裝以下函式庫:
PubSubClient by Nick O'Leary(這是與 MQTT Broker 通訊的核心)DHT sensor library by Adafruit
硬體接線指南
接線非常簡單:
- 將 DHT22 的 VCC (電源) 接腳,連接到 ESP32 板上的 3V3。
- 將 DHT22 的 GND (接地) 接腳,連接到 ESP32 板上的 GND。
- 將 DHT22 的 DATA (數據) 接腳,連接到 ESP32 板上的 GPIO 13 (或其他您指定的數位腳位)。
三、完整 Arduino 程式碼範例
將以下程式碼完整複製到您的 Arduino IDE。請務必修改開頭的 `ssid`, `password` 為您自己的 Wi-Fi 資訊。
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
// --- 請在此處修改 ---
const char* ssid = "YOUR_WIFI_SSID"; // 您的 Wi-Fi 名稱
const char* password = "YOUR_WIFI_PASSWORD"; // 您的 Wi-Fi 密碼
// --- MQTT Broker 設定 ---
const char* mqtt_server = "broker.hivemq.com"; // 使用免費的 HiveMQ Broker
const int mqtt_port = 1883;
const char* temperature_topic = "TaiwanIOT/living_room/temperature"; // 溫度的 Topic
const char* humidity_topic = "TaiwanIOT/living_room/humidity"; // 濕度的 Topic
// --- DHT22 設定 ---
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// --- 全域變數 ---
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
dht.begin();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// 每 5 秒讀取一次數據
delay(5000);
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// 將浮點數轉換為字串
char tempString[8];
dtostrf(t, 4, 2, tempString);
char humString[8];
dtostrf(h, 4, 2, humString);
// 發佈到 MQTT Broker
client.publish(temperature_topic, tempString);
client.publish(humidity_topic, humString);
Serial.print("Temperature: ");
Serial.print(tempString);
Serial.println(" *C");
Serial.print("Humidity: ");
Serial.print(humString);
Serial.println(" %");
}
四、驗證成果:在網頁上看到您的即時數據!
這一步是見證奇蹟的時刻!
- 上傳完程式碼後,打開 Arduino IDE 的「序列埠監控視窗」,您應該會看到 ESP32 成功連上 Wi-Fi 並開始發送數據。
- 在您的電腦瀏覽器上,打開免費的 HiveMQ 線上 MQTT 客戶端。
- 在連線設定中,確認 Host 是 `broker.hivemq.com`,Port 是 `8000` (for WebSockets),然後點擊 `Connect`。
- 連線成功後,在下方的「Subscriptions」區塊,點擊 `+ Add New Topic Subscription`。
- 在「Topic」欄位中,輸入 `TaiwanIOT/living_room/#`,然後點擊 `Subscribe`。
(專家提示:#是一個「萬用字元」,代表訂閱 `TaiwanIOT/living_room/` 底下所有的子主題。) - 成功! 您現在應該就能在右邊的「Messages」視窗中,看到您的 ESP32 每 5 秒發送一次的即時溫濕度數據了!
五、不只是溫濕度:打開您專案的想像大門!
恭喜您!您已經掌握了將數據上雲的核心技術。現在,您可以將教學中的 DHT22 感測器,替換成任何您感興趣的感測器,打造出更酷、更實用的物聯網應用。以下是一些能激發您靈感的專案方向:
應用一:打造一個智慧空氣品質監測站
- 所需感測器: PM2.5 粉塵感測器、CO₂ 感測器、VOC 揮發性氣體感測器。
- MQTT Topic 範例:
home/study_room/pm25,home/study_room/co2
應用二:建立一套家庭安全警報系統
- 所需感測器: 人體紅外線感測器 (PIR)、門磁感應開關、聲音感測器 (偵測玻璃破碎聲)。
- MQTT Topic 範例:
home/security/motion_detected,home/security/door_opened
應用三:實現一個智慧植物澆水系統
至此,您已成功解鎖了讓裝置「上網說話」的核心技能。從這一刻起,您的專案不再是一座孤島,而是成為了龐大物聯網世界中的一個節點。掌握了 MQTT,您就擁有了通往無數應用的鑰匙——無論是將數據存入資料庫、在手機 App 上顯示,還是觸發 IFTTT 等網路服務,萬物互聯的無限可能正等著您去探索。
延伸閱讀:從數據上雲到萬物互聯
您已經掌握了將數據「發佈」到雲端的核心技術。現在,是時候探索如何「應用」這些數據,並為您的專案增加更多可能性了。
- 打造您的物聯網儀表板:將 MQTT 數據可視化 (Home Assistant/Node-RED)
學習如何將您剛剛發送的溫濕度數據,呈現在一個酷炫的、客製化的網頁儀表板上。 - 為您的 MQTT 專案增加更多「五官」:探索所有感測器模組
學會了 MQTT,您就可以連接任何感測器!探索 PM2.5、CO₂、光照度等各式感測器,打造更豐富的應用。 - 回歸基礎:物聯網 (IoT) 的世界觀是什麼?
深入了解 MQTT 在整個物聯網架構中扮演的關鍵角色。
