首页 >> 在 Intel Edison 开发板上,利用 JavaScript 打造聪明的桌上型时钟
在 Intel Edison 开发板上,利用 JavaScript 打造聪明的桌上型时钟
来源:  时间:2015-10-26
分享到:


为什么我需要更聪明的时钟……

我常会设定闹铃提醒行事历的开会通知,但当计算机屏幕桌面角落跳出那小小的「某某会议再过 15 分钟就要开始」的通知时,我心里就会想「15 分钟够让我多做一件事了」,然后按下「延后」或「关闭」,继续工作。过20 分钟后才猛然醒悟:我迟到了!

而有时候,我会一直记挂着接下来要开会。我每一分钟都一下看时钟、一下看会议开始的时间,心里盘算着还有多久就要开会... 担心开会迟到。这一直占据着我的心思,根本做不了任何工作。

我可以在四周摆放好几个时钟,但大多数的时钟都是「笨」东西,只能显示时间给你看。但是,运用一点物联网神奇的魔力,笨东西也有可能变聪明。

我可以怎么做呢?

让我们想象一下:有个智能型时钟,会自动检查行事历,并且告诉你下一个行程。

时钟知道某个活动即将到来,这时候,就会自动提供距离活动还有多久的关系型倒数计时(例如「距离开会时间还有45分钟」,而不是「会议在下午4时开始」。随着活动开始时间越来越近,时钟会改变颜色,从温和提醒变成急迫警示,催促您马上动身。(例如黄色表示「注意」、橙色表示「动作快」,而红色表示「危险」。)

嗯,不要再想了,立刻动手做!

在这篇 Instructables 文章中,我会说明如何将把Intel Edison 与 Grove LCD变成智能型桌钟,能够使用Google Calendar API撷取行事历的信息。这个智能型桌钟应用程序的编写,属于 NodeJS 应用程序(在 Github这里的JavaScript 程序代码),使用Intel XDK 的 IoT 版本上传档案,以及执行物联网应用程序。

步骤 1
收集需要的材料


要打造内含 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 无线网卡进行联机。)

步骤 2
设定 Edison 的 Wi-Fi 联机


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

步骤 3
安装 Intel XDK IoT Edition


如果还没有安装 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

步骤 4
将 Grove Shield 组装到 Intel Edison 的 Arduino 扩充板上

1.    拔除 Arduino 扩充板所有的电源连接。

2.    将 Grove Base Shield 安装到 Intel Edison 开发板上,请对准所有的针脚,并且确实将 Shield 板插进扩充板的接头。

3.    将 Grove(4 针脚)线的一端连接到 Grove LCD。

4.    将 Grove 线的另一端连接到 Grove Base Shield,请注意,必须连接到有「I2C」标示的插槽。

5.    重新接通开发板的电源。

步骤 5
启用 Google Calendar API


要了解如何设定 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 个行事历事件打印出来,送到「开发人员控制台」。

步骤 6
将 Google Calendar API 的 Node Quickstart 程序代码移植到 Edison

到 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 屏幕的支持。

步骤 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

针对 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 模块,倘若文字超出一行的范围,就会左右卷动。

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 屏幕,我们再来将一些行事历的逻辑加到程序代码中。

步骤 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。

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());


步骤 10
程序代码总整理

如果看到步骤 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 屏幕!

步骤 11
打造桌钟的外壳


为了让 DIY 的智慧桌钟看起来有一点专业的感觉,就要制作一个外壳,把 Intel Edison 包在里面,并且托住 LCD 屏幕,转到您坐在桌前可以轻松看到的角度。

要为聪明的桌钟制作一个简单的纸板外壳,您需要:

•    纸板,或是很硬的卡纸

•    胶带、胶水

•    美工刀、剪刀

•    直尺

•    丁字尺(并非必要,但很好用)

•    装饰用的小物

如果想要额外的质感,可以考虑 3D 打印或是雷射切割桌钟的外壳。目前,我暂时用纸板就行了,因为我还会继续改善,增加功能。这东西根本就是用胶带黏起来的,这样说并不夸张。;)

我也加了一个 Adafruit NeoPixel Ring 彩色灯环当作装饰。最终,我会把这个连接到 Intel Edison,但那是日后的事了。

步骤 12
把时钟放在桌上

完成了!

使用 Intel XDK 编写 NodeJS 物联网应用程序的好处,就是位于 /node_app_slot 的应用程序可以自动设定,在 Intel Edison 开机的时候就会自动启动。

因此,这就表示,只需要经由电源插孔,给时钟稳定的电源供应,您的时钟就会立即连接到 Google Calendar API,随时为你留意行程安排!