本帖最后由 zxlch 于 2020-10-5 23:28 编辑
新的多路控制已经在此帖发布https://bbs.hassbian.com/thread-10655-1-1.html
基于ESP32的12路继电器控制固件(支持实体按钮和MQTT)
〇、前言家里的灯具做的全房集中控制,当初买的工控板,虽然用起来没什么问题,但是不支持 MQTT 协议,并且致命的是 MODBUS 协议还有 BUG(还有一个输入输出的点触功能不能单独设置)。因为在大概七八年前玩 HTC HD2 的时候自己写过一个实体按钮的功能性外挂驱动,所以写 ESP32 的同类功能就有点轻车熟路了。之前什么都不懂,买了一些模块回来测试,发现 ESPHOME 挺强大了,学了一两天实在太累了,于是决定用 Arduino 来自己开发固件,才有了这一篇文章。我自己测试了两天,没发现什么问题,发布出来大家一起分享。
一、功能介绍这个固件包含了12路输入和12路输出,可以设置输入输出绑定,也可以让他们单独工作。如果输入输出绑定,那么还可以设置是否是点触功能(点触的意思可以参考<双稳态开关>和<自复位开关>,这个选项可以理解为选择开关类型)。所有的状态,包括输入、输出、设置等等,都会发送到MQTT服务器中。所有的输出和系统信息,会向串口发送调试信息。固件内部默认写死12路输出输出,且默认开启输入输出绑定、开启点触功能(在代码上可以很容易的修改成最多几路和哪几个PIN对应的功能,如果有对应的大批量硬件可以低价买到并且大家一起玩的,可以联系我修改固件来适配这个硬件)。
二、需要了解一下ESP32可用的有24个 GPIO,其中 GPIO 0 和 GPIO 12有点特殊,这两个PIN在ESP32上电时会对硬件进行设置,大家使用的时候一定注意。
GPIO 0,ESP32 上电时高电平,硬件强行进入刷机模式
GPIO 12,ESP32 上电时高电平,EEPROM 电压切换为1.8V
所以,在上电时让这两个PIN处于默认状态(因为线路设计需要,我把 GPIO 0 设置为输出,GPIO 12被设置成输入,所以注意 GPIO 12 即可)。
所有的 GPIO 口的功能按照下图来配置,绿色的为可用 GPIO,其中左边一排由上到下是输入0~输入11,右边一排由上到下是输出0~输出11。
三、如何刷机使用 esptool 或者 ESPHome-Flasher 进行固件刷写(推荐 ESPHome-Flasher,可以查看串口信息)。
注意:第一次使用固件,推荐抹除一下 EEPROM,以免可能带来不必要的 BUG(即使有也可以反应给我)。
四、初次使用刷写好固件以后,或者没有配置WIFI,会自动进入AP模式(不影响实体功能),用手机连接名为ESPIOControl_zxlch的WIFI后,在浏览器中输入192.168.4.1,会进入如下界面:
其中Bind Mode就是输入输出绑定,Touch Mode就是点触功能,以1和0表示是否开启,例如110111111110就是第2路(以0路开始计数)和第11路不启用。如果不填写或填写长度不够或者填写不规范,例如“0000as"则表示除了第0路到第3路不开启,其他第4~11路开启。
注意:如果输入了一个错误的设置,又保存了,可以先让第0路输入(GPIO 36)处于高电平状态后在上电或复位,系统会自动进入AP状态(AP状态输入输出自动取消关联,MQTT无线)。在使用中请注意第0路输入在系统启动时的电平状态。
五、如何使用本固件在配置好以后,除了MQTT和WIFI以外,所有的信息都可以在外部获取和设置。
输入信息和系统信息,会在串口输出(中文)。
输入信息、输出信息、设置信息,会在MQTT输出(数字或英文)。
注意:输出只是电平信号(大约0.7V)需要使用三极管等功放来连接继电器。
。。。。。。
六、消息规则为什么消息规则单独拿出来写,因为我觉得消息太详细了,不单独写真的不好表述清楚。
MQTT的主题可以在串口获取,或者直接在MQTT中获取。系统启动后会向主题为zxlch/ESPIOControl的位置发送当前硬件的消息主题,例如我的是zxlch/ESPIOControl/000067ABF411。
那么我们需要设置如下主题: - zxlch/ESPIOControl/000067ABF411 我称它为根主题(RT)
- zxlch/ESPIOControl/000067ABF411/Command 我称它为控制主题(CT)
- zxlch/ESPIOControl/000067ABF411/Output00~zxlch/ESPIOControl/000067ABF411/Output11 我称它为输出子主题(OT)
- zxlch/ESPIOControl/000067ABF411/Input00~zxlch/ESPIOControl/000067ABF411/Input11 我称它为输入子主题(IT)
[size=1em]每个主题会接受到的消息如下
RT接收输入或输出的所有状态信息,CT可以发送控制码(接收成功会在对应主题返回状态),OT接收所有对应输出电平状态(L或者H),IT接收所有对应输入电平状态(O或者I)。
七、控制码规则[size=1em]我把消息规则用”发送的控制码##功能描述##接收的信息##接收的信息位置 && 接收的信息##接收的信息位置 “来说明,&&表示有两个位置的输出,所有的小写x表示对应的控制路数(为了方便理解,按钮表示输入,继电器表示输出),所有的xxxxx…表示由左向右表示第0~11路(填写不完整或者不规范表示不更改)。 - Hx##开继电器##L或H##OT
- Lx##关继电器##L或H##OT
- Sx##切换继电器##L或H##OT
- Rx##读继电器状态##L或H##OT
- Ix##读按钮状态##O或I##IT
- Axxxxx…##写所有继电器状态##LLLLL…或HHHHH… ##RT && 子位置返回L|H##OT
(x支持H、L、S、X。H表示开、L表示关、S表示切换、X或者其他表示不变) - A##读所有继电器状态##LLLLL…或HHHHH…##RT && L或H##OT
- X##读所有继电器状态##LLLLL…或HHHHH…##RT
- Y##读所有按钮状态##OOOOO…或IIIII…##RT
- Z##读继电器状态+按钮状态##xxxxx…+yyyyy…##RT
- Bxxxxx…##写绑定状态##Bxxxxx…##RT
(x支持1、0、S、X。1表示开、0表示关、S表示切换、X或者其他表示不变) - B##读绑定状态##Bxxxxx…##RT
- Txxxxx…写点触状态##Txxxxx…##RT
(x支持1、0、S、X。1表示开、0表示关、S表示切换、X或者其他表示不变) - T##读点触状态##Txxxxx…##RT
- restart##系统软重启(不影响输入输出状态)##没有返回值
八、下载
ESPIOControl.ino.esp32(Ver20200419).zip
(400.96 KB, 下载次数: 41)
九、免责声明本固件仅做学习使用,禁止用于商业用途,对使用本固件造成的任何责任与作者无关,使用本固件表示同意声明。 (ESP8266由于API没有ESP32强,得花点时间移植过去)
|