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

智能家居的智能台钟

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (16投票s)

2016年7月12日

CPOL

10分钟阅读

viewsIcon

34067

downloadIcon

121

一款真正的智能台钟,具备 Gmail 通知、火警、Intel Edison 的温度监控功能

引言

啊!又一个“智能时钟”!

你可能会想:“手机已经能计时了,还需要时钟项目干什么?”

嗯,一个联网的嵌入式物联网设备可以做很多智能手机做不到的,或者做不好的事情。它们能更快、更智能地响应硬件和传感器事件。当你将这些设备连接到云端时,你可以获得一些简单的手机永远无法实现的超棒的用例。

这是我为了探索时钟连接物联网带来的令人兴奋的新可能性而进行的一个项目。

那么,这个时钟有什么特别之处呢?

  1. 时钟显示日期和时间(这显然是所有时钟都会显示的)
  2. 它显示温度(很多台式时钟都会显示)
  3. 它显示 Gmail 通知并可以做出响应。例如,“回家”邮件会打开家里的灯,“离家”邮件会关闭家里的灯。
  4. 一旦检测到非常高且异常的温度模式,就会触发火警。

由于时钟连接到云端,你可以执行多项任务,如安排事件、自动通知等等。

在我们开始之前,让我做一个诚实的坦白。和你们中的许多人一样,我也是物联网和 Intel Edison 开发板的新手。但在学习物联网基础知识时,我发现大多数教程都是基于 Windows 的。在 Linux 上开发物联网框架与在 Windows 上开发有很大不同。

尽管 Intel Edison 运行的是 Yocto,但在 Linux 平台上配置开发板然后再进行编码需要许多调整和技巧。所以,在这篇文章中,我将或多或少地与你分享我的学习经历。

如何在 Linux 上使用 Intel Edison 开发板

首先,你需要通过在终端中使用此命令在你的 Linux 系统上安装 putty

$sudo apt-get install putty

Putty 是一个 SSH 和 telnet 客户端。如果你想远程访问你的系统,例如,假设你有多个 Ubuntu 系统,一个带有 Windows,另一个带有 SSH 服务器。那么你就可以通过远程登录到 SSH 服务器来使用 putty 软件从其他系统访问 SSH 服务器。

你需要配置 putty 以便与 Intel Edison 开发板一起使用。要通过串行连接 Intel Edison 开发板,你必须将串行端口 /dev/ttyUSB0 的自定义串行波特率设置为 115200,因为默认波特率是 9600。要设置自定义波特率,你需要在终端中输入一个命令

$stty -F /dev/ttyUSB0 115200

当你执行这条命令时,你会收到一个错误,例如 /dev/ttyUSB0 串行端口权限被拒绝。因为在 /dev/ttyUSB0 的组类别中,串行端口没有读写权限。使用以下命令,你可以查看任何文件的权限。

$ls -l /dev/ttyUSB0

/dev/ttyUSB0 的属性

现在你可以重置权限,然后在 Unix 中使用 chmod 命令来查看文件更改后的权限,你必须使用带 -l 选项的命令。以下命令是

$sudo chmod a+rw /dev/ttyUSB0

$ls -l /dev/ttyUSB0

以下是屏幕截图

为组类别分配读写权限

所以在上面的屏幕中,如果你注意到,组类别被分配了读写权限。现在你可以将自定义波特率 115200 设置到 /dev/ttyUSB0 串行端口。不会显示错误。这是随后的屏幕截图

已将自定义波特率 115200 设置到 /dev/ttyUSB0

现在配置 putty 以便远程访问 SSH 服务器,你可以使用以下命令打开 putty。

$sudo putty /dev/ttyUSB0 -serial -sercfg 115200

此命令将打开 putty 窗口,在按 Enter 键后,它会要求输入登录信息。

Putty 窗口打开

询问用户名和密码

现在,你需要执行以下步骤。我将通过以下屏幕截图进行演示

首先,输入登录名(root)和密码。如果身份验证正确,你将获得 Edison 提示符。在提示符中,输入 'ifconfig' 来配置并获取连接的 IP 地址。

配置 putty

使用此 IP 地址 (192.168.1.2),你也可以使用此命令登录

$ssh root@192.168.1.2

现在要连接 Wi-Fi,你需要输入以下命令

$configure_edison –wifi

通过输入 Wi-Fi 密码即可连接 Wi-Fi,这是随后的屏幕截图

连接 Wi-Fi

分配 Wi-Fi 密码

现在如果你想检查互联网连接,你可以使用以下命令 ping 终端

$ping google.com

检查 Wi-Fi 连接

命令提示符出现

当 Edison 提示符返回时,它就准备好开始物联网(Internet of things)工作了。在这里,我将演示我在物联网(智能家居智能时钟)方面的工作。该项目是在 Linux(ubuntu)基础上,使用 Node.js 模块和 JavaScript 环境开发的。

背景

智能时钟可以执行各种智能工作。它包含两个模块

  1. 它在 LCD 上显示当前日期和当前时间。
  2. 温度指示和报警,LCD 显示屏背景色变化,并发送电子邮件到 Gmail 地址。

在第一个模块中,它以绿色背景色在 LCD 上显示时间和日期。在第二个模块中,如果温度超过限制温度,则智能时钟会显示当前时间的温度值并发出报警通知,更改 LCD 的背景色(从绿色变为红色),并发送电子邮件到 Gmail 地址。

Using the Code

要在 LCD 上显示当前时间和日期,你需要将 LCD 连接到 Intel Edison 开发板。Intel Edison 有 I2C 端口,你需要将 LCD 连接到 I2C 端口。就像这样

LCD 连接到 Intel Edison 开发板

现在,你需要远程登录到 SSH 服务器(按照上面的步骤),并使用以下命令创建一个文件

$vi clock.js

并编写以下代码来显示日期和时间

var currentdate=new Date();
var jsUpmI2cLcd=require('jsupm_i2clcd');

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

var loop=function()

{

var time=currentdate.getHours()+”:”+currentdate.getMinutes()+”:”+
         currentdate.getSeconds();

lcd.clear();

lcd.setColor(0,255,0);

lcd.setCursor(0,3);

lcd.write(time);

var date=currentdate.getFullYear()+”-”+('0'+
  (currentdate.getMonth()+1)).slice(-2)+”-”+('0'+currectdate.getDate)).slice(-2);

lcd.setCursor(1,2);

lcd.write(date);

setTimeout(loop,500);

}

loop();

在上面的代码中,我使用了 getHours()getMinutesgetSeconds() 方法来显示当前的小时、分钟和秒。时间显示在 LCD 的第 0 行和第 3 列。显示时间在 LCD 上使用 write 方法。以及 getFullYear()getMonth()getDate() 方法来显示当前日期。日期显示在第 2 行。

要运行上述代码,你需要输入以下命令

$node clock.js

这是输出结果

显示当前时间和日期

带日期时间的智能时钟

智能时钟也可以使用以下代码以不同的方式显示当前时间和日期

var currentdate=new Date();

var jsUpmI2cLcd=require('jsupm_i2clcd');

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

var loop=function()

{

currentdate=new Date();

var targetTime=new Date(currentdate);

var timeZoneFromDB=+5.30;

var tzDifference=timeZoneFromDB*60+targetTime.getTimezoneOffset();

var offsetTime=new Date(targetTime.getTime()+tzDifference*60*1000);

//to separate the time

var time=offsetTime.getHours()+”:”+offsetTime.getMinutes()+”:”+offsetTime.getSeconds();

lcd.clear();

lcd.setColor(0,255,0);

lcd.setCursor(0,3);

lcd.write(time);

var date=new Date();

lcd.setCursor(1,0);

lcd.write(date.toGMTString());

setTimeout(loop,1000);

}

loop();

使用上述代码,我们显示当前时间为 HH:MM:SS,并显示日期为“thu, 28 Jul 2016”。以下是屏幕截图

不同格式的时间日期显示
  1. 在第二个模块中,你需要将温度传感器插槽连接器连接到 Intel Edison 开发板。你可以将其连接到 groove 板上的任何模拟端口。这里,我将其连接到 A0 端口。这里,图片如下

  2. 其次,你需要将蜂鸣器插槽连接器连接到任何数据端口。这里,我将其连接到 D5 数据端口。这里,图片如下

    你也可以连接一个 LCD 进行通知。它显示当前温度,背景色设置为绿色。如果温度超过阈值,则背景色变为红色。这就是你可以将 LCD 连接到 Intel Edison 开发板 I2C 端口的方法。

之后,你需要连接 Intel Edison 开发板并进入 Edison 命令提示符。

这是屏幕截图

以下是你可以使用代码读取温度传感器单个值。

var mraa=require('mraa');

console.log('The version of mraa is:' + mraa.getVersion());

var AnalogPin0=new mraa.Aio(0);

var B=3975;

var a=AnalogPin0.read();

var resistance=(1023.0-a)*10000.0/a;

var temperature=1/(Math.log(resistance/10000.0)/B+1/298.15)-273.15;

var value=Math.round(temperature*100)/100;

console.log(value);

在上面的代码中,温度传感器的信号连接到 A0。B 值是 thermistor.Formula (1023-a)*10000.0/a 的值,用于获取传感器的电阻。公式 1/(Math.log(resistance/10000.0)/B+1/298.15)-273.15 通过 NBSP 数据手册目录转换为温度。

以下是屏幕截图

现在,如果显示的温度超过阈值,就会生成通知。代码如下

var digitalPin5=new mraa.Gpio(5);

digitalPin5.dir(mraa.DIR_OUT);

if(value>35)

{

digitalPin5.write(1);

}

你可以编写 LCD 颜色更改通知的代码。代码如下

var AnalogPin0=new mraa.Aio(0);

var jsUpmI2cLcd=require('jsupm_i2clcd');

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

var B=3975;

var a=AnalogPin0.read();

var resistance=(1023.0-a)*10000.0/a;

var temperature=1/(Math.log(resistance/10000.0)/B+1/298.15)-273.15;

var value=Math.round(temperature*100)/100;

console.log(value);

var digitalPin5=new mraa.Gpio(5);

digitalPin5.dir(mraa.DIR_OUT);

lcd.clear();

lcd.setColor(0,255,0);

lcd.setCursor(0,1);

lcd.write(“Temprature”+value);

if(temperature>25)

{

lcd.clear();

lcd.setColor(255,0,0);

lcd.setCursor(0,1);

lcd.write(“Temprature”+value);
lcd.setColor(0,255,0);
lcd.setCursor(1,3);
lcd.write("It is hot");

digitalPin5.write(1);

}

在上面的代码中,如果温度正常,LCD 会这样显示。

正常温度

如果温度超过阈值,则会打开红色背景。

温度超过阈值

但是如果你想频繁检查温度,那么一旦超过阈值就生成通知,代码就如下所示

var mraa=require('mraa');

var jsUpmI2cLcd=require('jsupm_i2clcd');

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

console.log('The varsion o0f mraa is:' + mraa.getVersion());

var AnalogPin0=new mraa.Aio(0);

var B=3975;

var digitalPin5=new mraa.Gpio(5);

digitalPin5.dir(mraa.DIR_OUT);

var loop=function()

{

var a=AnalogPin0.read();

var resistance=(1023.0-a)*10000.0/a;

var temperature=1/(Math.log(resistance/10000.0)/B+1/298.15)-273.15;

var value=Math.round(temperature*100)/100;

console.log(value);

lcd.clear();

lcd.setColor(0,255,0);

lcd.setCursor(0,1);

lcd.write(“Temprature”+value);

if(value>25.0)

{

lcd.clear();

lcd.setColor(255,0,0);

lcd.setCursor(0,1);

lcd.write(“Temprature”+value);
lcd.setCursor(1,3);
lcd.write("Its hot");

digitalPin5.write(1);

setTimeout(loop,500);

}

}

loop();

你也可以改变温度传感器值的变化。当你拿着它靠近时,温度会升高,当远离传感器时,温度就正常了。在这里,我在下面的屏幕截图中显示了温度变化

终端上显示温度变化

Putty 上显示的温度如下

Putty 上显示的温度

如果温度超过阈值(25),你可以在终端上显示文本消息“太热了”。如下所示

通过文本指示终端温度

要获得上述文本指示,我们需要编写以下代码

if(value>25.00)

{

lcd.clear();

lcd.setColor(255,0,0);

lcd.setCursor(0,3);

lcd.write(" "+ds);

console.log("Too hot"); //to display on the terminal

lcd.setCursor(1,0);

lcd.write("Too hot"+ value);//to

digitalPin5.write(1);

}

我想通过对代码进行的小小改动,添加一个 Emoji 图片作为温度指示。

这是输出结果

带 Emoji 图片的温度指示

要获得上述输出,我们需要通过进行小的代码更改来编写以下代码

if(value>25.00)

{

lcd.clear();

lcd.setColor(255,0,0);

lcd.setCursor(0,3);

lcd.write(" "+ds);                         //to dislay the current time

console.write("Too hot "+ '\uD83D\uDE2D'); //to display message with Emoji symbol

digitalPin5.write(1);                      //To on a buzzer

}

你可以从以下链接中选择任何 emoji 图片 http://apps.timwhitlock.info/emoji/tables/unicode。在该页面上,我们获得了 Emoji 图片的 Unicode 值。点击 Unicode 数字,我们就会得到代理值。要显示特定的 Emoji 图片,我们需要以上述方式在代码中写入该值。

你可以将上述代码组合起来,例如显示当前日期和时间以及温度,并带有文本和警报通知。这是组合后的代码

var mraa=require('mraa');
var jsUpmI2cLcd=require('jsupm_i2clcd');
var lcd=new jsUpmI2cLcd.Jhd1313m1(6,0x3E,0x62);
console.log('The mraa version is:' + mraa.getVersion());
var Analogpin0=new mraa.Aio(0);
var digitalpin5=new mraa.Gpio(3);
digitalpin5.dir(mraa.DIR_OUT);
var B=3975;

var avg=0;
var n=0;

var loop=function()
{

var analogvalue=Analogpin0.read();
var registance=(1023.0-analogvalue)*10000.0/analogvalue;
var temperature=1/(Math.log(registance/10000.0)/B+1/298.15)-273.15;
var value=Math.round(temperature*100)/100;
avg=avg+value;

lcd.setColor(0,255,0);

lcd.setCursor(0,12);

lcd.write(""+value);

lcd.setCursor(1,0);

var d=new Date();
d=d.getTime()-(d.getTimezoneOffset()*60000);
d=new Date(d+(3600000*5.5));
lcd.write(""+d);

var ds=d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();
lcd.write(ds);

lcd.setCursor(0,1);

lcd.write(""+ds);

if(value>35.0)
{

 lcd.clear();

lcd.setColor(255,0,0);

lcd.setCursor(0,3);

lcd.write(""+ds);

lcd.setCursor(1,0);

lcd.write("Too hot"+ value);

digitalPin5.write(1);

}

setTimeout(loop,500);

}

loop();

这些是输出结果

当温度正常时,智能时钟会显示当前日期、时间和温度。这是输出结果

正常智能时钟

如果温度超过阈值,智能时钟会显示当前时间以及“太热了”的消息和温度值,并带有红色背景。这是输出结果

温度通知

现在,如果你想将信息邮件发送到指定的 Gmail 邮箱或几个邮箱,你可以使用通用代码

var nodemailer = require('nodemailer');
// create reusable transporter object using SMTP transport
var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'das25391890@gmail.com',  //receiver mail id
pass: '123456'                  //password of the above mail
}
});
var mailOptions = {
from: 'sender address',         // sender address 
to: 'das25391890@gmail.com' ,   // list of receivers 
subject: 'Password Reset',      // Subject line 
html: 'Temperature is increasing do the needful : 
       <b>' + temporaryPassword + ' </b>' // html body 
};
transporter.sendMail(mailOptions, function (error, info) {
if(error){
return console.log(error);
}
console.log('Message sent:'+info.response);

在上面的代码中,发送邮件我使用了 nodemailer 模块。这是一个易于使用的模块,可以通过 SMTP 使用 Node.js 发送邮件,nodemailer 对 Windows 友好,但你也可以在 Unix 系统中使用 nodemailer。要使用 nodemailer 模块,你需要使用以下命令通过 npm 来安装它

$ sudo apt-get install npm

$npm install nodemailer

$npm install googleapis --save

$npm install google-auth-library --save

你需要为不安全的应用程序开启访问权限,以便 Gmail 地址能够接收邮件。

要发送邮件,你需要一个使用 SMTP 传输的 transporter 对象,该对象在上面的代码中用于指定服务提供商、用户名和密码。如果邮件发送成功,则会显示“邮件已发送”的消息,否则会显示错误消息。在上面的代码中,特定消息将发送到指定的 das25391890@gmail.com 邮箱。

你可以通过物联网应用将上述发送邮件的代码与温度传感器集成,例如,如果温度逐渐升高并超过限制,你就可以向授权人员的 Gmail 地址发送邮件。你可以这样编写集成代码

var mraa=require('mraa');

var jsUpmI2cLcd=require('jsupm_i2clcd');

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

console.log('The varsion o0f mraa is:' + mraa.getVersion());

var AnalogPin0=new mraa.Aio(0);

var B=3975;

var digitalPin5=new mraa.Gpio(5);

digitalPin5.dir(mraa.DIR_OUT);

var loop=function()

{

var a=AnalogPin0.read();

var resistance=(1023.0-a)*10000.0/a;

var temperature=1/(Math.log(resistance/10000.0)/B+1/298.15)-273.15;

var value=Math.round(temperature*100)/100;

console.log(value);

lcd.clear();

lcd.setColor(0,255,0);

lcd.setCursor(0,1);

lcd.write(“Temprature”+value);

if(value>35.0)

{

lcd.clear();

lcd.setColor(0,255,0);

lcd.setCursor(0,1);

lcd.write(“Temprature”+value);

digitalPin5.write(1);

}

setTimeout(loop,500);

}

loop();

var nodemailer = require('nodemailer');
// create reusable transporter object using SMTP transport
var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'das25391890@gmail.com',//receiver mail id
pass: '123456'                //password of the above mail
}
});
var mailOptions = {
from: 'sender address',       // sender address 
to: 'das25391890@gmail.com' , // list of receivers 
subject: 'Password Reset',    // Subject line 
html: 'Temperature is increasing do the needfull : 
       <b>' + temporaryPassword + ' </b>' // html body 
};
transporter.sendMail(mailOptions, function (error, info) {
if(error){
return console.log(error);
}
console.log('Message sent:'+info.response);
}

在上面的代码中,如果温度超过 35 度,邮件将发送到指定的 Gmail 地址。并且在终端上,将显示以下消息

终端上显示电子邮件发送消息

这是 Gmail 地址中收到的邮件的屏幕截图

邮件已收到到 Gmail 地址

这是我最终组合的产品——一个智能台钟。这让我的书桌更智能。它显示当前的日期和时间、温度通知和 Gmail 通知。我将逐步展示产品的不同视图。

正面视图

背面视图

侧视图

侧视图

3D 视图

带当前日期时间与正常温度的笔筒

带当前时间、温度文字和警报通知的笔筒

带时间和温度邮件通知的笔筒

尝试按照你自己的方式来制作。它会让你的书桌更智能。

© . All rights reserved.