如何開始建置 MQTT 環境感測器模擬系統

如何開始建置 MQTT 環境感測器模擬系統

在物聯網 (IoT) 專案中,將感測器數據發送到雲端是第一步。本文將說明如何開始建立一個環境感測器模擬器,將溫度與濕度資料傳送到 MQTT 伺服器 (broker.makdev.net),及 Dahboard 發生作用。我們將介紹兩種最常見的入門方式:使用 Node-RED 軟體模擬,以及使用 Arduino/微控制器硬體實作。及理解Topic 的用法


方法一:使用 Node-RED 快速建立軟體模擬流程

如果您還沒有硬體設備,Node-RED 是最快開始的方式。您可以建立一個視覺化流程,定期產生隨機的溫濕度數據並推送到 MQTT 伺服器。

Timestamp (10s) Function (溫濕度) MQTT Out broker.makdev.net
圖 1:Node-RED MQTT 模擬流程圖 (每 10 秒觸發 -> Function 生成數據 -> 輸出 MQTT)

1. 建立參數化 Function 節點

在 Node-RED 中,透過 Inject 節點設定每 10 秒觸發一次,並透過 Function 節點來自動組合發布主題 (Topic) 並產生隨機的溫濕度資料 [1]。這使得未來更換測試帳號變得非常容易。核心程式碼如下:

// 1. 參數化定義 (未來要換人測試,只要改這三行)
const USER_ID = "your_account";   // 你的租戶 ID
const DEVICE_ID = "device_v1";    // 設備編號
const SENSOR_TYPE = "env";        // 感測器類型

// 2. 自動組合 Topic (嚴格遵守 +/+/+ 規則)
msg.topic = `${USER_ID}/${DEVICE_ID}/${SENSOR_TYPE}`;

// 3. 產生模擬數據
let temp = (Math.random() * (35 - 20) + 20).toFixed(1);
let humi = (Math.random() * (90 - 50) + 50).toFixed(1); 

// 4. 設定標準化 Payload
msg.payload = {
    "temperature": parseFloat(temp),
    "humidity": parseFloat(humi)
};

return msg;

2. 設定輸出格式與 MQTT 伺服器

上述程式碼將會輸出如 {"temperature":23.5,"humidity":56.4} 的 JSON 格式 [1]。最後,將此資料連接至 MQTT Out 節點,並將 Broker 設定為 broker.makdev.net,通訊埠設為 1883,即可完成資料發送 [1]。


方法二:使用 Arduino 進行硬體程式模擬

如果您想透過實際的微控制器來模擬,可以使用 C++ 撰寫程式碼並結合 WiFi (WiFi.h) 與 MQTT (PubSubClient.h) 函式庫 [2]。

Arduino WiFi 連線 SSID: your_ssid MQTT Broker broker.makdev.net Topic: .../room1/env
圖 2:開發板與 WiFi 網路連線示意

1. 基礎連線設定

首先,您必須設定 wifiClientmqttClient [2],並填寫您的 WiFi SSID、密碼,以及 IoT 平台的 MQTT 帳號密碼,並設定發布主題(請注意將 <your_account> 替換為實際帳號) [3]:

char ssid[] = "your_ssid";         // WiFi SSID
char pass[] = "your_password";     // WiFi 密碼
char username[] = "your_account";  // IoT平台帳號
char password[] = "your_password"; // IoT平台密碼
char mqttServer[] = "broker.makdev.net";
char publishTopic[] = "<your_account>/room1/env";   //修改為您的帳號

程式同時包含自動重連機制 reconnectWiFi()reconnectMQTT() [3],並且於 loop() 迴圈中檢查,確保設備在斷線時能自動恢復連線 [4]。

2. 模擬異常高溫數據 (Grafana 測試用)

為了讓後續在 Grafana 等儀表板上的曲線看起來更真實,程式碼中實作了一個進階的模擬機制 USE_ERROR_TEMPLATE [2, 5]。此機制會每 5 秒發送一次資料,並且每 10 分鐘內會有 5 分鐘處於「異常高溫期」,隨機產生 36.5°C ~ 38.0°C 的高溫 [5]:

// 每 5 秒發送一次 MQTT
if (millis() - lastMQTTSendTime >= MQTT_SEND_INTERVAL) {
  lastMQTTSendTime = millis();

  #ifdef USE_ERROR_TEMPLATE
  // ==========================================
  // 模擬異常高溫情況,持續 10 分鐘,每 5 分鐘有 5 分鐘的異常高溫
  // ==========================================
  if ((millis() % 600000) > 300000) { 
    // 隨機產生 36.5°C ~ 38.0°C 的異常高溫,讓 Grafana 曲線看起來更真實
    temperature = 365 + (random(0, 16)); // 36.5 + 0.0 ~ 1.5
    Serial.println("[模擬測試] 目前處於 5 分鐘高溫異常期!");
  }
  #endif
}

結語與下一步

無論您選擇 Node-RED 還是微控制器硬體,只要確保 Topic 格式正確且成功連上 broker.makdev.net,資料就會源源不絕地送往伺服器。下一步,您可以開始配置您的儀表板(如 Grafana)來訂閱這些主題並進行數據視覺化了!