github项目地址
自制的多控开关,最高支持八路开关(普通or回弹),esphome直接接入HA
github内有简单的使用说明,占个坑先,后续更新图文版本
本项目只是为了满足自家装修需求,放出来仅供大家参考
4.3日更新:
简单焊了块板子。。5w的usb电烙铁走锡线不是人干的事
用的是esp01s + arduino pro mini
刚来论坛不让贴超过一张图。。。只能放视频链接了
具体操作效果见视频:百度云链接 提取码:cvwk
项目背景
新家打算搞点智能家居玩,也一直在折腾home assistant。考虑到家里的面板开关较多,若全部换成目前市场上的智能开关,一个是成本过高(sonoff/绿米aqra…),一个是全部采用较为便宜的wifi接入的话家里的ap怕承受不住。因此就打算自制一个多路智能开关模块,这样使用普通的灯和普通的面板开关也能接入HA实现智能控制,并且缩减wifi终端数量,并且实现集中管理。
基本特性
- 支持普通开关或自回弹开关
- 多控的功能与固件无关,只需要开关支持多控接法即可
- HA崩溃了一样不影响按键控制
- 开关状态实时同步
- 最高支持8路继电器,即8路开关
基本原理及使用方法
硬件接线
以四路为例,简单接线如图
下位机arduino的输入引脚连接开关,开关跨接到GND与输入引脚之间,开关闭合时,arduino输入引脚就是低电平,此时arduino判断对应开关被按下,此时对应的输出引脚输出高电平。
下位机arduino输出引脚连接5v继电器模块的控制端,控制火线的通断。当某个输出引脚为高电平的时候,对应的继电器吸合,电路导通。
图中从左到右四个开关对应控制下方从左到右的四个继电器
开关分别连接到arduino的6,7,8,9引脚
继电器分别连接10,11,12,13引脚
上位机(图中开发板型号为WeMos D1 Mini,node mcu等其他开发板同理,只要任意两个空闲的GPIO口即可)
这里选择D5口(对应esp8266GPIO14)当作tx,D6口(对应esp8266GPIO12)当作rx,分别连接到下位机arduino的rx口和tx口。
软件部分
首先是下位机,只讲需要注意和修改的部分:
我们用的是普通开关,因此这一行保持注释
//#define SELF_RECOVERY //uncomment this if you are using a self recovery switch 如果你使用的是自回弹的开关,把这行代码取消注释
下一步,我们使用的是四路开关,PIN_COUNT 如下填入4,波特率不用修改
#define PIN_COUNT 4 //define the quantity of pins that used for IO 定义开关数量,数字1-8
#define BAUD 9600 //baud rate 串口波特率,一般不用改
下一步,填写输入输出引脚,首先注释掉所有预定义的引脚
//定义用到的io口,inputPinList定义用于输入的引脚,outputPinList定义用于输出的引脚,引脚之间是一一对应关系,即数组中相同位置的输入引脚控制相同位置的输出引脚,数量必须与之前定义的开关数量相同
//以下为arduino uno/nano/pro mini/mini的预定义引脚
//uint8_t inputPinList[] = {2, 3, 4, 5, 6, 7, 8, 9}; //maximum pin using in arduino uno/nano/pro mini/mini
//uint8_t outputPinList[] = {10,11,12,13,14,15,16,17}; //maximum pin using in arduino uno/nano/pro mini/mini
//以下为esp8266 nodemcu的预定义引脚
//const uint8_t inputPinList[] = {0, 4, 5,10}; //maximum pin using in esp8266-12e nodemcu
//const uint8_t outputPinList[] = {15, 13, 12, 14};//maximum pin using in esp8266-12e nodemcu
之后添加引脚定义:
inputPinList[] 中填入前面开关连接的引脚:6,7,8,9
outputPinList[] 填入 对应 的继电器控制引脚:10,11,12,13
//...其他代码
const uint8_t inputPinList[] = {6, 7, 8, 9};
const uint8_t outputPinList[] = {10, 11, 12, 13};
//...其他代码
到此下位机的配置已经完成,直接下载代码到arduino即可。
接下来配置上位机,也就是esphome节点。首先按照 官网教程 安装esphome环境,并创建一个yaml配置文件。
之后复制github中 esphome config file 文件夹下 customSwitches.h 文件到你的yaml配置文件的相同目录。
接下来开始编辑你刚刚创建好的yaml配置文件,项目文件夹中有一个example.yaml的配置文件样例,与你的配置文件对照着填写即可,这里仅做简单解释。
首先是esphome字段,需要添加include file,如下所示:
esphome:
name: example
platform: ESP8266
board: esp12e
# 把需要包含的头文件放到与yaml配置文件同一目录下,在此填入文件名
includes:
- customSwitches.h
之后添加logging配置:
# Enable logging
# 用到了自定义日志,同样填写即可
logger:
level: DEBUG
esp8266_store_log_strings_in_flash: False
之后添加uart字段,tx填写前面选择的D5口,rx填写前面选择的D6口,根据在创建配置的时候板子不一样,这里能填的口也不一样。意思就是D5和D6实际上是对GPIO口进行的映射,在先前的配置文件中board: esp12e
就是定义了开发板型号,esphome会自动把D5和D6转换成对应的GPIO口编号(也就是前面的14和12)。但我这边的例子中填写的是esp12e,是原生的esp8266芯片,无法识别D5,D6这样的编号,因此我在这里只能填写对应的GPIO编号。这一点按照你们使用的esp开发板不同酌情修改。
# 上面的其他代码...
# uart字段,选择用于通信的引脚,波特率过高,软串口性能不佳可能出现传输错误
uart:
id: uart_bus
tx_pin: 14
rx_pin: 12
baud_rate: 9600
下面就是最重要的配置开关的部分,先贴上样例
# switch字段,实际配置开关
# lambda语句解释:
# auto my_custom = new MyCustomComponent(8,id(uart_bus)); new一个自定义开关的实例,第一个参数是开关的数量,最大支持8个。第二个参数是之前定义的uart实例的id,同样填写即可。
# App.register_component(my_custom); 注册组件,同样填写即可
# return {&my_custom->switches[0]} 这里是返回列表,返回一串开关实例的指针,中间以逗号分隔,下标从零开始,总数与第一行中‘new MyCustomComponent(8,id(uart_bus));’填写的开关数量相同。
switch:
- platform: custom
lambda: |-
auto my_custom = new MyCustomComponent(8,id(uart_bus));
App.register_component(my_custom);
return {&my_custom->switches[0],&my_custom->switches[1],&my_custom->switches[2],&my_custom->switches[3],&my_custom->switches[4],&my_custom->switches[5],&my_custom->switches[6],&my_custom->switches[7]};
# 下面是各个开关的属性,参照官方文档中的属性,注意个数必须和前面‘new MyCustomComponent(8,id(uart_bus));’中传入的开关数量一致
switches:
- name: "My Custom Switches1"
- name: "My Custom Switches2"
- name: "My Custom Switches3"
- name: "My Custom Switches4"
- name: "My Custom Switches5"
- name: "My Custom Switches6"
- name: "My Custom Switches7"
- name: "My Custom Switches8"
我们这里用到的是4个开关,因此
auto my_custom = new MyCustomComponent(8,id(uart_bus));
中的8改为4
return语句同样进行修改,4个开关,因此只能返回四个元素,下标从零开始,如下修改:
return{&my_custom->switches[0],&my_custom->switches[1],&my_custom->switches[2],&my_custom->switches[3]};
下面的switches字段同样修改成四项,这里只定义了开关的名字,官网上对于开关还有其他属性可以填写,可以参照添加:
switches:
- name: "My Custom Switches1"
- name: "My Custom Switches2"
- name: "My Custom Switches3"
- name: "My Custom Switches4"
该部分的完整配置样例:
switch:
- platform: custom
lambda: |-
auto my_custom = new MyCustomComponent(4,id(uart_bus));
App.register_component(my_custom);
return {&my_custom->switches[0],&my_custom->switches[1],&my_custom->switches[2],&my_custom->switches[3]};
switches:
- name: "My Custom Switches1"
- name: "My Custom Switches2"
- name: "My Custom Switches3"
- name: "My Custom Switches4"
至此上位机的配置文件也修改完成,直接按照官网教程刷入esp8266开发板即可。
实际效果
手抖把原先的板子烧了(哭
等待新的arduino板子到货之后更新实拍图。。。
4.3日更新:
简单焊了块板子。。5w的usb电烙铁走锡线不是人干的事
用的是esp01s + arduino pro mini
具体操作效果见视频:百度云链接 提取码:cvwk