『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 15232|回复: 20

[新奇玩法] 基于ESP32的12路继电器控制固件(支持实体按钮和MQTT)

[复制链接]

20

主题

250

帖子

1437

积分

论坛DIY达人

积分
1437
金钱
1182
HASS币
40
发表于 2020-4-12 05:30:31 | 显示全部楼层 |阅读模式
本帖最后由 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。
1.jpeg

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

四、初次使用
刷写好固件以后,或者没有配置WIFI,会自动进入AP模式(不影响实体功能),用手机连接名为ESPIOControl_zxlch的WIFI后,在浏览器中输入192.168.4.1,会进入如下界面:
2.png
其中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强,得花点时间移植过去)


评分

参与人数 1金钱 +20 收起 理由
antsunzj + 20 起来就看到此贴,大佬通宵杰作,好想为你加.

查看全部评分

回复

使用道具 举报

20

主题

250

帖子

1437

积分

论坛DIY达人

积分
1437
金钱
1182
HASS币
40
 楼主| 发表于 2020-4-12 05:52:49 来自手机 | 显示全部楼层
可以这样理解,输入在ha中是一个二进制传感器,输出是一个switch。他们两个可以在硬件中进行关联,也可以在ha同做成自动化关联。
回复

使用道具 举报

5

主题

199

帖子

1258

积分

论坛积极会员

积分
1258
金钱
1059
HASS币
0
发表于 2020-4-12 09:04:06 来自手机 | 显示全部楼层
好东西 马上测试
回复

使用道具 举报

20

主题

250

帖子

1437

积分

论坛DIY达人

积分
1437
金钱
1182
HASS币
40
 楼主| 发表于 2020-4-12 14:18:16 | 显示全部楼层
2020年04月12日

更新一下,更新内容如下:
1、在根主题中会发送固件版本号(即发布日期)。
2、在A命令中添加S功能,即使发送AXHLSXXX,就是二路输出打开、第三路输出关闭、第四路输出切换
3、添加B命令和T命令。B命令是绑定功能发送B01SXXXXXXXXX,就是第一路取消输入输出绑定、第二路开启输入输出绑定、第三路切换输入输入输出绑定,并且直接写入到硬盘中(掉点保存)。T命令是点触功能,送T01SXXXXXXXXX,描述同上。


ESPIOControlv20200412(ESP32).zip (401.17 KB, 下载次数: 18)




回复

使用道具 举报

22

主题

414

帖子

2255

积分

金牌会员

Rank: 6Rank: 6

积分
2255
金钱
1841
HASS币
30
发表于 2020-4-12 14:51:35 来自手机 | 显示全部楼层
群友报道,试试大佬的固件,感谢分享!
回复

使用道具 举报

19

主题

130

帖子

720

积分

高级会员

Rank: 4

积分
720
金钱
590
HASS币
0
发表于 2020-4-12 15:57:47 | 显示全部楼层
大佬 有没有16路的
回复

使用道具 举报

20

主题

250

帖子

1437

积分

论坛DIY达人

积分
1437
金钱
1182
HASS币
40
 楼主| 发表于 2020-4-12 19:34:10 | 显示全部楼层
秋流年 发表于 2020-4-12 15:57
大佬 有没有16路的

ESP32没那么多脚啊。8266更少
回复

使用道具 举报

19

主题

130

帖子

720

积分

高级会员

Rank: 4

积分
720
金钱
590
HASS币
0
发表于 2020-4-12 20:33:35 | 显示全部楼层
zxlch 发表于 2020-4-12 19:34
ESP32没那么多脚啊。8266更少

大佬 我这个就是ESP32 的16路继电器 一直没找到固件
微信图片_20200412203021.jpg
微信图片_20200412203029.jpg
回复

使用道具 举报

20

主题

250

帖子

1437

积分

论坛DIY达人

积分
1437
金钱
1182
HASS币
40
 楼主| 发表于 2020-4-12 23:33:02 | 显示全部楼层
秋流年 发表于 2020-4-12 20:33
大佬 我这个就是ESP32 的16路继电器 一直没找到固件

你把引脚给我,我给你编译一个对应的。这个是不带输入的,我的代码通用的,去掉输入功能就可以增加输出了
回复

使用道具 举报

20

主题

250

帖子

1437

积分

论坛DIY达人

积分
1437
金钱
1182
HASS币
40
 楼主| 发表于 2020-4-12 23:34:21 | 显示全部楼层
把GPIO对应的是哪一路继电器,对应的引脚编号给我就行了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-28 18:47 , Processed in 0.067944 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表