編譯:江宗諭
如果您是一位 Node.js 開發者,應該很想把您的 JavaScript 技能,發揮到瀏覽器或伺服器以外的地方,像是用 Raspberry Pi 的 GPIO 來控制硬體,對吧?如果真是這樣,那您來對地方了!
這篇文章是系列的第三彈,前面有《視覺化 Raspberry Pi 數據:輕鬆用 Arduino Cloud 掌握物聯網裝置》,以及專講 Python 的《Python開發者必學:用Arduino Cloud控制Raspberry Pi GPIO》,那兩篇已帶您認識了 GPIO 的管理。現在輪到我們一起來學習,怎麼用 Node.js 開啟控制 Raspberry Pi GPIO 的大門,這可是物聯網開發的基本功。不管您是想玩 LED 開關、讀感測器的資料,或是搞定繼電器控制,Node.js 都給您夠用的工具和彈性,讓一切順利到不行!
不過物聯網可不只是單純在本地搞定硬體哦。真正的物聯網專案需要遠端主控板,讓您能即時看到現在及過去的資料,並能隨時隨地控制設備。而使用 Arduino Cloud,以上這些都能輕鬆搞定!
現在,就讓我們一起,看看怎麼用 Node.js 和 Arduino Cloud ,將您的物聯網技能提升至下一個等級!
Raspberry Pi 基本 GPIO 設定
在這篇文章裡,我們(編按:在此指 Arduino 團隊)會給您一個簡單又完整的例子,來展示 Arduino Cloud 的強大功能。您將會學到怎麼用 Arduino Cloud 的主控板,遠端控制並監看 Raspberry Pi 的數位 GPIO。具體來說,我們會講解如何:
- 開關連接到 Raspberry Pi 的 LED
- 偵測連接到 Raspberry Pi 的按鈕,什麼時候被按下。
- 即時看到並回顧某個整數變數的歷史值。
要開始之前,我們先按照下圖,把 LED 和按鈕連接到您的 Raspberry Pi 上!
現在設備都準備好了,就我們開始吧
在 Arduino Cloud 上建立設備和 Thing
要把您的 Raspberry Pi 資料傳送到 Arduino Cloud,只要按照下面幾個簡單步驟:
- 如果您還沒有 Arduino Cloud 帳號,請先去註冊一個帳號。
- 將你的設備設定成「手動設備」( Manual device )
在這裡需要注意的是,請記下您的「設備 ID」和「密鑰」( Secret ),因為我們等一下會用到。
- 建立您的「Thing」,然後加入您的變數。
在這篇教學文的範例中,我們會用到以下三個變數:
- test_value:這個整數變數是用來在 Arduino Cloud 主控板上,顯示我們的 Raspberry Pi 程式定期產生的整數值。
- button:這個布林變數是用來在按鈕被按下時,將資訊傳到雲端。
- led:這個布林變數,是用來從 Arduino Cloud 主控板控制 LED 的開關。
接著,請按以下步驟,建立 Arduino Cloud 主控板視覺化資料:
- 建立一個「開關小工具( Widget )」(名稱: LED )和一個「 LED 小工具」(名稱: LED ),然後把它們連接到 led 變數。
- 建立一個「圖表小工具( Widget )」(名稱: Value evolution )和一個「數值小工具」(名稱: Value ),然後把它們連接到 test_value 變數。
- 建立一個「按鈕小工具( Widget )」(名稱: Push Button )和一個「狀態小工具」(名稱: Button ),然後將它們連接到 button 變數。
有了剛剛建立的主控板,您就可以:
- 用「開關小工具」來開啟或關閉 LED
- 用「 LED 小工具」來看看 LED 的狀態
- 用「數值小工具」即時監看 test_value 變數的值。
- 用「圖表小工具」觀察 test_value 變數隨著時間的變化
- 在「按鈕小工具」和「狀態小工具」上,看到樹梅派上的按鈕什麼時候被按下。
如果您想知道更詳細的完整流程,可以去我們的說明文件看看哦!
運用 Node.js ,設計你的物聯網設備
現在,讓我們來開發您的 Node.js 應用程式。
(以下為程式碼)
const gpiod = require('node-libgpiod');
const { ArduinoIoTCloud } = require('arduino-iot-js');
const { DEVICE_ID, SECRET_KEY } = require('./credentials');
// 請根據您樹梅派上的設定,修改下面這三行程式碼
const GPIOCHIP = 'gpiochip4';
const LED = 14; // GPIO14, Pin 8
const BUTTON = 15; // GPIO15, Pin 10
// 要確保這些變數是全域的,不然它們在計時器裡面會沒辦法正常運作哦!
chip = new gpiod.Chip(GPIOCHIP);
ledLine = chip.getLine(LED);
buttonLine = chip.getLine(BUTTON);
ledLine.requestOutputMode("gpio-basic");
// 要設定上拉偏壓的話,請使用 32 。
gpiod.LineFlags.GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP if it is undefined
buttonLine.requestInputModeFlags("gpio-basic", gpiod.LineFlags.GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP);
let client;
// 這個函式每隔 1 秒會跑一次,去檢查按鈕的值,然後把資料送到 Arduino Cloud。
function readButton(client) {
let button = buttonLine.getValue() ? true : false;
if (client)
client.sendProperty("button", button);
console.log("pollButton:", button);
}
// 這個功能每隔 10 秒會跑一次,隨機抓取一個 0 到 100 的數字,然後把資料傳到 Arduino Cloud。
function readValue(client) {
let value = Math.floor(Math.random() * 101);
if (client)
client.sendProperty("test_value", value);
console.log("pollValue", value);
}
// 這個函式會在每次 led 變數有變動時執行
function onLedChanged(led) {
ledLine.setValue(led ? 1 : 0);
console.log("LED change! Status is: ", led);
}
// 建立 Arduino Cloud 連線
(async () => {
try {
client = await ArduinoIoTCloud.connect({
deviceId: DEVICE_ID,
secretKey: SECRET_KEY,
onDisconnect: (message) => console.error(message),
});
client.onPropertyValue("led", (led) => onLedChanged(led));
}
catch(e) {
console.error("ArduinoIoTCloud connect ERROR", e);
}
})();
// 每 10 秒檢查一次數值
const pollValue = setInterval(() => {
readValue(client);
}, 10000);
// 每 10 秒檢查一次按鈕
const pollButton = setInterval(() => {
readButton(client);
}, 1000);
請輸入以下程式碼,以建立一個叫做 「 credentials.js 」的檔案,裡面有您的「設備 ID」和「密鑰」。
module.exports = {
DEVICE_ID: '09d3a634-e1ad-4927-9da0-dde663f8e5c6',
SECRET_KEY: 'IXD3U1S37QPJOJXLZMP5'
};
上面的程式碼,能運用在所有 Raspberry Pi 型號上,以及任何基於 Linux 的機器上。只要記得在下面的程式碼片段內,指定正確的「 gpiochip 」,並設定好對應的 GPIO 線路即可。
const GPIOCHIP = 'gpiochip4';
const LED = 14; // GPIO14, Pin 8
const BUTTON = 15; // GPIO15, Pin 10
想知道更多專案資訊,可前往「 Project Hub 」看詳細內容。完整的程式碼及其它資源,都可在 「 GitHub 儲存庫」找到。另外,別錯過這裡超完整的《 JavaScript + Arduino Cloud 指南》哦!
此外,如果您對 Arduino Cloud 有興趣,想進一步了解,請到Arduino Cloud主頁。
※感謝Arduino.cc官網開放授權,使我們得以翻譯這篇文章,特此致謝!若讀者想要進一步閱讀原文,請點擊:閱讀原文,謝謝。
(本篇文章經同意轉載自vMaker,原文連結;責任編輯:謝嘉洵。)
- JavaScript 開發者點進來! 整合 Node.js 與 Arduino Cloud 控制 Raspberry Pi GPIO - 2025/04/29
- 打造3D列印行星齒輪車:由創意設計至實現深化創客技術力 - 2025/03/26
- 不只有人工智慧! 導入 AR 與 VR ,重塑創客的自造方式 - 2024/07/28
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!