本帖最后由 满嘴谗言 于 2016-9-5 10:01 编辑
基于Intel Edison的Zigbee Gateway设计
0.引言
许多研究机构的数据预测表明,未来的风口会是物联网,IoT“万物互联”的概念从很久就开始了,但是迟迟不能走进寻常百姓的家,不过我相信,随着技术的不断进步和协议的不断发展完善,大家一定能实现万物互联的愿望!
本项目是基于Intel Edison设计的一个Zigbee网关。大家都知道,目前的智能家居行业,ZIgbee或者Wifi或者Bluetooth,谁将会是未来协议的统一着和领导者,目前还没有定论。首先,Wifi因为门槛低(例如人人都有路由器,人人都有
手机),貌似是一个合适的协议平台,但是由于其功耗高,组网功能不是很成熟,所以对于少数(5个以下)设备的互联是很有优势的;Bluetooth设备的Mesh协议已经发放,但是由于传输距离近,如果中间一个节点被破快,可能影响整个链路的稳定性,目前还没有大批量的使用在智能家居上,多半是一些腕表类的设备,需要电池供电等耗能较低的功耗的设备上;而Zigbee由于其优秀的组网功能和优秀的传输距离,以及低功耗,已经成为智能家居行业的主流协议。
很遗憾的是,Zigbee的设备买回来因为不能和家里的路由器或者手机(可连接Wifi或者蓝牙)直接相连,所以,入门的门槛一直很高:因为你需要一个Zigbee的网关,来转发你手机端发出的控制信号到设备终端,起到控制或者监测等功能的“万物互联”功能!在这个背景下,我的项目诞生了!
1.项目名称:基于Intel Edison的Zigbee gateway
2.系统框图说明:
由Intel Edison作为Wifi(TCP/IP)数据的接收端,然后通过Intel Edison的串口端发送信息到Zigbee模块上(信息中包含ID和控制信息);同时,Zigbee灯泡(终端)反馈的信息可以通过Zigbee模块来传到Intel Edison,然后再转发至TCP/IP上,最终传输到手机端。
3.系统硬件描述:
Intel Edison一套;
Arduino
开发板扩展版一套;
Zigbee模块一个;
Zigbee灯泡一个.
(Zigbee模块用的是Silicon Labs的EM357芯片外挂一颗PA,板载的
PCB天线组成)
(带有Zigbee模块的球泡灯,这个灯泡是不是很有颜值啊!)
3.软件说明:
3.1WIfi通讯部分:
这部分是参考了anger0925的一篇帖子想到的:(
https://bbs.elecfans.com/jishu_919753_1_1.html)
这里我也用了Blynk的库函数和App端。
这里我新建了一个虚拟按键和一个滑动条。
虚拟按键用来控制LED灯泡的开关和熄灭;滑动条用来控制LED的亮度。Arduino的代码参考了BlynkSimpleIntelEdisonWiFi的例子(首先要下载Blynk的库,然后解压到Arduino的安装目录下面,这个我就不多说了)
下面是Wifi例子的程序:
- #define BLYNK_PRINT Serial // Comment this out to disable prints and save space
- #include
- #include
- // You should get Auth Token in the Blynk App.
- // Go to the Project Settings (nut icon).
- char auth[] = "8acd8819a0e8488a978c44539c7249e2";
- // Your WiFi credentials.
- // Set password to "" for open networks.
- char ssid[] = "Allison_newWifi";
- char pass[] = "Allison20151001";
- void setup()
- {
- Serial.begin(9600);
- Blynk.begin(auth, ssid, pass);
- // Or specify server using one of those commands:
- //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8442);
- //Blynk.begin(auth, ssid, pass, server_ip, port);
- }
这样,手机端和Intel Edison的通讯就完成了。
3.2Zigbee模块通讯部分
其实我的Zigbee模块上是运行了ZHA V1.2的,也就是说我从串口发送一个命令,可以实现组网,认证和控制等相关功能的。具体的我就不详述了,因为这个也涉及到公司的秘密,详细的代码我也不贴出来了。
我可以简单讲一下ZLL协议的部分(其实和ZHA协议差不多)
每一个主设备或者从设备会有不同的ID,先找到ID,然后给不同的ID发送不同的命令(例如on/off,或者PWM调光等),再加上一个返回码,包含错误代码等等。
3.3 Intel Edison主程序部分
主程序为一个Arduino项目,首先包括和服务器的链接部分,然后是虚拟按键的事件上报,在handler程序中,对虚拟按键的状态进行读取,然后通过串口发送数据到Zigbee的模块,进而控制灯泡。
滑动条的状态是一样的:监测滑动条的数据状态,然后上报,通过串口数据的发送到Zigbee模块,对Zigbee灯泡调光。
4.项目效果演示:
App端的On、off和滑动条来控制灯泡的亮度:
灯泡的效果动画:
(LED太亮了,根本看不清调节的效果。。。)
5.项目总结:
本项目只是利用Intel Edison简单的实现远端控制灯泡的开关和亮度的调节。
更多更复杂的应用,譬如灯泡的配对,灯泡是否在线的实时状态查看,开机自动检查程序的版本并及时链接到服务器更新最新的程序,定时开关灯泡。。。等等。当涉及到多个灯泡的时候,就不能用广播的形式来发送控制命令(本例子是用广播的方式来实现控制的),包括多个灯泡同时发送不同的亮度指令时,进程的优先级等优化算法的问题没有考虑进去。
总之,非常感谢
电子发烧友的试用机会,也认识到不少朋友,并成功解决了自己在App和云端的一些问题,自己也是从中学到不少。
希望以后能多参加一些这样的活动,给大家带来更多的分享!