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 等網路服務,萬物互聯的無限可能正等著您去探索。

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

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

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

LoRa 無線傳輸模組 SX1278/1276 LoRa 8000m擴頻技術

【ESP32 教學】打造 LoRa 超長距離無線感測器 (附完整程式碼)

您是否曾經想打造一個能覆蓋整座農場、整棟廠房,甚至穿越山谷的無線感測網絡,卻總是苦於市面上 Wi-Fi 或藍牙模組那短短數十公尺的「訊號距離」限制?

這篇文章,就是為了解決這個核心痛點而生。我們將帶您使用兩大神器——ESP32 開發板 的超低功耗模式,以及傳輸距離遠達 8 公里E32 系列 LoRa 無線模組,一步步打造一個真正能實現超長距離通訊的無線感測節點。

  • 專案目標: 打造一個由電池供電的 LoRa 無線溫濕度感測器。
  • 核心功能: 每 10 分鐘自動發送一次數據,然後進入深度睡眠以節省電力。
  • 所需時間: 約 30 分鐘。
  • 技術難度: ★★☆☆☆ (初學者友好)

一、為什麼選擇 ESP32 + E32 LoRa 模組?

  • ESP32 的「深度睡眠 (Deep Sleep)」模式:樂鑫科技 (Espressif) 開發,內建超低功耗模式,可將電池壽命延長數月甚至數年。
  • E32 LoRa 模組的「超長距離」與「簡易 UART」特性: 這款 1W (30dBm) 高功率 LoRa 模組,採用 UART 串列埠通訊,接線和程式設計遠比傳統的 SPI 介面更簡單。

二、專案實作:從零件到成果的完整步驟

步驟一:硬體準備

  1. 主控板: Arduino Nano ESP32 開發板 x 1 (或其他您偏好的 ESP32 開發板)
  2. LoRa 模組: LoRa 無線傳輸模組 (1W 30dBm) x 2 (發送端與接收端各需一片)
  3. 感測器: DHT22 溫濕度感測器模組 x 1
  4. 電源: 3.7V 鋰聚合物電池 (LiPo) x 1 (選配)
  5. 其他: 杜邦線麵包板

關於電池供電的選擇

我們推薦的 Arduino Nano ESP32 是一塊功能強大且小巧的開發板,但請注意它沒有內建鋰電池充電接口。如果您希望打造一個可重複充電的裝置,建議您可以選擇帶有電池座或充電電路的 ESP32 開發板,或是額外搭配一片 TP4056 鋰電池充電模組 來使用。

步驟二:軟體與函式庫設定

請確保您的 Arduino IDE 已經安裝了 ESP32 的開發板支援。由於我們選用的 E32 LoRa 模組是透過 UART 通訊,我們不需要安裝任何複雜的第三方 LoRa 函式庫!您唯一需要安裝的,只有感測器的函式庫:

步驟三:硬體接線

由於採用 UART 介面,接線變得非常簡單!我們將使用 ESP32 的第二組硬體序列埠 (Serial2)。

E32 LoRa 模組 ESP32 開發板 說明
VCC 5V / 3V3 電源 (請參考模組規格)
GND GND 接地
RXD GPIO 17 (TX2) 接收端 ↔️ ESP32 的發送端
TXD GPIO 16 (RX2) 發送端 ↔️ ESP32 的接收端
M0 GND 設為傳輸模式 (接地)
M1 GND 設為傳輸模式 (接地)
DHT22 DATA GPIO 13 DHT22 感測器數據線

【接線防呆提示】 UART 通訊就像兩個人說話,A 的嘴巴 (TX) 要對著 B 的耳朵 (RX),B 的嘴巴 (TX) 則要對著 A 的耳朵 (RX)。所以接線時,請務必將模組的 TXD 接到 ESP32 的 RX2,模組的 RXD 接到 ESP32 的 TX2,交叉連接!

⚠️ 【重要】請確認您的 LoRa 頻率!

這款模組提供 433MHz、868MHz、915MHz 等多種頻率版本,它們無法互相通訊!請務必確認您的「發送端」和「接收端」使用的是完全相同頻率的模組。

步驟四:上傳程式碼 (發送端)

將以下程式碼上傳到您的 ESP32 開發板。它會讀取 DHT22 數據,透過 LoRa 發送,然後讓 ESP32 進入深度睡眠 10 分鐘。


#include <HardwareSerial.h>
#include "DHT.h"

// --- E32 LoRa (UART) ---
HardwareSerial LoRaSerial(2); // 使用 ESP32 的 Serial2 (GPIO 16, 17)

// --- DHT22 設定 ---
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

// --- Deep Sleep 設定 ---
#define uS_TO_S_FACTOR 1000000ULL
#define TIME_TO_SLEEP  600         // 睡眠 600 秒 (10 分鐘)

void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println("ESP32 LoRa Long-Range Sensor Node");

  LoRaSerial.begin(9600);
  dht.begin();
  delay(1000); // 等待感測器穩定
  
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("Failed to read from DHT sensor!");
  } else {
    String dataToSend = "Temperature: " + String(temperature, 2) + " C, Humidity: " + String(humidity, 2) + " %";
    Serial.print("Sending data: ");
    Serial.println(dataToSend);
    LoRaSerial.println(dataToSend);
  }
  
  Serial.println("Going to sleep now for 10 minutes...");
  Serial.flush(); 
  
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  esp_deep_sleep_start();
}

void loop() {
  // This part is not executed after deep sleep
}

步驟五:上傳程式碼 (接收端) 與最終測試

光有發送端還不夠,我們還需要一個接收端來驗證訊號是否成功發出。請將以下程式碼,上傳到您作為「接收端」的另一塊 ESP32 開發板上(接線方式與發送端相同,但可以不接 DHT22)。


#include <HardwareSerial.h>

HardwareSerial LoRaSerial(2);

void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println("ESP32 LoRa Receiver");
  LoRaSerial.begin(9600);
}

void loop() {
  if (LoRaSerial.available()) {
    String receivedData = LoRaSerial.readString();
    Serial.print("Received packet: '");
    Serial.print(receivedData);
    Serial.println("'");
  }
}

完成後,為您的發送端接上電池,並將接收端連接到電腦。打開 Arduino IDE 的序列埠監控視窗,您應該就能每 10 分鐘看到一次從遠方傳來的溫濕度數據了!


透過本篇教學的實作,您會發現,使用 UART 介面的高功率 LoRa 模組,其價值不僅在於強大的傳輸距離,更在於它極大地簡化了開發流程。這意味著您可以從複雜的底層通訊中解放出來,更專注於應用本身的創新,將您的物聯網創意,真正部署到任何過去訊號無法到達的角落。

本文由 台灣物聯科技 技術團隊,根據自家販售產品實測經驗分析彙整。

延伸閱讀

 什麼是嵌入式系統 (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 系列),以其高效能與低功耗的特性著稱。


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

延伸閱讀

MediaTek Labs生態系統 昔日「Arduino 殺手」的殞落與重生:聯發科 LinkIt 十年回顧與現代 IoT 選型指南

昔日「Arduino 殺手」的殞落與重生:聯發科 LinkIt 十年回顧與現代 IoT 選型指南

編輯前言:聯發科 IoT 佈局十年啟示錄

本文記錄了 2015 年聯發科 (MediaTek) 推出 LinkIt 平台挑戰 Arduino 霸主地位的歷史時刻。雖然 LinkIt ONE 產品週期已結束,但其強調「連網能力」「商業化生態系」的戰略思維,至今仍深深影響著 AIoT 產業。文末我們特別整理了「後 LinkIt 時代」的替代方案推薦,幫助開發者找到最適合當下的開發板。

聯發科 LinkIt 開放硬體戰略回顧:如何從 Arduino 殺出一條血路?

相較於開放硬體霸主 Arduino,聯發科雖然是當年的後起之秀,但在物聯網商業化競爭領域,卻展現了低功耗且具連網能力的優勢,以 LinkIt 做為開放硬體核心,加速物聯網的創新與布局。

「Arduino並不適合做IoT!」聯發科技創意實驗室副總裁那馬可(Marc Naddell)一句話,便點出聯發科技創意實驗室(MediaTek Labs)提供的開放硬體所欲解決的市場困境。

聯發科 LinkIt 開發板歷史照片

圖:當年紅極一時的 LinkIt ONE 開發板,整合了 GPS、Wi-Fi 與 GSM 功能。

當年痛點:Arduino 連網能力不足

執掌聯發科技創意實驗室兵符的那馬可,在 2014 年中國行動開發者大會(MDCC 2014)曾發表題為〈以小搏大〉(Make it Big with Something Small)的演講。他指出,雖然 Arduino 獨霸山頭,但當開發者想要走向商用市場時,會面臨無線連網能力不足的挑戰。

「想讓 Arduino 連網?你得買擴充板。想要 GPS?再買一塊擴充板。」這種疊床架屋的設計,正是 LinkIt 平台想要解決的問題——提供一個All-in-One (全功能整合) 的低功耗解決方案。

2025 年技術觀點:誰繼承了 All-in-One 的精神?

當年 LinkIt 試圖解決的「連網碎片化」問題,如今已被新一代的 SoC 完美解決。現在的開發者不再需要堆疊擴充板,因為像 ESP32 這樣的晶片,已經將 Wi-Fi + 藍牙雙模直接整合在幾百塊台幣的板子上。

當年的挑戰者:LinkIt ONE

  • 整合 GPS/Wi-Fi/GSM
  • 價格較高
  • 生態系封閉
現代的繼承者:ESP32 / Filogic

  • 整合 Wi-Fi 6 / BLE 5.0
  • 價格極親民
  • 支援 Arduino IDE / MicroPython

查看 ESP32 系列推薦 →

公板模式的成功複製:從山寨到創新

LinkIt 平台的推出,沿襲自聯發科成功的「公板」(Reference Board)商業模式。這種模式曾讓大量的白牌手機崛起,如今聯發科希望將其複製到物聯網領域,協助開發者從「原型 (Prototype)」快速跨越到「量產 (Production)」。

這正是聯發科與 Arduino、Raspberry Pi 最大的不同:聯發科看重的是最後的商業化量產,而不僅僅是教育或娛樂。

合作夥伴加持:縮短 Start-up 陣痛期

王惟德觀察,一個新創產品從募資到量產,平均需要一年,且延遲上市的機率高達 80%。主要原因是開發者缺乏硬體量產經驗。聯發科透過「合作夥伴服務計畫」(MediaTek Partner Connect),媒合開發者與供應鏈,這是軟體公司(如 Google)難以做到的硬體優勢。

MediaTek Labs 生態系統圖解

圖:MediaTek Labs 當年建構的完整生態系統


總結:給現代開發者的選型建議

雖然 LinkIt ONE 已經停產,但聯發科依然在 AIoT 領域由 Genio (AI 運算)Filogic (無線連網) 系列延續香火。對於現在想要開發物聯網裝置的工程師,我們建議:

(本文部分內容轉載自《數位時代》第252期,並由台灣物聯科技編輯部增修 2025 年最新產業觀點。原文連結:數位時代
IoT

本文作者:台灣物聯科技 產業分析團隊

我們專注於 IoT 硬體趨勢研究,從早期的 LinkIt 到現在的 AIoT 邊緣運算,見證了台灣產業的每一次典範轉移。致力於提供開發者最精準的選型建議。