跳转到主要内容
editor Chen 提交于

2016年7月和8月,英特尔开发人员专区联合电子发烧友网站,推出Intel Edison开发板试用活动,期间得到众多发烧友的热烈反响和积极参与,现分享一部分网友的优秀作品,供大家参考。本文由原作者发表于电子发烧友论坛,原文链接请参见本文末尾相关信息。

0.引言

许多研究机构的数据预测表明,未来的风口会是物联网,IoT“万物互联”的概念从很久就开始了,但是迟迟不能走进寻常百姓的家,不过我相信,随着技术的不断进步和协议的不断发展完善,大家一定能实现万物互联的愿望!

本项目是基于Intel Edison设计的一个Zigbee网关。大家都知道,目前的智能家居行业,ZIgbee或者Wifi或者Bluetooth,谁将会是未来协议的统一着和领导者,目前还没有定论。首先,Wifi因为门槛低(例如人人都有路由器,人人都有手机),貌似是一个合适的协议平台,但是由于其功耗高,组网功能不是很成熟,所以对于少数(5个以下)设备的互联是很有优势的;Bluetooth设备的Mesh协议已经发放,但是由于传输距离近,如果中间一个节点被破快,可能影响整个链路的稳定性,目前还没有大批量的使用在智能家居上,多半是一些腕表类的设备,需要电池供电等耗能较低的功耗的设备上;而Zigbee由于其优秀的组网功能和优秀的传输距离,以及低功耗,已经成为智能家居行业的主流协议。

很遗憾的是,Zigbee的设备买回来因为不能和家里的路由器或者手机(可连接Wifi或者蓝牙)直接相连,所以,入门的门槛一直很高:因为你需要一个Zigbee的网关,来转发你手机端发出的控制信号到设备终端,起到控制或者监测等功能的“万物互联”功能!在这个背景下,我的项目诞生了!

1.项目名称:

基于Intel Edison的Zigbee gateway

2.系统框图说明:

<center><img src="http://intel.eetrend.com/files/2017-01/wen_zhang_/100004607-15044-1.png…; alt=“” width="600"></center>

由Intel Edison作为Wifi(TCP/IP)数据的接收端,然后通过Intel Edison的串口端发送信息到Zigbee模块上(信息中包含ID和控制信息);同时,Zigbee灯泡(终端)反馈的信息可以通过Zigbee模块来传到Intel Edison,然后再转发至TCP/IP上,最终传输到手机端。

3.系统硬件描述:

Intel Edison一套;
Arduino开发板扩展版一套;
Zigbee模块一个;
Zigbee灯泡一个.

<center><img src="http://intel.eetrend.com/files/2017-01/wen_zhang_/100004607-15045-3.jpg…; alt=“” width="600"></center>

<center><img src="http://intel.eetrend.com/files/2017-01/wen_zhang_/100004607-15046-4.jpg…; alt=“” width="600"></center>

(Zigbee模块用的是Silicon Labs的EM357芯片外挂一颗PA,板载的PCB天线组成)

<center><img src="http://intel.eetrend.com/files/2017-01/wen_zhang_/100004607-15047-5.jpg…; alt=“” width="600"></center>

(带有Zigbee模块的球泡灯,这个灯泡是不是很有颜值啊!)

4.软件说明:

4.1WIfi通讯部分:

这部分是参考了anger0925的一篇帖子想到的:(http://bbs.elecfans.com/jishu_919753_1_1.html
这里我也用了Blynk的库函数和App端。
这里我新建了一个虚拟按键和一个滑动条。

<center><img src="http://intel.eetrend.com/files/2017-01/wen_zhang_/100004607-15048-6.png…; alt=“” width="600"></center>

虚拟按键用来控制LED灯泡的开关和熄灭;滑动条用来控制LED的亮度。Arduino的代码参考了BlynkSimpleIntelEdisonWiFi的例子(首先要下载Blynk的库,然后解压到Arduino的安装目录下面,这个我就不多说了)
下面是Wifi例子的程序:
<div>
<table>
<tbody>
<tr>
<td>01</td>
<td>#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>02</td>
<td>#include</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>03</td>
<td>#include</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>04</td>
<td> </td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>05</td>
<td>// You should get Auth Token in the Blynk App.</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>06</td>
<td>// Go to the Project Settings (nut icon).</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>07</td>
<td>char auth[] = &quot;8acd8819a0e8488a978c44539c7249e2&quot;;</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>08</td>
<td> </td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>09</td>
<td>// Your WiFi credentials.</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>10</td>
<td>// Set password to &quot;&quot; for open networks.</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>11</td>
<td>char ssid[] = &quot;Allison_newWifi&quot;;</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>12</td>
<td>char pass[] = &quot;Allison20151001&quot;;</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>13</td>
<td> </td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>14</td>
<td>void setup()</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>15</td>
<td>{</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>16</td>
<td>  Serial.begin(9600);</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>17</td>
<td>  Blynk.begin(auth, ssid, pass);</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>18</td>
<td>  // Or specify server using one of those commands:</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>19</td>
<td>  //Blynk.begin(auth, ssid, pass, &quot;blynk-cloud.com&quot;, 8442);</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>20</td>
<td>  //Blynk.begin(auth, ssid, pass, server_ip, port);</td>
</tr>
</tbody>
</table>
</div>
<div>
<table>
<tbody>
<tr>
<td>21</td>
<td>}</td>
</tr>
</tbody>
</table>
</div>

这样,手机端和Intel Edison的通讯就完成了。

4.2Zigbee模块通讯部分

其实我的Zigbee模块上是运行了ZHA V1.2的,也就是说我从串口发送一个命令,可以实现组网,认证和控制等相关功能的。具体的我就不详述了,因为这个也涉及到公司的秘密,详细的代码我也不贴出来了。 我可以简单讲一下ZLL协议的部分(其实和ZHA协议差不多)

<center><img src="http://intel.eetrend.com/files/2017-01/wen_zhang_/100004607-15049-7.png…; alt=“” width="600"></center>

每一个主设备或者从设备会有不同的ID,先找到ID,然后给不同的ID发送不同的命令(例如on/off,或者PWM调光等),再加上一个返回码,包含错误代码等等。

4.3 Intel Edison主程序部分

主程序为一个Arduino项目,首先包括和服务器的链接部分,然后是虚拟按键的事件上报,在handler程序中,对虚拟按键的状态进行读取,然后通过串口发送数据到Zigbee的模块,进而控制灯泡。
滑动条的状态是一样的:监测滑动条的数据状态,然后上报,通过串口数据的发送到Zigbee模块,对Zigbee灯泡调光。

5.项目效果演示:

App端的On、off和滑动条来控制灯泡的亮度:

<center><img src="http://intel.eetrend.com/files/2017-01/wen_zhang_/100004607-15050-8.png…; alt=“” width="600"></center>

<center><img src="http://intel.eetrend.com/files/2017-01/wen_zhang_/100004607-15051-9.png…; alt=“” width="600"></center>

灯泡的效果动画:

<center><img src="http://intel.eetrend.com/files/2017-01/wen_zhang_/100004607-15052-10.gi…; alt=“” width="600"></center>

(LED太亮了,根本看不清调节的效果。。。)

6.项目总结:

本项目只是利用Intel Edison简单的实现远端控制灯泡的开关和亮度的调节。
更多更复杂的应用,譬如灯泡的配对,灯泡是否在线的实时状态查看,开机自动检查程序的版本并及时链接到服务器更新最新的程序,定时开关灯泡。。。等等。当涉及到多个灯泡的时候,就不能用广播的形式来发送控制命令(本例子是用广播的方式来实现控制的),包括多个灯泡同时发送不同的亮度指令时,进程的优先级等优化算法的问题没有考虑进去。
总之,非常感谢电子发烧友的试用机会,也认识到不少朋友,并成功解决了自己在App和云端的一些问题,自己也是从中学到不少。

希望以后能多参加一些这样的活动,给大家带来更多的分享!

作者:电子发烧友网站用户 <a href="http://bbs.elecfans.com/space-uid-1927031.html&quot; target="_blank" rel="nofollow">满嘴谗言</a>,原文链接:<a href="http://bbs.elecfans.com/jishu_936048_1_1.html&quot; target="_blank" rel="nofollow">http://bbs.elecfans.com/jishu_936048_1_1.html</a&gt;