智能家居折腾记录–DIY设备#3(上)

发布于 2020-03-01  141 次阅读


最新

已填坑,还绘制了pcb,全部教程见下篇


多控开关

多控开关是啥呢,就是既可以通过智能家居平台控制,也可以使用实体按键直接控制的开关。

市场上的智能开关就不用说有多贵了。。双控自回弹的双键开关就上百,而且还只有面板开关,就是控制灯啊这些的,带开关的插座多不支持多控。

这次就是利用arduino做一个八路的多控开关,成本极低,可用于非智能开关的改造,而且支持非回弹的普通开关控制。

GitHub地址

实现方式

实现方式其实很简单,arduino做下位机,解析串口指令。八个针脚做输入,检测实体按键的状态,八个针脚做输出,控制继电器/晶闸管。esp8266做上位机,接入homeassistant。下位机也没有必要做任务调度,把所有的指令和数据都压缩成了一字节,丢了就丢了,大不了重新发,反正只是一个开关。代码部分的细节不再过多解释了。

使用方法

硬件:

  • 主控推荐arduino nano/pro mini/mini ,IO数量较多,价格便宜。
  • 继电器或晶闸管模块,5v高电平触发版本的。
  • 开关接线一端连接单片机输入针脚,另一端接地,开关触发就是给单片机一个低电平。

固件配置,打开源代码,在其中修改:

  • 选择开关版本,默认普通的开关(非回弹),取消注释即是回弹开关或其他按钮。
  • 选择针脚数量,最大数目为8(8对,8路输入,8路输出)。
  • 选择IO针脚位置,直接把用到的针脚名填入数组中,输入针脚和输出针脚在数组中的位置一一对应。
  • 选择串口通信波特率,默认115800。

上位机查询命令:

上位机以十六进制发送字节 0x18,查询开关的状态,返回值为两个十六进制字节:{0x33,data},其中0x33是固定的返回数据头,data是开关的状态
例如:现在有八路继电器,其状态为{开,关,开,开,关,关,开,开}。每一位的开关用01表示,则开关状态表示为二进制为:10110011 --> 转换为十六进制就是:0xb3
所以返回的数据就是{0x33,0xb3}
注:编号越小的开关(在针脚定义数组中靠前的),在数据中占据的是高位,八位开关,第一个开关的状态就是二进制表示中最开头的那一位。

上位机设置命令:

上位机发送 {0x29,data}设置开关的状态,data的格式和查询的返回值一样,是用二进制表示开关状态后转换成十六进制发送。返回值为0x33,确认收到消息。

挖个坑

上位机的espHome代码还未完成,预想的功能就是能够检测下位机是否在线(心跳包),设置指令超时未响应重新传输 等等。 (直接轮询也不是不能用,反正都要轮询)现在就是在等arduino到货(把吃蝙蝠的人头给打爆)。


当其他人都认为你要鸽的时候,你鸽了,亦是一种不鸽