Node-RED 提供了友善的視覺化介面,方便快速搭建家居自動化系統。本文將逐步說明如何安裝 Node-RED Dashboard,並使用按鈕、開關等節點控制根據 MQTT 的家居裝置。我們會以 Wemos D1 mini 作為範例,示範如何發布 MQTT 訊息來觸發 Node-RED 流程,並進一步控制其他裝置,例如 Sonoff 網路開關。此外,文章也會涵蓋如何使用 Arduino IDE 編寫程式碼,讓 Wemos D1 mini 與按鈕互動,以及如何透過 Raspberry Pi 與 Arduino 的整合,利用 PyFirmata 程式函式庫控制 Arduino 板的數位和類別比輸入輸出。最後,我們會討論如何設定 MQTT 伺服器、主題和訊息,以及如何在 Node-RED 流程中使用 JavaScript 程式碼實作更進階的邏輯控制,例如狀態切換。

安裝 Node-RED Dashboard 並控制家居自動化系統

要安裝 Node-RED Dashboard,您需要執行以下命令:

sudo systemctl stop nodered.service
apt-get update
cd ~/.node-red
sudo apt-get install npm
npm install node-red-dashboard
sudo systemctl start nodered.service

安裝完成後,您將在 Node-RED 中看到一個新的節點類別,稱為「Dashboard」。

使用按鈕節點控制家居自動化系統

您可以使用按鈕節點(Button node)來控制家居自動化系統。以下是使用按鈕節點的流程:

  1. 匯入流程:您可以從 Recipe 17.2 匯入流程。
  2. 新增按鈕節點:新增一個按鈕節點到您的流程中。
  3. 設定按鈕節點:設定按鈕節點的屬性,例如按鈕文字、按鈕型別等。
  4. 連線 MQTT 節點:連線按鈕節點到 MQTT 節點,以便控制家居自動化系統。

使用 Dashboard 控制家居自動化系統

您可以使用 Dashboard 來控制家居自動化系統。以下是使用 Dashboard 的步驟:

  1. 啟動 Node-RED:啟動 Node-RED 服務。
  2. 開啟 Dashboard:開啟瀏覽器,輸入 Raspberry Pi 的 IP 地址加上 :1880/ui
  3. 檢視 Dashboard:檢視 Dashboard 介面,應該可以看到按鈕和其他控制元件。

新增開關節點

您可以新增開關節點(Switch node)來控制家居自動化系統。以下是新增開關節點的步驟:

  1. 新增開關節點:新增一個開關節點到您的流程中。
  2. 設定開關節點:設定開關節點的屬性,例如開關文字、開關型別等。
  3. 連線 MQTT 節點:連線開關節點到 MQTT 節點,以便控制家居自動化系統。

使用排程事件

您可以使用排程事件(Inject node)來執行特定動作。以下是使用排程事件的步驟:

  1. 新增排程事件節點:新增一個排程事件節點到您的流程中。
  2. 設定排程事件節點:設定排程事件節點的屬性,例如觸發時間、觸發間隔等。
  3. 連線 MQTT 節點:連線排程事件節點到 MQTT 節點,以便控制家居自動化系統。

圖表翻譯:

  flowchart TD
    A[開始] --> B[新增按鈕節點]
    B --> C[設定按鈕節點]
    C --> D[連線 MQTT 節點]
    D --> E[啟動 Node-RED]
    E --> F[開啟 Dashboard]
    F --> G[檢視 Dashboard]

內容解密:

以上流程展示瞭如何使用 Node-RED Dashboard 來控制家居自動化系統。首先,需要安裝 Node-RED Dashboard 並匯入流程。然後,新增按鈕節點和開關節點,並設定其屬性。接著,連線 MQTT 節點以便控制家居自動化系統。最後,啟動 Node-RED 服務,開啟 Dashboard 介面,並檢視控制元件。

使用ESP8266發布MQTT訊息

您想要使用低成本的可程式化WiFi板,例如Wemos D1,來發布MQTT訊息,當按鈕被按下時。

解決方案

使用Wemos D1板,並安裝自訂軟體。以下是Wemos D1板與Squid按鈕的連線示意圖:

當按鈕被按下時,Wemos D1板會發布一條MQTT訊息到指定的MQTT伺服器。

所需材料

  • Wemos D1 mini板
  • Squid按鈕
  • USB電源或其他電源供應器

步驟

  1. 安裝Arduino IDE並新增ESP8266的支援。
  2. 連線Squid按鈕到Wemos D1板的D6腳位和GND腳位。
  3. 下載MQTT函式庫並安裝到Arduino IDE中。
  4. 開啟Arduino IDE,開啟 sketch,並設定板型為Wemos D1,序列埠為/dev/ttyUSB0。
  5. 修改 sketch 中的 WiFi 設定、MQTT 伺服器 IP 地址和其他相關設定。
  6. 上傳 sketch 到 Wemos D1 板。
  7. 測試按鈕是否能夠發布 MQTT 訊息。

討論

此解決方案使用 ESP8266 板發布 MQTT 訊息,當按鈕被按下時。MQTT 函式庫提供了一個簡單的方式來發布 MQTT 訊息。您可以修改 sketch 中的設定來更改 MQTT 主題和訊息。

相關資源

  • Recipe 17.10:使用 Node-RED 組態 Wemos 板
  • Chapter 18:更多關於 Wemos 板和其他裝置的資訊

程式碼解說

以下是 sketch 中的程式碼:

const char* ssid = "your_wifi_access_point_name";
const char* password = "your_wifi_password";
const char* mqtt_server = "your_mqtt_ip_address";

const char* topic = "button_1";
const char* message = "Button 1 pressed";

這些設定決定了 WiFi 連線、MQTT 伺服器 IP 地址、MQTT 主題和訊息。

圖表翻譯

以下是 MQTT 訊息流程圖:

  flowchart TD
    A[按鈕被按下] --> B[發布 MQTT 訊息]
    B --> C[MQTT 伺服器]
    C --> D[訂閱者]

此圖表顯示了按鈕被按下時,Wemos 板發布 MQTT 訊息到 MQTT 伺服器,然後訂閱者接收到此訊息。

使用 Wemos D1 與 Node-RED

問題 您想要在 Node-RED 流程中包含一個 Wemos D1,該裝置上附有一個按鈕。

解決方案 作為一個範例,我們可以使用 Recipe 17.9 中的 Wemos WiFi 按鈕,在 Node-RED 流程中切換一個 Sonoff 網路開關(Recipe 17.4)開啟或關閉。圖 17-35 顯示了 Node-RED 流程的組態。如果您想要匯入流程而不是從頭建立,可以在 Recipe 17.2 中找到流程以進行匯入。

圖 17-35. Node-RED 流程的 WiFi 燈開關

要完成這個食譜,您需要先嘗試過本章所有之前的食譜,以及 Recipe 18.11。

按鈕 1 MQTT 節點訂閱來自 Wemos D1 的訊息。圖 17-36 顯示了這個節點的設定。

圖 17-36. 設定按鈕 1 節點

重要的是,主題(Topic)設定為「button_1」。觸發節點(Trigger node)的工作方式與 Recipe 17.6 中相同。觸發節點更有趣,因為它記住了一個值,可以是 1 或 0,每當訊息透過它時就會翻轉這個值。這必須透過一小段 JavaScript 程式碼來實作,該程式碼記住狀態並翻轉它。圖 17-37 顯示了節點的組態,包括程式碼。這是一個有用的功能,您可能會在其他專案中重複使用它。

Raspberry Pi 與 Arduino 的整合:程式設計與通訊

在本章中,我們將探討如何使用 Raspberry Pi 程式設計 Arduino,並建立兩者之間的通訊。首先,我們需要在 Raspberry Pi 上安裝 Arduino IDE。

安裝 Arduino IDE

為了在 Raspberry Pi 上安裝 Arduino IDE,我們可以使用以下命令:

$ tar -x -f arduino-1.8.5-linuxarm.tar.xz
$ cd arduino-1.8.5/
$./install.sh

安裝完成後,我們可以連線 Arduino Uno 到 Raspberry Pi,並設定板型為 Arduino Uno。然後,從序列埠選項中選擇 /dev/ttyACM0

上傳測試程式

為了測試 Arduino 是否正常運作,我們可以上傳一個簡單的程式,使 Arduino 的 LED 閃爍。選擇 File 選單,點選 Examples,然後點選 Basic,然後點選 Blink。在工具列中,點選右箭頭開始編譯和上傳過程。如果一切正常,您應該會看到 Done Uploading 訊息在 IDE 視窗底部的狀態區域。

與 Arduino 通訊

Arduino IDE 包含了一個名為序列監視器(Serial Monitor)的功能,允許您向 Arduino 傳送文字訊息並檢視從 Arduino 收到的訊息。為了測試此功能,您需要寫一個簡短的 Arduino 程式(稱為 Sketch),它會重複傳送一條訊息,每秒一次。

以下是 Arduino 程式:

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("Hello Raspberry Pi");
  delay(1000);
}

上傳此程式到 Arduino 後,它會開始傳送「Hello Raspberry Pi」的訊息。您可以使用序列監視器檢視這些訊息。為了開啟序列監視器,請點選工具列中的按鈕,然後選擇 baud 率(通訊速度)為 9600。

使用PyFirmata控制Arduino板

問題描述

您想要使用Arduino板作為Raspberry Pi的介面板。

解決方案

我們將使用兩個程式來實作這個連結:PyFirmata在Raspberry Pi上和Firmata在Arduino上。

首先,將Arduino板連線到Raspberry Pi的USB埠,以便電腦可以與其通訊並提供電源。 接下來,安裝Firmata程式到Arduino板上和PyFirmata程式到Raspberry Pi上。這需要安裝Arduino IDE,如果您尚未安裝,請按照18.1節的步驟進行。 Arduino IDE包含Firmata,因此,您只需上傳一個程式到Arduino板上即可。您可以在檔案→範例→Firmata→StandardFirmata中找到這個程式。 安裝Firmata後,Arduino板會等待來自Raspberry Pi的通訊。 現在,您需要安裝PyFirmata,這是連結的另一半。這需要使用PySerial函式庫,因此請按照9.6節的步驟進行安裝。 您現在可以下載並安裝PyFirmata:

$ sudo pip3 install pyfirmata

您可以從Python控制檯測試pyfirmata函式庫。分別輸入以下命令以開啟和關閉Arduino板上的內建LED(標記為L):

$ python3
>>> import pyfirmata
>>> board = pyfirmata.Arduino('/dev/ttyACM0')
>>> pin13 = board.get_pin('d:13:o')
>>> pin13.write(1)
>>> pin13.write(0)
>>> board.exit()

討論

前面的程式碼首先匯入PyFirmata函式庫,然後建立一個名為board的Arduino例項,使用USB介面(/dev/ttyACM0)作為其引數。您可以參照其中一個Arduino引腳(在此情況下為13),並將其設為數字輸出。“d"代表數字,13是引腳編號,而"o"代表輸出。 要設定輸出引腳為高電位,使用write(1),而要設定為低電位,使用write(0)。您也可以使用True和False代替1和0。 圖18-4顯示了一個Arduino板,板上有兩排連線口。

圖18-4. Arduino Uno上的I/O引腳 您可以使用頂部標記為0到13的引腳作為數字輸入或輸出。其中一些引腳也用於其他用途。引腳0和1用作串列介面,並在使用USB埠時處於使用中,而引腳13則連線到板上的內建LED(標記為L),位於GND和13聯結器下方。數字I/O引腳3、5、6、9、10和11旁邊有一個~符號,表示它們可以用於PWM輸出(請參考10.3節)。 在板的另一側,有一組聯結器提供5V和3.3V電源,以及六個類別比輸入,標記為A0到A5。

獨立的Arduino Uno大約消耗50 mA的電流,這相比Raspberry Pi本身可能消耗的電流少了十倍,因此完全可以從Raspberry Pi的USB連線中為Arduino供電。但是,如果您開始將大量外部電子元件連線到Arduino,並且電流消耗增加,您可能需要從自己的電源介面卡為Arduino供電,這個介面卡可以接受7V到12V的直流電壓。 使用Firmata的唯一真正缺點是,由於所有指令都必須從Raspberry Pi發出,因此它並沒有充分利用Arduino獨立執行的能力。對於高階專案,您可能最終會編寫自己的Arduino程式,以從Raspberry Pi接收指令和/或向Raspberry Pi傳送訊息,同時執行其他任務。

參考資訊

以下幾節介紹瞭如何使用PyFirmata來使用Arduino引腳的全部功能:18.4、18.5、18.6、18.7和18.8。 您可以在PyFirmata的GitHub頁面找到官方PyFirmata檔案。

Node-RED 結合 Arduino 與 Raspberry Pi 等硬體,大幅降低了家居自動化的開發門檻。本文深入探討瞭如何利用 Node-RED Dashboard 建立友善的控制介面,並結合 MQTT 協定實作裝置間的訊息傳遞,更進一步示範瞭如何使用 ESP8266 和 Wemos D1 等低成本 WiFi 模組發布 MQTT 訊息,展現了系統的高度整合性和擴充套件性。然而,系統的穩定性和安全性仍需考量,尤其在涉及網路連線和資料傳輸時,更需注意潛在的風險。此外,雖然 Node-RED 簡化了開發流程,但對於複雜的自動化邏輯,仍需一定的程式設計能力。展望未來,隨著物聯網技術的持續發展,預期 Node-RED 將扮演更重要的角色,整合更多種類別的裝置和服務,打造更智慧、更個人化的家居體驗。對於想要快速入門家居自動化的使用者,建議從簡單的專案開始,逐步累積經驗,並深入瞭解 MQTT 和 Node-RED 的進階功能,才能充分發揮其潛力。玄貓認為,此技術組合兼具易用性與靈活性,值得投入學習並應用於實務場景。