為什么我需要更聰明的時鐘……
我常會設定鬧鈴提醒行事歷的開會通知,但當計算機屏幕桌面角落跳出那小小的「某某會議再過 15 分鐘就要開始」的通知時,我心里就會想「15 分鐘夠讓我多做一件事了」,然后按下「延后」或「關閉」,繼續工作。過20 分鐘后才猛然醒悟:我遲到了!
而有時候,我會一直記掛著接下來要開會。我每一分鐘都一下看時鐘、一下看會議開始的時間,心里盤算著還有多久就要開會... 擔心開會遲到。這一直占據著我的心思,根本做不了任何工作。
我可以在四周擺放好幾個時鐘,但大多數的時鐘都是「笨」東西,只能顯示時間給你看。但是,運用一點物聯網神奇的魔力,笨東西也有可能變聰明。
我可以怎么做呢?
讓我們想象一下:有個智能型時鐘,會自動檢查行事歷,并且告訴你下一個行程。
時鐘知道某個活動即將到來,這時候,就會自動提供距離活動還有多久的關系型倒數計時(例如「距離開會時間還有45分鐘」,而不是「會議在下午4時開始」。隨著活動開始時間越來越近,時鐘會改變顏色,從溫和提醒變成急迫警示,催促您馬上動身。(例如黃色表示「注意」、橙色表示「動作快」,而紅色表示「危險」。)
嗯,不要再想了,立刻動手做!
在這篇 Instructables 文章中,我會說明如何將把Intel Edison 與 Grove LCD變成智能型桌鐘,能夠使用Google Calendar API擷取行事歷的信息。這個智能型桌鐘應用程序的編寫,屬于 NodeJS 應用程序(在 Github這里的JavaScript 程序代碼),使用Intel XDK 的 IoT 版本上傳檔案,以及執行物聯網應用程序。
要打造內含 Intel 的智能型鬧鐘,你需要:
? Intel Edison開發板模塊,連接到 Arduino 擴充板
? 專用的電源。
o 我會使用 12V 直流電源,直接插入墻上的插座。
? Grove Starter Kit for Arduino(Grove 的 Arduino 入門套件)或 Grove Starter Kit Plus – Intel IoT Edition for Intel Galileo Gen 2 and Edison(Grove 入門套件升級版:適用于 Intel Galileo 第 2 代與 Edison 的 Intel IoT 版本)都有提供:
o Grove Base Shield v2 for Arduino(搭配 Arduino 的擴充板)
o Grove LCD with RGB backlight(RGB 背光的液晶顯示器)
o 1 條 Grove 組件 4 針連接線
Intel Edison 設計程序,你需要:
? 計算機
o 任何主流操作系統(Mac、Windows、Linux)都行,但我會使用 Mac 做示范。
? 計算機上已經安裝了Intel XDK 的 IoT 版本集成開發環境 (IDE)。
o 我使用 Intel XDK,因為這款應用程序的程序代碼是以 JavaScript 撰寫,用于 NodeJS 環境。
? 一條 micro-USB 傳輸線。
o 在執行 Shell 命令,以及直接在 Intel Edison 設定 WiFi 的時候會用到。(注:如果您的 Intel Edison 已經設定 Wi-Fi 聯機,就不需要這條額外的傳輸線。)
(*注:本項目的程序代碼也適用于 Intel Galileo。如果使用 Intel Galileo,可以透過有線網絡或 WiFi 無線網卡進行聯機。)
Intel Edison 需要連接到無線網絡,才可從 Intel XDK 透過無線網絡進行程序設計,以及呼叫 Google Calendar API【使用行事歷】。
如果尚未設定 Intel Edison 連接到無線路由器,請先執行下列步驟:
1. 取得 Intel Edison 的 Shell 權限
圖文說明英文文件1:https://software.intel.com/en-us/setting-up-serial-terminal-on-system-with-mac-os-x
圖文說明英文文件2: https://software.intel.com/en-us/setting-up-serial-terminal-on-system-with-windows
2. 執行「configure_edison –wifi」命令
圖文說明英文文件: https://software.intel.com/en-us/articles/intel-edison-getting-started-wifi
如果還沒有安裝 Intel XDK IoT Edition,請先從https://software.intel.com/en-us/html5/xdk-iot下載并安裝這套集成開發環境。
針對安裝 Intel XDK,如果還需要進一步的協助,請參考以下安裝指南:
? 影片講解:https://software.intel.com/en-us/videos/setting-up-the-intel-xdk-iot-edition-part-1-installation
? 文件數據:https://software.intel.com/en-us/articles/install-the-intel-xdk-iot-edition
若要確認 Intel XDK 是否可以在 Intel Edison 開發板實際執行,請執行控制板載 LED 閃爍的范例項目
? 影片講解:https://software.intel.com/en-us/videos/setting-up-the-intel-xdk-iot-edition-part-2-run-a-sample-project
? 文件說明:https://software.intel.com/en-us/blinking-an-led-with-intel-xdk-iot-edition
1. 拔除 Arduino 擴充板所有的電源連接。
2. 將 Grove Base Shield 安裝到 Intel Edison 開發板上,請對準所有的針腳,并且確實將 Shield 板插進擴充板的接頭。
3. 將 Grove(4 針腳)線的一端連接到 Grove LCD。
4. 將 Grove 線的另一端連接到 Grove Base Shield,請注意,必須連接到有「I2C」標示的插槽。
5. 重新接通開發板的電源。
要了解如何設定 Google Calendar API,請參考 Google Developers 網站上的 Node.js Quickstart指南:https://developers.google.com/google-apps/calendar/quickstart/node
完成這個「快速入門指南」之后,您應該會得到:
? 一個 Google Calendar API 項目(也許可以叫做「smart-clock」),已經在 Google Developer Console啟用。
? 一個client_secret.json的檔案。
? 一個 NodeJS 腳本文件,可將接下來的 10 個行事歷事件打印出來,送到「開發人員控制臺」。
到 Intel Edison,只需編輯幾個小地方。
1. 在 Intel XDK 的 IoT 版本:開始新項目 >匯入您的 Node.js 專案
? 使用先前步驟建立的文件夾(里面含有 quickstart.js 的文件夾)。
? 提供項目名稱,例如「smart-clock」。
2. 建立package.json檔案。
? 加入 Github 這段程序代碼:https://github.com/pearlchen/iot-smart-desk-clock/blob/master/iot-version/package.json
3. 刪除項目文件夾中的node_modules文件夾(及其中的內容)。
? 因為這個文件夾太大了,如果讓 Intel XDK 透過無線方式復制到開發板,還沒完成就會發生逾時。在后面的步驟,我們會將 Node 鏈接庫直接安裝到開發板上。
4. 建立main.js檔案。
? 將先前在 quickstart.js 編寫的所有程序代碼復制到 main.js。
? 如果您跳過了前面的步驟,請使用這段程序代碼:https://github.com/pearlchen/iot-smart-desk-clock/blob/master/desktop-version/quickstart.js
5. 請確實儲存剛才建立的任何檔案。
6. 如果還沒有連接開發板,請透過「IoT Device」下拉式清單連接到開發板。
7. 單擊底部工具欄的「Manage your daemon/IoT device」按鈕,開始管理物聯網裝置。
? 單擊「Sync PC time w/clock on target device」,同步處理計算機與目標裝置的時間
? 選取「Run npm install directly on IoT Device」,直接在物聯網裝置執行 npm 安裝(這將會使用先前在 package.json 定義的依存關系)
8. 單擊底部工具欄的「Upload」按鈕,開始上傳。
9. 單擊底部工具欄的「Build」按鈕,它在「Upload」旁邊。
10. 使用 SSH Terminal卷標頁(透過無線網絡)或Serial Terminal卷標頁(透過 micro-USB 傳輸線)來連接開發板。
11. 輸入:「cd /node_app_slot」,這是 Intel XDK 復制任何項目文件的地方。
12. 執行您自己的 main.js,也就是這里的腳本文件:「node main.js」
13. 依提示說明取得 Token 認證,再傳遞回去終端機命令行。
14. 如果看到了您接下來 10 項行事歷事件的輸出結果,就表示 Intel Edison 順利透過無線網絡與 Google Calendar API 通訊了!
15. 現在,嘗試從 Intel XDK 執行 Node 應用程序,取代執行「node main.js」。單擊底部工具欄上的「Run」按鈕,開始執行。
16. 你會看到錯誤訊息:「Error loading client secret file」,表示加載檔案發生錯誤,這是因為 Intel XDK 在項目文件夾的范圍之外執行應用程序。
17. 對 main.js 做以下編輯,儲存檔案,再按一次「Run」按鈕,應該就會看到你接下來的 10 項行事歷事件。
// add this line at the top:
var SECRET_FILE = '/node_app_slot/client_secret.json';
// edit this line (around line 13-14)
// fs.readFile('client_secret.json', function processClientSecrets(err, content) {
// to be:
fs.readFile(SECRET_FILE, function processClientSecrets(err, content) {
恭喜!
下一步,就是加入 LCD 屏幕的支持。
一大堆字母縮寫,夠多了嗎?;)
MRAA是某種低階 C++ 鏈接庫,促成 Edison 的 Linux(軟件)端代表 Edison 的通用輸入輸出針腳(硬件)端進行通訊。Intel 維護的 mraa 鏈接庫放在 Github 這里:https://github.com/intel-iot-devkit/mraa
例如,要點亮連接到 Pin 13 的 LED,就像這樣使用 MRAA:
var mraa = require('mraa');
var led = new mraa.Gpio(13);
led.dir(mraa.DIR_OUT);
led.write(1);
UPM是比較高階的鏈接庫,使用 MRAA 來簡化對于現成電子組件的操控,尤其是有些組件需要的不只是簡單的開關命令,像是上面 LED 的例子。要讓 LCD 屏幕顯示文字,就需要發送某些非常精確計時的電氣信號,所以要有額外的動作,裝進個別的 UPM 鏈接庫中。Intel 維護的 UPM 鏈接庫放在 Github 這里:https://github.com/intel-iot-devkit/upm
針對 Grove LCD 組件 (Jhd1313m1),仍然要像上面那樣包含 MRAA 鏈接庫,此外還要使用個別的 UPM I2C LCD 鏈接庫,像下面這樣:
var mraa = require('mraa');
var jsUpmI2cLcd = require ('jsupm_i2clcd');
// Initialize the LCD.
// The 1st param is the BUS ID:
// Intel Edison: Use 6
// Intel Galileo Gen 2: Use 6 (I think)
// Intel Galileo Gen 1: Use 0
var lcd = new jsUpmI2cLcd.Jhd1313m1(6, 0x3E, 0x62);
// Make the backlight red
lcd.setColor(255, 0, 0);
// Go to the 2nd row, 6th character (0-indexed)
// and print out "Hello!"
lcd.setCursor(1,5);
lcd.write('Hello!');
如果需要更多其他的傳感器范例程序代碼,可以透過 Github 的 UPM 范例文件夾或是Intel IoT 的傳感器網頁尋找。
所以,在 main.js 檔案的最上方,需要有這個:
var mraa = require('mraa');
var jsUpmI2cLcd = require ('jsupm_i2clcd');
var lcd = new jsUpmI2cLcd.Jhd1313m1(6, 0x3E, 0x62);
用 JavaScript 的 UPM LCD 鏈接庫其實相當簡陋,只會提供幾種命令,像是將文字寫到屏幕上、清除屏幕,以及改變 RGB 背光顏色。
如果嘗試寫入超過 16 個字符長度的文字,內容就會截斷(超出屏幕顯示范圍)。
在智能型鬧鐘的例子里,行事歷事件的名稱很可能會超過 16 個字符,所以我寫了一個 Node 模塊,倘若文字超出一行的范圍,就會左右卷動。
1. 從這里下載:https://github.com/pearlchen/iot-smart-desk-clock/blob/master/iot-version/lcd_text_helper.js 這段句柄。
2. 將 lcd_text_helper.js 放進您的項目目錄,與 main.js 放在一起。
3. 在 main.js 中,加入這個部分,與 UPM LCD 鏈接庫放在一起:
var jsUpmI2cLcd = require ('jsupm_i2clcd');
var LcdTextHelper = require('./lcd_text_helper');
var lcd = new jsUpmI2cLcd.Jhd1313m1(6, 0x3E, 0x62);
var lcdText = new LcdTextHelper(lcd);
4. 像這樣使用:
/**
* Try it out with some test messages.
*/
var LCD_MESSAGE_VERY_LONG = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxyz"; // >16 characters long (48 chars)
var LCD_MESSAGE_LONG = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // >16 characters long (24 chars)
var LCD_MESSAGE_16CHAR = "1234567890ABCDEF"; // ==16 characters long
var LCD_MESSAGE_SHORT = "1234567890"; // <16 characters long (10 chars)
var LCD_MESSAGE_VERY_SHORT = "ABC"; // <16 characters long (3 chars)
lcdText.set([
" Hello,",
" World!"
]);
setTimeout(function(){
lcdText.set([
LCD_MESSAGE_SHORT,
LCD_MESSAGE_VERY_SHORT
]);
}, 5000);
setTimeout(function(){
lcdText.set([
LCD_MESSAGE_LONG,
LCD_MESSAGE_VERY_LONG
]);
}, 10000);
現在,有了基本(但看起來相當不錯)的功能,可以將文字輸出到 LCD 屏幕,我們再來將一些行事歷的邏輯加到程序代碼中。
看一看在 Github 這里 main.js 最終的程序代碼:https://github.com/pearlchen/iot-smart-desk-clock/blob/master/iot-version/main.js。
我在最終版本做了一件事,就是將 Google Calendar API 的東西從 main.js 挪出來,放進獨立的 Node 模塊,叫做 GoogleCalendarEventFetcher。
1. 從這里下載:https://github.com/pearlchen/iot-smart-desk-clock/blob/master/iot-version/google_calendar_event_fetcher.js
2. 將 google_calendar_event_fetcher.js 放進您的項目目錄,與 main.js 放在一起。
3. 在 main.js 中,加入這個部分,與 LCD 文字輔助功能放在一起。
var LcdTextHelper = require('./lcd_text_helper');
var GoogleCalendarEventFetcher = require('./google_calendar_event_fetcher');
4. 像這樣使用:
// Initialize it
var calendar = new GoogleCalendarEventFetcher();
calendar.init(successCallback, optionalErrorDisplayCallback);
// Then, in the success callback:
calendar.getEvents(eventsReceivedCallback, MAX_EVENTS, beginTimeToQuery.toISOString(), endTimeToQuery.toISOString());
如果看到步驟 7 或步驟 8 的程序代碼就暈頭轉向了:別擔心!
您可以從 Github 下載整個智能型桌鐘的程序代碼,放在「iot-version」文件夾里面:https://github.com/pearlchen/iot-smart-desk-clock/tree/master/iot-version
請記得,需要將你自己的 client_secret.json加進來,這應該在「步驟 5」的時候就已經有了。
將這些檔案放進您的 Intel XDK 項目目錄,然后使用 Intel XDK:
1. 單擊底部工具欄的「Upload」按鈕,開始上傳。
2. 單擊底部工具欄的「Run」,開始執行。
3. 檢查 Intel XDK 控制臺是否有任何錯誤。
4. 檢查時鐘的 LCD 屏幕!
為了讓 DIY 的智慧桌鐘看起來有一點專業的感覺,就要制作一個外殼,把 Intel Edison 包在里面,并且托住 LCD 屏幕,轉到您坐在桌前可以輕松看到的角度。
要為聰明的桌鐘制作一個簡單的紙板外殼,您需要:
? 紙板,或是很硬的卡紙
? 膠帶、膠水
? 美工刀、剪刀
? 直尺
? 丁字尺(并非必要,但很好用)
? 裝飾用的小物
如果想要額外的質感,可以考慮 3D 打印或是雷射切割桌鐘的外殼。目前,我暫時用紙板就行了,因為我還會繼續改善,增加功能。這東西根本就是用膠帶黏起來的,這樣說并不夸張。;)
我也加了一個 Adafruit NeoPixel Ring 彩色燈環當作裝飾。最終,我會把這個連接到 Intel Edison,但那是日后的事了。
完成了!
使用 Intel XDK 編寫 NodeJS 物聯網應用程序的好處,就是位于 /node_app_slot 的應用程序可以自動設定,在 Intel Edison 開機的時候就會自動啟動。
因此,這就表示,只需要經由電源插孔,給時鐘穩定的電源供應,您的時鐘就會立即連接到 Google Calendar API,隨時為你留意行程安排!