簡單與Firebase同步,控制樹莓派GPIO

玩轉語音控制,智慧您的家園.

Posted by Aaron Chou on 2018-04-24

firebase

Firebase 是什麼?


Firebase 簡單來說就是個NoSQL資料庫,可以跨平台應用在 iOS、Android 和 Web上,資料使用 JSON 格式存儲並同步到每個連接的客戶端,即使設備離線也會繼續激活狀態,當設備重新連線時,數據庫資料將更新於設備中。NoSQL 資料庫官方稱為 Realtime Database,相較於傳統資料庫,數據取得變為更加快速,也因為 Firebase 這樣的設計,大大的減低開發時間,而不用大費周章去搞個後台。

架構圖


這次我要介紹第二部分,將樹莓派與 Firebase 做同步,透過修改 Realtime Database 裡的數值,來達到遠程控制的概念。 如果不曉得怎麼透過JavaScript 控制樹莓派GPIO可以跳到
Structure

建立專案


首先需要登入 Firebase,點擊GET STARTED 新增一個專案。
New project

輸入你專案想取的名稱,輸入完畢後點擊建立專案。
New project2

點擊剛剛建立的專案會看到,點擊Database
New project3

選取 Realtime Database 的開始使用
New project4

選擇以鎖定模式啟動,點擊啟用
New project5

之後會看到空白的資料庫,複製下面代碼,存成.json檔案後,點擊紅框,選擇匯入JSON
New project6

1
2
3
4
5
6
7
{
"auto" : {
"light" : {
"value" : "off"
}
}
}

成功匯入後可以看到資料庫變成這樣了。目前 Firebase 到這裡告一個段落,先別急著把網頁關閉,等等測試時候會用到。
New project7

樹莓派連上Firebase


這個步驟相對地簡單,只需要將上一篇的.js檔案,再加幾行程式碼而已,首先我們先打開終端機安裝 Firebase Library

1
npm install firebase

apiKey、databaseURL的取得

打開Firebase網頁,點擊 Project OverView 旁的設定→專案設定。
New project8
紅框處為等等.js檔案所需要填入的資訊。
New project9

JavaScript程式碼

複製以下代碼,覆蓋上一篇的.js檔案。填入 apiKey、databaseURL 讓程式知道要去哪裡取得資料庫,ref可以想像作為資料庫裡的auto資料夾。
ref.on是同步,如果只需要抓取一次後就不更新可以改為ref.once。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var firebase = require("firebase");
var config = {
apiKey: "網路 API 金鑰",
databaseURL: "https://專案 ID.firebaseio.com",
};
firebase.initializeApp(config);



var db = firebase.database();
var ref = db.ref("/auto");
ref.on("value", function(snapshot) {
console.log(snapshot.val().light);
console.log(snapshot.val().light.value);
var LED_value = snapshot.val().light.value;
blinkLED(LED_value);
});


var gpio = require("onoff").Gpio;

const LEDR = new gpio(18, 'out');

function blinkLED(State) {
if (State === 'on') {
LED.writeSync(0);
}else{
LED.writeSync(1);
}
}

執行

儲存完畢後是該來測試結果了,打開樹莓派終端機

1
node xxx.js //xxx為路徑+檔案名稱

修改 Firebase 上 light 的 value (on開、off關) ,你可以看到樹莓派上面的燈會因為輸入不同值而變化。
run

下一篇將會介紹用Dialogflow為Google Assistant打造專屬App