步驟 7:匯入 MRAA 與 UPM 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
(LCD代表液晶顯示器 (Liquid Crystal Display),如果有興趣知道 LCD 螢幕的組成,請移至 YouTube 觀看「Building a liquid crystal display」影片。)
針對 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);
步驟 8:加入我的 LCD 文字輔助程式庫
用 JavaScript 的 UPM LCD 程式庫其實相當簡陋,只會提供幾種命令,像是將文字寫到螢幕上、清除螢幕,以及改變 RGB 背光顏色。
如果嘗試寫入超過 16 個字元長度的文字,內容就會截斷(超出螢幕顯示範圍)。
在智慧型鬧鐘的例子裡,行事曆事件的名稱很可能會超過 16 個字元,所以我寫了一個 Node 模組,倘若文字超出一行的範圍,就會左右捲動。
- 從這裡下載:https://github.com/pearlchen/iot-smart-desk-clock/blob/master/iot-version/lcd_text_helper.js 這段控制碼。
- 將 lcd_text_helper.js 放進您的專案目錄,與 main.js 放在一起。
- 在 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 螢幕,我們再來將一些行事曆的邏輯加到程式碼中。
步驟 9:加入最後的行事曆事件邏輯
看一看在 Github 這裡 main.js 最終的程式碼:https://github.com/pearlchen/iot-smart-desk-clock/blob/master/iot-version/main.js。
我在最終版本做了一件事,就是將 Google Calendar API 的東西從 main.js 挪出來,放進獨立的 Node 模組,叫做 GoogleCalendarEventFetcher。
- 從這裡下載:https://github.com/pearlchen/iot-smart-desk-clock/blob/master/iot-version/google_calendar_event_fetcher.js
- 將 google_calendar_event_fetcher.js 放進您的專案目錄,與 main.js 放在一起。
- 在 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());
請注意!留言要自負法律責任,相關案例層出不窮,請慎重發文!