基于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。


(图1)

三、如何刷机

使用 esptool 或者 ESPHome-Flasher 进行固件刷写(推荐 ESPHome-Flasher,可以查看串口信息)。
注意:第一次使用固件,推荐抹除一下 EEPROM,以免可能带来不必要的 BUG(即使有也可以反应给我)。

四、初次使用

刷写好固件以后,或者没有配置WIFI,会自动进入AP模式(不影响实体功能),用手机连接名为ESPIOControl_zxlch的WIFI后,在浏览器中输入192.168.4.1,会进入如下界面:


(图2)
其中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)

每个主题会接受到的消息如下
RT接收输入或输出的所有状态信息,CT可以发送控制码(接收成功会在对应主题返回状态),OT接收所有对应输出电平状态(L或者H),IT接收所有对应输入电平状态(O或者I)。

七、控制码规则

我把消息规则用”发送的控制码##功能描述##接收的信息##接收的信息位置 && 接收的信息##接收的信息位置 “来说明,&&表示有两个位置的输出,所有的小写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##重启单片机不影响GPIO电平状态

八、下载

链接: https://pan.baidu.com/s/1KFX6g0Fy4IJtTrbW5BM9Ww 提取码: 3ph8

九、免责声明

本固件仅做学习使用,禁止用于商业用途,对使用本固件造成的任何责任与作者无关,使用本固件表示同意声明。

十、硬件部分

我做了一个板子,自己测试了一个星期的7X24是没问题的,现在把图纸发上来,大家共享一下。

使用ESP32输入控制输出的一种控制系统(12路).zip (386.3 KB)

5V供电是给单片机的。 12V供电是给输出的,可以选择给输入(拨码开关和IPJ切换)。

CN2是TTL接口。

IPJ是输入端口选择12V正极或负级做公共端。

SW1是在IPJ选择了公共端后,第1~12路选择是否接入12V作为公共端,如果接入,那么CN-M可以把IN-G的IN中对应的端子和12G或+12相连来控制输出。或者让拨码开关置于OFF状态后,把IN和IN-G对应的位置中给一个36V以下的供电也可以控制输出(不分极性,不分交直流)。

CN-M中的IN列功能如上,OUT列是在IN导通后对应位置输出12V 150MA的供电。

BOOT是ESP32的刷机按钮。

REST是ESP32的重启按钮。

Schematic_使用ESP32输入控制输出的一种控制系统。_2020-05-06_12-39-44

太 硬核了,学习学习,谢谢分享

API 不应该是 ESP8266 全一点么?我意思是说库。

反而不是,官方文档查询到的最新库文件,在8266上找不到。包括webserver的处理方式和多线程处理方式等等,不过我试了下8266,最多只能做4路输入输出的,不如直接用esp32比较好一些。

但是听说 ESP32 的库还有好多坑,WiFi链接方面的。

ESP32 性能上肯定比 ESP8266强,IO也多了不少,也支持硬件 PWM,但基础库的BUG好像还有点多,不知道修的怎么样了。

前天开了一天死机了一次,这两天开机又没出现问题。。。然后我把代码检查了一遍确实没问题。。不知道咋回事。
另外主帖描述好多错误,估计认真看的人看的云里雾里,待会儿重新修订一次

32问题还是挺多的…

没问题了,等会儿更新一下固件,测试了2724很稳定

太 硬核了,学习学习,谢谢分享