Tag - 物聯網開發板

【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,然後我們用電腦的網頁瀏覽器,就能即時看到這些數據。

專案硬體準備清單

  1. 主控板: 任何一款 ESP32 開發板 x 1
  2. 感測器: DHT22 溫濕度感測器模組 x 1 (或 DHT11)
  3. 其他: 杜邦線麵包板

軟體與函式庫設定

請確保您的 Arduino IDE 已經安裝了 ESP32 的開發板支援,並透過「程式庫管理員」安裝以下函式庫:

硬體接線指南

接線非常簡單:

  • 將 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(" %");
}

四、驗證成果:在網頁上看到您的即時數據!

這一步是見證奇蹟的時刻!

  1. 上傳完程式碼後,打開 Arduino IDE 的「序列埠監控視窗」,您應該會看到 ESP32 成功連上 Wi-Fi 並開始發送數據。
  2. 在您的電腦瀏覽器上,打開免費的 HiveMQ 線上 MQTT 客戶端
  3. 在連線設定中,確認 Host 是 `broker.hivemq.com`,Port 是 `8000` (for WebSockets),然後點擊 `Connect`。
  4. 連線成功後,在下方的「Subscriptions」區塊,點擊 `+ Add New Topic Subscription`。
  5. 在「Topic」欄位中,輸入 `TaiwanIOT/living_room/#`,然後點擊 `Subscribe`。
    (專家提示: # 是一個「萬用字元」,代表訂閱 `TaiwanIOT/living_room/` 底下所有的子主題。)
  6. 成功! 您現在應該就能在右邊的「Messages」視窗中,看到您的 ESP32 每 5 秒發送一次的即時溫濕度數據了!

五、不只是溫濕度:打開您專案的想像大門!

恭喜您!您已經掌握了將數據上雲的核心技術。現在,您可以將教學中的 DHT22 感測器,替換成任何您感興趣的感測器,打造出更酷、更實用的物聯網應用。以下是一些能激發您靈感的專案方向:

應用一:打造一個智慧空氣品質監測站

應用二:建立一套家庭安全警報系統

應用三:實現一個智慧植物澆水系統

至此,您已成功解鎖了讓裝置「上網說話」的核心技能。從這一刻起,您的專案不再是一座孤島,而是成為了龐大物聯網世界中的一個節點。掌握了 MQTT,您就擁有了通往無數應用的鑰匙——無論是將數據存入資料庫、在手機 App 上顯示,還是觸發 IFTTT 等網路服務,萬物互聯的無限可能正等著您去探索。

本文由 台灣物聯科技 技術團隊,根據多年產業知識與實測經驗分析彙整。

延伸閱讀:從數據上雲到萬物互聯

您已經掌握了將數據「發佈」到雲端的核心技術。現在,是時候探索如何「應用」這些數據,並為您的專案增加更多可能性了。

 什麼是嵌入式系統 (Embedded System)?一篇給新手的白話文終極指南

您是否想過,為什麼智慧手錶能偵測心率?為什麼洗衣機能自動選擇洗衣模式?為什麼汽車的倒車雷達會發出警示聲?這些智慧功能的背後,都藏著一個強大而精巧的大腦——那就是「嵌入式系統 (Embedded System)」。

這篇文章就是一篇為您準備的白話文懶人包,將帶您深入淺出地了解這個無所不在卻又充滿神秘感的科技核心。

一、什麼是嵌入式系統?一個隱藏的專家

簡單來說,嵌入式系統就是一個「為了特定任務而生,被『嵌入』到大型裝置中的微型專用電腦」。

它和我們桌上的個人電腦 (PC) 最大的不同在於:個人電腦是「通用」的,可以用來上網、打遊戲、做報告;而嵌入式系統是「專用」的,它的生命中通常只有一項或幾項特定任務,例如冷氣的嵌入式系統只負責控制溫度,汽車的嵌入式系統只負責處理引擎數據。


二、嵌入式系統的三大核心組成

一個完整的嵌入式系統,主要由三個部分組成,就像一個人的「身體、靈魂與神經」:

  • 🧠 硬體 (Hardware):身體
    核心是一顆被稱為「微控制器 (Microcontroller, MCU)」的晶片,它整合了 CPU、記憶體和各種輸出入接口。這就是系統的「大腦與四肢」。我們熟悉的 ArduinoESP32 開發板,其核心就是一顆微控制器。
  • 💻 軟體 (Software):靈魂
    這是在硬體上運行的程式,也稱為「韌體 (Firmware)」。它定義了嵌入式系統的所有行為和邏輯,告訴硬體在什麼情況下該做什麼事。
  • ⚡ 即時作業系統 (RTOS):神經系統 (選配)
    對於更複雜的系統(例如汽車或工業機器人),還會運行一個 即時作業系統 (Real-Time Operating System)。它負責管理多個任務,並確保最重要的指令能在規定的時間內(例如 0.001 秒內)被執行,就像我們的神經系統能讓我們瞬間做出反應一樣。

三、生活中有哪些嵌入式系統?

事實上,我們每天都被數十個甚至上百個嵌入式系統所包圍:

🏠 消費性電子

智慧手錶、藍牙耳機、數位相機、洗衣機、微波爐、電視遙控器。

🚗 汽車工業

引擎控制單元 (ECU)、防鎖死煞車系統 (ABS)、GPS 導航、倒車雷達。

🏭 工業控制

工廠產線上的機器手臂、CNC 工具機、自動化倉儲系統。

❤️ 醫療設備

心律調節器、血糖監測儀、自動注射泵。


四、如何開始學習嵌入式系統?

學習嵌入式系統最快的方式,就是「動手做」!您完全不需要從打造一顆 CPU 開始。透過像 Arduino 或 Raspberry Pi 這樣的開發平台,您可以直接跳到最有趣的「軟體與應用」層面。

  • 第一步:選擇一塊入門開發板
    我們強烈建議新手從 Arduino Uno 開始。它的社群最大、教學資源最豐富,能讓您在幾小時內就完成第一個專案(例如:點亮一顆 LED),建立巨大的成就感。
  • 第二步:連接感測器與致動器
    為您的開發板裝上「五官」(感測器) 和「手腳」(馬達、繼電器),讓它能與真實世界互動。
  • 第三步:撰寫程式碼
    透過簡單的 Arduino IDE,將您的邏輯寫成程式碼,上傳到開發板中,看著您的想法變成現實!

為了讓您無痛入門,我們也準備了包含所有必需品的「學習教學套件組」,是您踏出第一步的最佳選擇。


五、常見問題 (FAQ)

Q1: Arduino 或 Raspberry Pi 算是嵌入式系統嗎?

A: 是的,它們都是典型的嵌入式系統開發平台。Arduino 是一個微控制器系統,更接近傳統的嵌入式;而 Raspberry Pi 則是一個更強大的微處理器系統,能運行完整的作業系統,屬於高階的嵌入式應用。

Q2: 學習嵌入式系統需要用什麼程式語言?

A: C 和 C++ 是最傳統、最主流的語言。但現在,越來越多的平台(如 ESP32、Raspberry Pi)也支援使用 MicroPython 或 Python,大大降低了學習門檻。

Q3: 嵌入式系統的處理器架構是什麼?

A: 目前絕大多數的嵌入式系統,其核心都採用了 Arm 架構(例如 Cortex-M 系列),以其高效能與低功耗的特性著稱。


本文由 台灣物聯科技 技術團隊,根據多年產業知識與實測經驗分析彙整。

延伸閱讀

Arduino vs. 樹莓派:功能、價格到應用,5 大選擇關鍵一次秒懂!

在 物聯網 (IoT) 與 創客教育 領域,Arduino Uno樹莓派(Raspberry Pi) 是最常被比較的兩大核心開發平台。它們雖然都屬於單板電腦,但骨子裡卻是兩種完全不同的技術架構。

錯誤的選擇會延誤你的專案時程!本文由 台灣物聯科技 專業團隊,從 功能核心、價格、學習門檻、系統架構到實際應用 等 5 個面向,深度解析兩者的核心差異,幫助你 一鍵鎖定 最符合需求的開發板,讓專案即刻啟動。

Arduino Uno 是什麼?

Arduino Uno 是一款基於 ATmega328P 的開放原始碼微控制器開發板,具備簡單的硬體結構與友善的程式語言,適合初學者快速上手。它可透過 USB 傳輸線與電腦連接,使用 Arduino IDE 撰寫程式並上傳。

樹莓派是什麼?

樹莓派是一台完整的 Linux 微型電腦,擁有處理器、記憶體、HDMI、USB 與網路介面。它能執行作業系統、瀏覽網頁、播放影片甚至運行 AI 應用。對於需要更多處理效能或想學習 Linux 系統的使用者來說,是很好的選擇。

核心差異比較表

比較項目 Arduino Uno 樹莓派 (Raspberry Pi)
類型/核心 微控制器 (MCU) 微型電腦 (SBC)
架構 8 位元 64 位元微處理器 (e.g., ARM Cortex-A72)
是否需OS 否(即時反應) (需執行 Linux OS)
主要功能 精準控制 硬體、感測器 複雜運算、系統介面、網路處理
I/O 腳位 20 個數位/類比腳位 40 個 GPIO 腳位
執行方式 單一任務,程式迴圈執行 多工處理,同時運行多個應用
建議專案 燈控、馬達、簡單 IoT 傳感 AI 視覺辨識、伺服器、媒體中心

應用場景與建議

選擇 Arduino Uno 的三大情境:

當專案要求即時反應與硬體控制精度時,請選擇 Arduino Uno。

  1. 即時控制核心: 需要穩定驅動 LED、馬達、繼電器或感測器,且要求毫秒級反應速度。
  2. 極簡系統: 專案無須螢幕介面、不依賴複雜網路協議,追求 低功耗、開機即運作 的穩定性。
  3. 入門教學: 適合初學者進行 程式邏輯啟蒙、硬體接線練習 或 快速原型驗證。

選擇 樹莓派 (Raspberry Pi) 的三大理由:

當專案需要 高效運算 與 豐富介面 時,樹莓派 是你的首選。

  1. 高效運算需求: 涉及 AI 邊緣運算影像/語音串流處理,或需要處理大量資料運算。
  2. 完整電腦介面: 需要 HDMI 顯示輸出、USB 設備連接、Wi-Fi/乙太網路 等完整的電腦功能。
  3. 系統級應用: 打算架設 個人伺服器、監控系統 或進行需要 Linux 作業系統 支援的複雜開發。

台灣物聯科技:我們的專業建議

針對入門者,我們始終建議從 Arduino Uno 原廠開發板 踏出第一步,建立穩固的硬體控制基礎。進階需求或有系統運算目標時,再