65.9K
CodeProject 正在变化。 阅读更多。
Home

让我们制作一块智能手表

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.99/5 (30投票s)

2015年10月17日

CPOL

10分钟阅读

viewsIcon

84297

英特尔爱迪生足够小巧,可以用作可穿戴设备,那么我们为什么不制作一个基于爱迪生的智能手表呢?

目录

  1. 英特尔爱迪生简介

  2. 规格

  3. 编程方法

  4. 使用爱迪生进行原型开发

  5. 为什么要选择爱迪生?

  6. 让我们制作一块智能手表

  7. 要求

  8. 让爱迪生准备好编程

  9. 设置串口终端

  10. 连接到Wi-Fi

  11. 建立连接

  12. 智能手表的编程

  13. 显示时间和温度的代码

  14. 发送短信的代码

  15. 加速度计和陀螺仪的代码

  16. 通过按键打开手电筒的代码

  17. 将数据发送到云端

  18. 工作

  19. 关注点

  20. 历史

  21. 参考文献

英特尔爱迪生简介

英特尔的计算模块,名为英特尔爱迪生,略大于一张SD卡。在对爱迪生进行了广泛的试验后,我彻底爱上了这款微型计算机。爱迪生的特点是——它既可以用于可穿戴设备,又足够强大来控制机器人。它是一个35.5 × 25.0 × 3.9毫米的模块,还配备了Yocto(一个Linux操作系统)。它内置了Wi-Fi和蓝牙,非常适合物联网项目。我们可以远程连接到爱迪生,并运行命令或访问文件系统。这通过SSH为开发人员提供了很大的灵活性。它的规格一定会让你印象深刻,它们是:

规格

英特尔®凌动™处理器,主频500MHz
100MHz Quark MCU
1GB LPDDR3内存
4GB eMMC闪存
WiFi (802.11a/b/g/n)
蓝牙 (4.0 和 2.1 EDR)
UARTs
I2C
SPI
USB
40个复用GPIO接口

 

编程方法

爱迪生可以与Arduino IDE一起使用,但为了充分利用它,您可以使用其他编程语言,如Python、Node.JS、C/C++。英特尔有自己的IDE,名为Intel XDK IoT edition,它使使用爱迪生进行编程变得容易。在为爱迪生设置编程环境时,您可以在Arduino IDE、Intel XDK或Eclipse之间进行选择。

使用爱迪生进行原型开发

为了保持爱迪生的小巧,所有的I/O引脚都被引出到一个70引脚的Hirose连接器。这个70引脚连接器不适合原型开发。与这些连接器连接非常困难,因此为了与爱迪生连接,我们需要一个带有匹配Hirose连接器的板。

目前可用的接口板有
Arduino扩展板
Mini Breakout Board(迷你转接板)
SparkFun Edison Blocks(SparkFun爱迪生模块)

如果您是爱迪生新手并想试用,**Arduino扩展板**是您的理想选择。它将给您带来类似Arduino的感觉,并且基于Arduino的扩展板也兼容此板,但它比英特尔伽利略略大。其功能包括:

 

 

• 20个数字输入/输出引脚,其中4个引脚可用作PWM输出
• 6个模拟输入
• 1个UART (RX/TX)
• 1个I2C
• 1个ICSP 6针接头 (SPI)
• 微型USB设备连接器 或 (通过机械开关) 专用标准尺寸USB主机Type-A连接器
• 微型USB设备 (连接到UART)
• 微型SD卡连接器
• 直流电源插孔 (7V – 15V 直流输入)

如果您想将爱迪生嵌入到项目中,那么您可以使用**Mini Breakout Board**或**SparkFun Edison Blocks**。它们比英特尔爱迪生稍大。Mini Breakout Board具有最少的功能,例如:

 


图片来源:Adafruit

 

• 暴露爱迪生模块的原生1.8V I/O
• 0.1英寸网格的I/O通孔焊点阵列
• 带USB Micro Type-AB连接器的USB OTG
• USB OTG电源开关
• 电池充电器
• 带USB Micro Type-B连接器的USB转设备UART桥接器
• 直流电源插孔 (7V – 15V 直流输入)

 

**SparkFun**拥有一整套用于接口、电源、传感器和执行器的模块。您可以在此处浏览它们,并为您的爱迪生项目找到一个或多个合适的模块。

为什么要选择爱迪生?

爱迪生是一款低功耗物联网计算模块,因此为了降低功耗,处理器也略大于SD卡。它是可穿戴项目的最佳选择。

 

我们来制作一个智能手表

爱迪生足够小巧,可以在可穿戴项目中使用,那么我们为什么不用这款微型计算机制作一个智能手表呢?我将使用Arduino扩展板进行原型开发,尽管在原型阶段它看起来不会完全像智能手表,但它将具备所有功能,之后我们可以努力使其模块化和紧凑。在原型开发中,我使用了16*2 LCD模块进行显示,因为我当时没有OLED显示屏,如果您有,可以使用OLED显示屏,因为它功耗低且更小。我很快就会用OLED更新这个项目。那么,我们来看看爱迪生智能手表的功能:

  1. 持续显示时间
  2. 监测并显示附近温度,并发送至云端
  3. 一键发送短信。
  4. 手电筒
  5. 计步器和睡眠监测器。

 

要求

英特尔爱迪生模块

爱迪生用Arduino扩展板

触摸传感器

Grove按键

LSM303 加速度计/指南针传感器

温度传感器

16*2 LCD RGB背光

Grove LED模块

超亮LED (白色)

Grove 基座扩展板

电源

Micro USB连接线

跳线

 

 

 

我正在使用Grove传感器,因为它使原型开发变得容易。您会在Grove爱迪生入门套件中找到本项目中使用的大多数传感器。如果您是物联网新手,Seed Studio Grove入门套件将帮助您轻松开始开发,因为您无需担心电路和其他电子设备。有了Grove扩展板和传感器模块,您可以轻松创建任何东西,而无需过多担心电子元件。无需通过焊接或面包板来管理传感器。这篇文章“Grove入门套件与英特尔伽利略二代:入门”将指导您如何设置和运行Grove入门套件,尽管它是针对伽利略二代的,但所有内容对于英特尔爱迪生来说都是类似的。我目前使用的是Adafruit的Flora加速度计/指南针,它工作正常,但由于它是可缝合模块,所以在连接时您需要多做一些工作。如果您没有任何传感器,我建议您使用Grove - 6轴加速度计和指南针Adafruit的加速度计/指南针LSM303

 

让爱迪生准备好编程

  1. 根据您电脑的配置从https://software.intel.com/en-us/iot/software/installers下载安装程序。
  2. 运行安装程序,它会询问您想要安装的编程环境和IDE。根据您的偏好选择一个或多个。对于本项目,我正在使用Intel XDK并使用node.js进行编程。
  3. 设置串口终端:如果您想使用您的板子远程运行命令,您必须设置一个串口连接。首先从http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe安装putty,然后运行安装程序。在菜单中展开“连接”并选择“串口”。现在在**串口行**中输入您的爱迪生连接的COM端口。在**速率**字段中,输入115200,并在**连接类型**中选择“串口”。点击确定,它将打开一个串口连接。按回车键,现在它会提示登录。输入您的凭据。默认用户名是root,没有密码。现在您将看到一个终端端口。
  4. 连接到Wi-Fi: 在串口终端输入此命令-
    configure_edison --wifi  , 爱迪生将扫描所有Wi-Fi网络约10秒。完成后,将显示可用网络列表。根据列表中的对应编号选择网络,输入Y并按回车。它会要求输入网络凭据,输入有效凭据后,您的爱迪生将连接到WiFi。
  5. 在您的网页浏览器中输入爱迪生的IP地址或“_http://edison.local_”,如果您的爱迪生已连接到网络,这将显示此页面。
  6. 现在,我们已经准备好开始开发我们的爱迪生项目。

 

建立连接

由于我们使用的是Grove的传感器,我们将使用Grove传感器附带的四针电缆进行连接。不用担心极性,因为您无法错误连接它们,它们只有在正确连接时才能插入。

1) 将您的爱迪生连接到电源,并通过USB线连接到您的电脑。

2) 启动需要15-20秒,之后堆叠Grove Base Shield。

3) 将温度传感器连接到模拟引脚A0

4) 将温度传感器连接到A1。

5) 将LCD显示屏连接到其中一个I2C端口

6) 将加速度计连接到另一个I2C端口。

7) 将Grove按钮连接到D2。

8) 将LED模块连接到D3。

9) 将触摸传感器连接到D4。

 

 

智能手表的编程

  1. 打开Intel XDK IoT edition,如果您的电脑尚未安装,请从https://software.intel.com/en-us/iot/downloads获取。
  2. 如果您已经使用Flash Lite Tool刷新了爱迪生,Node.Js将已安装在您的板上。
  3. 将IDE连接到您的爱迪生板。它会要求您输入用户名和密码,默认用户名是root,没有密码。

  1. 选择一个空白的Node.Js模板并创建一个新项目。

 

 

显示时间和温度的代码

var lcd = new jsUpmI2cLcd.Jhd1313m1(6, 0x3E, 0x62);

var groveSensor = require('jsupm_grove');

var today = setInterval(function ()
    {
    var d = new Date();
    var b= d.toTimeString();
    lcd.setColor(0, 255, 0);

// Go to the 2nd row, 6th character (0-indexed)

    lcd.setCursor(0,0);
    lcd.write(b);
     var celsius = temp.value();
        var fahrenheit = celsius * 9.0/5.0 + 32.0;
        var t = Math.round(fahrenheit);
        lcd.setCursor(1, 1);
        lcd.write(t+" *F");
       v.saveValue(t);
}, 1000);

 

发送短信的代码

 

var twilio = require('twilio');


// Create a new REST API client to make authenticated requests against the

// twilio back end

var TWILIO_ACCOUNT_SID = '' ;

var TWILIO_AUTH_TOKEN = '';

var OUTGOING_NUMBER = '';

var TWILIO_NUMBER = '';


var client = new twilio.RestClient(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN);


// Pass in parameters to the REST API using an object literal notation. The

// REST client will handle authentication and response serialzation for you.

client.sms.messages.create({

    to:OUTGOING_NUMBER,

    from:TWILIO_NUMBER,

    body:'Hi, sending from my Edison SmartWatch'

}, function(error, message) {

    // The HTTP request to Twilio will run asynchronously. This callback

    // function will be called when a response is received from Twilio

    // The "error" variable will contain error information, if any.

    // If the request was successful, this value will be "falsy"

    if (!error) {

        // The second argument to the callback will contain the information

        // sent back by Twilio for the request. In this case, it is the

        // information about the text messsage you just sent:

        console.log('Success! The SID for this SMS message is:');

        console.log(message.sid);


        console.log('Message sent on:');

        console.log(message.dateCreated);

    } else {

        console.log('error: ' + error.message);

    }

});

 

 

加速度计和陀螺仪的代码

 

var accelrCompassSensor = require('jsupm_lsm303');

// Instantiate LSM303 compass on I2C

var myAccelrCompass = new accelrCompassSensor.LSM303(0);


var successFail, coords, outputStr, accel;

var myInterval = setInterval(function()

{

        // Load coordinates into LSM303 object

        successFail = myAccelrCompass.getCoordinates();

        // in XYZ order. The sensor returns XZY,

        // but the driver compensates and makes it XYZ

        coords = myAccelrCompass.getRawCoorData();


    // Print out the X, Y, and Z coordinate data using two different methods

        outputStr = "coor: rX " + coords.getitem(0)

                                      + " - rY " + coords.getitem(1)

                                      + " - rZ " + coords.getitem(2);

        console.log(outputStr);

        outputStr = "coor: gX " + myAccelrCompass.getCoorX()

                               + " - gY " + myAccelrCompass.getCoorY()

                               + " - gZ " + myAccelrCompass.getCoorZ();

        console.log(outputStr);


    // Get and print out the heading

        console.log("heading: " + myAccelrCompass.getHeading());


    // Get the acceleration

        myAccelrCompass.getAcceleration();

        accel = myAccelrCompass.getRawAccelData();

    // Print out the X, Y, and Z acceleration data using two different methods

        outputStr = "acc: rX " + accel.getitem(0)

                               + " - rY " + accel.getitem(1)

                               + " - Z " + accel.getitem(2);

        console.log(outputStr);

        outputStr = "acc: gX " + myAccelrCompass.getAccelX()

                               + " - gY " + myAccelrCompass.getAccelY()

                               + " - gZ " + myAccelrCompass.getAccelZ();

        console.log(outputStr);

        console.log(" ");

}, 1000);


// Print message when exiting

process.on('SIGINT', function()

{

        clearInterval(myInterval);

        myAccelrCompass = null;

        accelrCompassSensor.cleanUp();

        accelrCompassSensor = null;

        console.log("Exiting");

        process.exit(0);

});

 

通过按键打开手电筒的代码

 

var groveSensor = require('jsupm_grove');

// Create the button object using GPIO pin 0

var button = new groveSensor.GroveButton(2);

// Read the input and print, waiting one second between readings


function readButtonValue() {
    console.log(button.name() + " value is " + button.value());
    var v=button.value();
    if(v==1){ led.on();}
    if(v==0){ led.off();}
}
setInterval(readButtonValue, 1000);

 

将数据发送到云端

var ubidots = require('ubidots');

var client = ubidots.createClient('YOUR-API-KEY');


client.auth(function () {

  this.getDatasources(function (err, data) {

    console.log(data.results);

  });

  var ds = this.getDatasource('xxxxxxxx');


  ds.getVariables(function (err, data) {

    console.log(data.results);

  });

  ds.getDetails(function (err, details) {

   console.log(details);

});


  var v = this.getVariable('xxxxxxx');


  v.getDetails(function (err, details) {

    console.log(details);

  });

  v.getValues(function (err, data) {

    console.log(data.results);

  });

 

这里我正在使用Ubidots作为物联网云,通过Ubidots我们可以有效地可视化数据。它支持各种设备,还可以触发一些操作,如发送邮件和消息。它还提供了许多API,以我们选择的语言加速我们的开发。因此,我选择了它的Node.Js库来与我的爱迪生交互。

 

设置Ubidots云

  1. 登录您的Ubidots账户,或在此处创建账户:http://ubidots.com/
  2. 选择“Sources”选项卡,然后点击“Add Data Source”创建一个新的数据源。这里我添加了我的爱迪生。

 

 

  1. 数据源创建后,我们需要为其添加变量。在此项目中,我们将发送温度数据,因此我们将创建一个单独的变量。

 

  1. 点击变量并复制变量ID。将其粘贴到您的代码中。

  1. 选择我的个人资料->API Keys。在此处获取您的API密钥。

  1. 在您的仪表板上添加一个您选择的部件,取决于您希望如何可视化数据。
  2. 我为温度传感器选择了折线图和表格值。通过查看表格值,您可以轻松确定温度的最后值,并通过图表可以评估温度的突然变化。

 

工作

您需要创建一个Twilio帐户来发送消息。将您从Twilio帐户获得的API密钥复制到代码中。在爱迪生上构建、上传和运行您的应用程序。它将下载NPM模块并将当前项目上传到爱迪生。使用Intel XDK IoT版时,您需要活跃的互联网连接。

 

您将在调试控制台中看到传感器值,如果一切正常,您会注意到数据正在发送到Ubidots云,并且通过触摸将消息发送到手机。按下按钮,这将打开手电筒,方便您在黑暗中查看,显示屏将显示当前时间和温度。

 

 

 

导航到Ubidots仪表板,您将看到传感器发送的所有数据在我们的部件中。您可以看到温度传感器记录的最新值以及关于变化的折线图。在这里,我还创建了一些警报,如果温度水平超过一定水平(通过短信向我们的手机发送警报)。

 

现在,当我们触摸触摸传感器时,一条短信会立即发送到我的手机。我使用的是Twilio试用账户,所以他们会在短信中添加一些其他文本。如果您获得付费账户,将不会看到任何Twilio广告。

关注点

制作并佩戴智能手表是您会真正享受的事情。我仍在努力使其小巧,并且正在研究计步器和睡眠监测器,我将很快更新。

历史

20-10-2015: 目录和参考文献已添加

2015年10月16日:文章首次发布

参考文献

http://www.intel.com/content/www/us/en/do-it-yourself/edison.html

https://software.intel.com/en-us/iot/hardware/edison/downloads

http://poojabaraskar.com/grove-starter-kit-with-intel-galileo-gen-2-getting-started/

https://software.intel.com/zh-cn/iot/library/edison-getting-started

www.seeedstudio.com/depot/

 

© . All rights reserved.