智能家居DIY
随着微功耗处理器以及通讯芯片的发展,以往较为耗能的有线通讯方式越来越阻碍了通讯网络的发展,于是一大批的无线通讯方案应运而生,例如NBIOT,蓝牙4.0,zigbee等等。同时微功耗无线处理器的流行使得传统家电带上了智能的色彩,智能家居必将是未来家庭的必备。某些高科技企业也在揶揄这块市场,纷纷推出了自家的智能家居解决方案,比较知名的有米家方案以及阿里智能的解决方案。但是回到现实的使用上来说,每个家庭的条件环境其实不一样,同样的产品未必在每个家庭上都可以使用方便,所以个性化的定制产品才可以更好的方便我们的生活。
于是在暑假期间,萌生了DIY一套智能家居方案的想法,具有各种智能开关和传感器等节点,并且对接物联平台实现联网控制以及数据的上传。由于家庭中将会使用到的智能设备种类繁多,所以我将采用模块化的设计思路,即采用核心板加外围功能部分的思路,像搭积木一样的构建各个智能设备。大家有同样想制作的想法可以参考。截至发帖前,我完成了智能网关,智能墙壁开关,无线遥控开关以及无线气象站的设计制作,之后有新的设备加入的话,我会及时的更新。
下面是一张我构思的网络拓扑图:
无线通讯方案的选择:zigbee
好早之前就接触过zigbee组网,对于这种低成本低功耗的网络还是抱有很大信心的。这里讲解选择这个网络的几大理由:
mesh结构的网络很适合智能家居的控制结构,在入网的任何一个节点都可以访问到所有节点的数据,这点很适合网关控制各个设备。
低功耗使得终端设备甚至可以采用电池供电,使得所有的模组都尽量可能的无线化。
多跳传输,无线方案中最大的问题就是数据发送的不稳定以及障碍物对信号的遮挡导致数据无法正确传输,而ZigBee的多跳恰好解决了这个问题,节点会自动选择优质的传输路线多跳传输,保证信号质量。
zigbee网络确实是好,但是对于我这种比较懒惰的人并不想去学习那复杂的传输理论以及zigbee通讯芯片的编程,于是我选择上网购买ZigBee模块,最后选择了一种小型的串口转zigbee模块,比较方便单片机通讯。
核心板的制作:
说到模块化,那么就需要核心的控制板。本质来说就是将单片机以及购买的zigbee模块集成到一张电路板上,并且预留各种接口,方便后期移植到各种设备上,这样一张电路板就可以适用各种智能家居设备了。
于是一番绘制原理图以及PCB之后,成品大概明朗了:
焊接好的成品如下:
这将会成为以后所有我的智能家居方案的核心控制板。
网关的制作
完成了核心板的制作,网关成为了下一个比较关注的对象,因为家中的所有智能设备的控制以及通讯都会由他来完成,包括链接到互联网上传数据,所以说对于网关的硬件选取也是重中之重。上联互联网,下接zigbee小型通讯网,网关担任了一个家庭控制中心的角色,对于它的选择我认为esp8266是个不错的方案,可以支持arduino ide编程,这对于不太了解网络通讯协议的我来说是个好消息,因为在arduino的编程中,我可以借助强大的库函数来完成我想要的功能。
这样我需要对ESP8266进行片上编程,并调用它的串口和zigbee模块通信,当zigbee的节点收到其他设备发来的数据的时候,esp8266可以对其处理或者通过WiFi上传到云平台,整体的设计思路就是这样。
为了方便网关节点的状态显示以及相关信息读取,为以后的调试提供便利,我给网关添加了一块4.3寸的串口触摸屏,这样方便信息的读取以及调试工作。
完成了zigbee节点核心板的设计以及网关的硬件选择,整个智能家居系统的主要部分就构建完成了,我先不讲解程序的编写,因为我将会在调试好每一个智能设备之后,再对网关进行编写对应设备的接口程序。即完成一个智能设备的开发之后再对接网关,使其加入到家中的zigbee网络,实现联动控制或者联网控制,因为毕竟我使用的ZigBee模组只是起一个通讯的作用,具体的功能实现还是靠核心板上的单片机来完成。这种开发方法叫做迭代开发,对于较为庞大的项目是一种较好的解决方案。
智能开关的制作
下面是介绍智能墙壁开关的设计,核心就是使得家里墙壁开关智能化,可以联网控制,达到场景联动,智能控制等目的。
我尝试就家中的传统开关进行改造,但是发现拆开之后内部空间实在不够,没法完成改装
于是尝试网购新的开关,寻找空间大些的墙壁开关,后来我找到了专门生产触摸智能开关外壳的厂家,购买了几个触摸墙壁开关的外壳,内部空间较大,适合改造
由于是触摸面板,所以我准备使用触摸模块作为输入
关于执行机构,也就是一充当原来机械开关的器件,我准备使用继电器来代替。继电器可以让我使用单片机输出的信号去控制220V交流电压的通断,并且提供良好的隔离以及绝缘性能。
1.代码的编写:
对于 智能开关节点,我将zigbee模块配置成了路由器节点,这样做的好处是,墙壁开关同时扮演了一个路由器的角色,看可以协助一些远距离的终端节点完成多跳数据传输。
同样的,为了响应国家节能减排的号召,我给单片机配置成了空闲模式以节省功耗,但是空闲模式下单片机没法正确及时的检测到触摸按键的按下,所以我使用单片机的外部中断来检测触摸按键,当触摸按键按下时,单片机检测到电平变化,引发中断,唤醒单片机,使得单片机执行相关指令。
当zigbee模块收到来自智能网关的数据时候(例如闭合开关或者断开开关),其输出数据引发的串口中断也会唤醒单片机,这时候单片机会执行收到的指令,随后再次进入空闲模式。
此外,为了更好的检测每个开关的状态,每次开关有动作之后,会将当前的状态上报给智能网关,以便网关检测家中所有的开关状况。
2.开关的测试:
链接zigbee的协调器节点到电脑上,打开智能开关的电源,可以看到每当我触摸开关,对应的继电器都会动作,并且协调器节点串口都会输出一些数据:
下面是一帧数据的解读
测试完毕,智能开关达到了我想要的功能,下面就是针对我购买的外壳设计PCB板了
3.智能开关PCB的设计与制作:
对于购买的外壳,我先找到了一张厂家提供的CAD图纸,上面标有了一些基本尺寸,这样方便我去设计一块合适的PCB板。
将之前在面包板上搭建的电路,绘制成原理图之后效果如下:
转换成PCB文件后,经过简单的元件摆放以及布线后,完成的效果如下:
将交流高压部分和直流低压部分开槽隔离,提供了较好的抗干扰特性。而反面则设有zigbee模块以及单片机的位置。
约几天后,我收到了制作好的板子。
同时到来的还有一些元器件。
焊接过程太繁琐无聊,略去。焊接好之后的效果图
安装上触摸模块之后,使用双面胶将触摸模块粘贴在面板玻璃上。
烧录程序,合上外壳。背后使用标签标明出接线口定义,方便安装。
使用智能开关替代家中的传统开关。
4.网关对应程序的编写:
这部分的程序主要是网关接受物联平台发来的控制指令json字符串,然后解码翻译,最后通过zigbee网络告知智能开关引起相应动作。所以其核心在于接受服务器的json字符串,解释其含义。
同样的,还是使用arduino的json库来处理这些信息,查阅物联平台的通讯协议手册,发现采用如下格式:
所以只需要解读say指令后面附带的指令即可,于是很快的,一个使用else if语句的并列结构就写好了,程序对收到的字符串依次判断,如果相同则发送指令给智能开关。
上传程序到ESP8266,开始测试!
5.综合测试
安装智能开关到位,接上网关的电源,触摸触摸开关,电灯可以正常开启关闭
拿出手机,打开物联平台,按下开启电灯按钮,电灯开启。
测试完毕
至此,我实现了智能开关的设计,电路搭建以及使用网络控制。并且支持各种功能扩展(定时开关,和人体传感器联动等等),升级空间十分大,并且可联网控制,给生活带来了很大方便。
无线遥控开关制作篇
晚上睡觉前,有的墙壁开关距离床上太远,因此不方便关灯,所以我准备设计一款遥控无线开关,可以通过配对的形式完成对家中所有智能设别的控制,类似于随手贴开关。下面是介绍无线遥控开关的设计。
1.电路设计
作为zigbee网络中的终端节点,无线遥控开关需要具有低功耗的运行模式,因此根据我采用的e18zigbee模块的数据手册,将其配置成睡眠模式
拿出之前制作的zigbee最小系统板
无线遥控开关上面共有一个按键用来操作,所以焊接一个按键开关到最小板模块上
另外焊接上电源线,采用纽扣电池供电
用3D打印机打印了盖子
将板子切割一下放进去
组装好后的样子
2.网关对应的配置:
我绘制了一个显示屏的界面
在此界面下,按下墙壁开关的配对按钮
此时显示屏上会显示相关信息,设备编号为1的会显示在第一行,以此类推,超出一页的部分会自动翻页
如果复位按键损坏,还可以使用MAC地址添加方式
点击信息右边的配对按钮,屏幕下方会显示配对中的提示语
此时按下无线遥控开关按钮
即可在显示屏上见到配对成功的提示语
此时使用无线遥控开关即可控制灯的亮灭
实现这个功能的主原理就是无线开关记住了墙壁开关的短地址,这样每次按下按键都会发送一次数据给智能墙壁开关以便控制亮灭。并且由于是电池供电的开关,为了避免在更换电池之后需要重新配对的问题,我使用了单片机内置的eeprom来存储短地址,这样就无需每次上电都要重新配对了。