首页-达尔闻    全部    【项目分享】ESP8266+Zigbee组网改造墙壁开关

【项目分享】ESP8266+Zigbee组网改造墙壁开关

最初的项目是想自己制作一套智能家居控制系统,有各类智能开关和传感器等节点,并且对接物联平台实现联网控制以及数据的上传。

想要控制家里诸多的智能电器或者设备,就要需要用到模块的设计,即通过核心板和外围功能电路组成,如搭乐高一样,可以根据需求搭建想要的功能。如果你们也想试试自己家的智能开关,不妨和我一起做吧。
收藏
  • 低功耗MCU,NBIoT,蓝牙4.0,Zigbee等技术的发展让智能家居逐渐走进万家。但每个家里的具体条件即布置环境不一样,只有增加个性化的定制产品才可以更好的方便生活。今天我们分享刘同学(知乎:皮皮学电子)对自己家的墙壁开关的改造过程,看看他对智能家居是如何定义的。

    01设想篇

    最初的项目是想自己制作一套智能家居控制系统,有各类智能开关和传感器等节点,并且对接物联平台实现联网控制以及数据的上传

    想要控制家里诸多的智能电器或者设备,就要需要用到模块的设计,即通过核心板和外围功能电路组成,如搭乐高一样,可以根据需求搭建想要的功能。如果你们也想试试自己家的智能开关,不妨和我一起做吧。

    下面是智能家居系统的网络组成拓扑图:

    无线通讯方案选择之前就接触过Zigbee组网,也是大家常用的组网方式,成本低,而且简单。这里讲解选择这个网络的几大理由:

    Zigbee网络确实是好,如果不想去学习那复杂的传输理论以及Zigbee通讯芯片的编程,可以选择购买ZigBee模块。比如下面这种小型的串口转Zigbee模块,比较方便单片机通讯。

    说到模块化,那么就需要核心的控制板。本质来说就是将单片机以及购买的Zigbee模块集成到一张电路板上,并且预留各种接口,方便后期移植到各种设备上,这样一张电路板就可以适用各种智能家居设备了。

    一番绘制原理图以及PCB之后,成品大概明朗了:

    焊接好的成品如下:

    这将会成为以后所有我的智能家居方案的核心控制板

    完成了核心板的制作,网关成为了下一个比较关注的对象,因为家中的所有智能设备的控制以及通讯都会由它来完成,包括链接到互联网上传数据。上联互联网,下接Zigbee小型通讯网,网关担任了一个家庭控制中心的角色,对于它的选择我认为ESP8266是个不错的方案,可以支持Arduino ide编程,这对于不太了解网络通讯协议的小伙伴来说是个好消息,因为在Arduino的编程中,可以借助强大的库函数来完成我想要的功能。

    ESP8266大家一定非常熟悉了,我手头也有一块,所以正好用上。

    我需要对ESP8266进行片上编程,并调用它的串口和Zigbee模块通信,当Zigbee的节点收到其他设备发来的数据的时候,ESP8266可以对其处理或者通过WiFi上传到云平台,整体的设计思路就是这样。

    为了方便网关节点的状态显示以及相关信息读取,为以后的调试提供便利,给网关添加了一块4.3寸的串口触摸屏,这样方便信息的读取以及调试工作。

    完成了Zigbee节点核心板的设计以及网关的硬件选择,整个智能家居系统的主要部分就构建完成了。

    先不讲解程序的编写,因为我将会在调试好每一个智能设备之后,再对网关进行编写对应设备的接口程序。即完成一个智能设备的开发之后再对接网关,使其加入到家中的zigbee网络,实现联动控制或者联网控制。因为毕竟我使用的ZigBee模组只是起一个通讯的作用,具体的功能实现还是靠核心板上的单片机来完成。这种开发方法叫做迭代开发,对于较为庞大的项目是一种较好的解决方案。

    02制作篇

    下面是介绍智能墙壁开关的设计,核心就是使得家里墙壁开关智能化,可以联网控制,达到场景联动,智能控制等目的。

    尝试就家中的传统开关进行改造,但是发现拆开之后内部空间实在不够,没法完成改装。于是尝试网购新的开关,寻找空间大些的墙壁开关,后来我找到了专门生产触摸智能开关外壳的厂家,购买了几个触摸墙壁开关的外壳,内部空间较大,适合改造。由于是触摸面板,所以我准备使用触摸模块。

    关于执行机构,也就是一充当原来机械开关的器件,我准备使用继电器来代替。继电器可以让我使用单片机输出的信号去控制220V交流电压的通断,并且提供良好的隔离以及绝缘性能。

    对于智能开关节点,我将Zigbee模块配置成了路由器节点,这样做的好处是,墙壁开关同时扮演了一个路由器的角色,看可以协助一些远距离的终端节点完成多跳数据传输。例如我想在卧室使用一个无线开关去控制家门口的灯光,直接将数据发送到家门口的智能开关上或许信号强度不够造成通信失败,这时我在客厅增加一个路由器节点之后,无线开关的信号便可以传输到家门口的智能开关上。

    在正常工作的时候,我给单片机配置成了空闲模式以节省功耗,但是空闲模式下单片机没法正确及时的检测到触摸按键的按下,所以我使用单片机的外部中断来检测触摸按键,当触摸按键按下时,单片机检测到电平变化,引发中断,唤醒单片机,使得单片机执行相关指令。

    当Zigbee模块收到来自智能网关的数据时候(例如闭合开关或者断开开关),其输出数据引发的串口中断也会唤醒单片机,这时候单片机会执行收到的指令,随后再次进入空闲模式。

    此外,为了更好的检测每个开关的状态,每次开关有动作之后,会将当前的状态上报给智能网关,以便网关检测家中所有的开关状况。

    链接zigbee的协调器节点到电脑上,打开智能开关的电源,可以看到每当我触摸开关,对应的继电器都会动作,并且协调器节点串口都会输出一些数据:

    下面是一帧数据的解读(这个数据包结构是我自己定义的,非zigbee模块需要的指令结构)

    测试完毕,智能开关达到了我想要的功能,下面就是针对我购买的外壳设计PCB板了。

    智能开关PCB的设计与制作:对于购买的外壳,我先找到了一张厂家提供的CAD图纸,上面标有了一些基本尺寸,这样方便我去设计一块合适的PCB板。将之前在面包板上搭建的电路,绘制成原理图之后效果如下:

    点击可放大转换成PCB文件,经过简单的元件摆放以及布线后,完成的效果如下:

    将交流高压部分和直流低压部分开槽隔离,提供了较好的抗干扰特性。而反面则设有Zigbee模块以及单片机的位置。

    焊接好之后的效果图:

    安装上触摸模块之后,使用双面胶将触摸模块粘贴在面板玻璃上。

    烧录程序,合上外壳,背后使用标签标明出接线口定义,方便安装。

    使用智能开关替代家中的传统开关。

    03网关对应程序的编写

    这部分的程序主要是网关接受物联平台发来的控制指令json字符串,然后解码翻译,最后通过Zigbee网络告知智能开关引起相应动作。所以其核心在于接受服务器的json字符串,解释其含义。同样的,还是使用Arduino的json库来处理这些信息,查阅物联平台的通讯协议手册,发现采用如下格式:

    所以只需要解读say指令后面附带的指令即可,于是很快的,一个使用else if语句的并列结构就写好了,程序对收到的字符串依次判断,如果相同则发送指令给智能开关。

    上传程序到ESP8266,开始测试!

    04综合测试

    安装智能开关到位,接上网关的电源,触摸触摸开关,电灯可以正常开启关闭,拿出手机,打开物联平台,按下开启电灯按钮,电灯开启。

    至此,墙壁开关的设计,电路搭建以及使用网络控制都已经完成。剩下的就是加入各种联动功能了。并且支持各种功能扩展(定时开关,和人体传感器联动等等),升级空间十分大,给生活带来了很大方便。

    05无线遥控开关制作

    晚上睡觉前,墙壁开关距离床上太远,因此不方便关灯,所以我准备设计一款遥控无线开关,可以通过配对的形式完成对家中所有智能设备的控制,类似随手贴开关。下面是介绍无线遥控开关的设计。

    1)电路设计

    作为zigbee网络中的终端节点,无线遥控开关需要具有低功耗运行模式,因此根据我采用的e18zigbee模块的数据手册,将其配置成睡眠模式

    拿出制作好的zigbee最小系统板

    无线遥控开关上面有一个按键用来操作,所以焊接一个按键开关到最小板模块上

    另外焊接上电源线,采用纽扣电池供电(纽扣电池在背面)

    用3D打印机打印了壳子(打印机不是调的很好,打出来比较粗糙),将板子切割一下放进去:

    组装好的样子

    2)网关对应的配置

    我绘制了一个显示屏的界面:

    在此界面下,按下墙壁开关的配对按钮:

    此时显示屏上会显示相关信息,设备编号为1的会显示在第一行,以此类推,超出一页的部分会自动翻页:

    如果复位按键损坏,还可以使用MAC地址添加方式:

    点击信息右边的配对按钮,屏幕下方会显示配对中的提示语

    此时按下无线遥控开关的按钮

    即可在显示屏上见到配对成功的提示语:

    此时使用无线遥控开关即可控制灯的亮灭:

    实现这个功能的主要原理就是无线开关记住了墙壁开关的短地址,这样每次按下按键都会发送一次数据给智能墙壁开关以便控制亮灭。之后,这个遥控还可以设置控制其他开关,实现一对多控制。以上我通过Zigbee网络实现了对家里墙壁开关的控制,后续还有气象站等制作的分享。你也想改造自己的家?但是苦于技术不够?达尔闻推荐一个夯实电源基础的课程,观看方式如下:

    电源课横板超链接图片

     

Control Render Error!ControlType:productSlideBind,StyleName:Style1,ColorName:Item0,Message:InitError, ControlType:productSlideBind Error:未将对象引用设置到对象的实例。