從 Node-RED 安裝、MQTT 節點串接,到建立即時儀表板,將 Raspberry Pi、ESP32、Pico W 的資料視覺化。
很適合搭配 MQTT 課程,讓學生從通訊協定一路看到應用層展示。
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
sudo apt update
sudo apt install -y nodejs npm
sudo npm install -g --unsafe-perm node-red
node-red
開啟瀏覽器:
http://樹莓派IP:1880
sudo systemctl enable nodered.service
sudo systemctl start nodered.service
sudo systemctl status nodered.service
如果 Node-RED 不只是本機或同一個區域網路使用,而是要讓教室外、家中或其他網段的裝置連線,除了知道 IP 位置之外,還要先完成 Node-RED 與主機端的網路與安全設定。
編輯 ~/.node-red/settings.js,確認 uiHost 不是只有綁在 127.0.0.1:
uiHost: "0.0.0.0",
uiPort: process.env.PORT || 1880,
這樣 Node-RED 才能接受其他電腦或手機連進來。若仍是 127.0.0.1,就只能本機開瀏覽器存取。
node-red-restart
# 或
sudo systemctl restart nodered.service
1880 port1880若 Node-RED 要給遠端使用,不建議裸露未保護的編輯介面。可在 settings.js 設定 adminAuth:
adminAuth: {
type: "credentials",
users: [{
username: "teacher",
password: "請改成雜湊後密碼",
permissions: "*"
}]
},
如果只要讓學生看儀表板而不是修改流程,可提供:
http://主機公開IP或網域名稱:1880/ui
若要進入編輯畫面則是:
http://主機公開IP或網域名稱:1880
mqtt in / mqtt out 節點中的 Broker 位址不能再填 localhostNode-RED 常搭配 Mosquitto 使用。若先前已在 Raspberry Pi 安裝 Mosquitto,可先測試:
mosquitto_sub -h localhost -t iot/ece2026/test
mosquitto_pub -h localhost -t iot/ece2026/test -m "hello from mosquitto"
若 Broker 在另一台機器,請把 localhost 改成該 Broker IP。
| 區域 | 用途 |
|---|---|
| 左側節點區 | 拖拉各類功能節點 |
| 中央工作區 | 建立流程圖 |
| 右側 debug 區 | 查看訊息輸出與除錯資訊 |
| Deploy 按鈕 | 部署目前流程 |
接收來自 Pico W 或 ESP32 的資料,然後在 debug 視窗顯示。
mqtt indebugmqtt in 節點到工作區192.168.1.1201883iot/ece2026/#debug 節點,連接到 mqtt in# 萬用字元,就可以一次接收整個課堂主題底下的訊息。新版 Node-RED 儀表板可使用 node-red-dashboard 或新版 dashboard 套件。教學上可先用經典版。
Manage paletteInstallnode-red-dashboardcd ~/.node-red
npm install node-red-dashboard
node-red-restart
# 或
sudo systemctl restart nodered.service
接收例如 iot/ece2026/picow/temp 的資料,並顯示在儀表板中。
mqtt injson 或 functionui_gaugeui_chartdebug可直接接到儀表板元件。
{"temp": 27.5, "humidity": 61}
let data = JSON.parse(msg.payload);
msg.payload = data.temp;
return msg;
http://樹莓派IP:1880/ui
可建立多個群組,例如:
| 元件 | 用途 |
|---|---|
ui_gauge | 顯示溫度、濕度等單一數值 |
ui_chart | 顯示時間序列變化 |
ui_text | 顯示狀態字串 |
ui_switch | 發送開關控制訊號 |
ui_button | 按鈕控制 |
這個範例很適合做 LED 開關控制。
ui_switch 或 ui_buttonchange 或 functionmqtt outiot/ece2026/picow/led
ON
OFF
if (msg.payload === true) {
msg.payload = "ON";
} else {
msg.payload = "OFF";
}
return msg;
裝置端只要訂閱控制 topic,例如:
iot/ece2026/picow/led
iot/ece2026/esp32/led
收到 ON 時點亮 LED,收到 OFF 時熄滅 LED。
mqtt in 訂閱 iot/ece2026/picow/tempui_gauge 顯示溫度ui_chart 畫趨勢debug 方便除錯ui_switchmqtt out 把控制訊息送到 LED topic以下是一個簡化示意,可在 Node-RED 用 Import 匯入後再修改 Broker 與 Dashboard 設定。
[
{
"id": "mqtt_in_temp",
"type": "mqtt in",
"topic": "iot/ece2026/picow/temp",
"broker": "broker_1",
"x": 180,
"y": 100,
"wires": [["debug_1", "gauge_1"]]
},
{
"id": "debug_1",
"type": "debug",
"x": 430,
"y": 80,
"wires": []
},
{
"id": "gauge_1",
"type": "ui_gauge",
"name": "Temperature",
"group": "group_1",
"order": 1,
"x": 430,
"y": 130,
"wires": []
}
]
若裝置送出:
{"temp":28.2,"humidity":64,"light":731}
可用 function 節點拆出不同欄位:
let data = JSON.parse(msg.payload);
return [
{ payload: data.temp },
{ payload: data.humidity },
{ payload: data.light }
];
然後連接到 3 個不同的 Dashboard 元件。
file 節點寫到 CSV| 問題 | 原因 | 建議 |
|---|---|---|
| Node-RED 無法連到 MQTT Broker | IP 或 Port 錯誤 | 確認 Broker 設定與網路連線 |
| 遠端瀏覽器無法開啟 Node-RED 頁面 | uiHost 仍綁在 127.0.0.1、防火牆未開放或未做 port forwarding | 檢查 settings.js、TCP 1880、防火牆與路由器設定 |
| Dashboard 沒資料 | Topic 不一致 | 確認裝置端與 Node-RED 使用同一 topic |
| ui 元件沒出現 | 尚未安裝 dashboard 套件 | 安裝 node-red-dashboard |
| Deploy 後無反應 | 流程未正確連線 | 檢查節點是否已連接並查看 debug 視窗 |
| 控制 LED 無效 | 裝置未訂閱控制 topic | 檢查 Pico W / ESP32 的 subscriber 程式 |
Node-RED 很適合做為 IoT 課程中的「看得見成果」平台,讓抽象的網路通訊變成學生能操作、能觀察、能除錯的完整系統。
搭配 MQTT、Pico W、ESP32,幾乎就能構成一套非常完整的物聯網教學鏈。