ESP32应用案例 -- 低功耗433遥控器通过MQTT上报键值
Posted 工程师进阶笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP32应用案例 -- 低功耗433遥控器通过MQTT上报键值相关的知识,希望对你有一定的参考价值。
技术标签:433MHz,低功耗,遥控器,ESP32,MQTT,远程控制。
产品功能:按下遥控器按键,通过433MHz频段发送键值到ESP32主控,ESP32主控通过MQTT协议上报键值,并且在其他MQTT终端对键值进行显示。可以通过其他MQTT终端下发指令给ESP32主控,控制主控上的LED进行有规则的亮灭操作。
产品框架图:
要设计一款超低功耗的433遥控器,而且要做到低成本,低功耗,易于生产和使用,遥控器那一端就不能选用一些通过MCU来驱动的433模组或芯片了,找遍全网,发现可以选用一些单发射和单接收的433模块。
433单发射模块通过纽扣电池进行供电,在没有按键按下的时候,几乎是没有电流消耗的,我选用的433发射模块和接收模块是蜂鸟无线提供的灵-T3A和灵-R1,这两款模组直接淘宝搜索就可以找到。
根据灵-T3A发射模块的规格书,该模块可以通过组合按键的方式,最多可接15个物理按键,我目前只使用了9个物理按键的组合方式,模块的外观和设计原理图,如下所示。
遥控器是纯硬件电路设计,通过一颗CR2032的纽扣电池进行供电,不用进行编程即可工作,遥控器的产品PCBA实物,如下图所示。
ESP32主控端,我直接使用了乐鑫官方的开发板ESP32_DevKitC_V4,然后设计了一个比较简单的底板,底板包含了3个物理按键,5个LED可以通过PWM调光,1个有源蜂鸣器,2路ADC输入,以及灵-R1接收模块。
ESP32主控端的参考电路以及灵-R1的接收模块,如下图所示。
灵-R1接收到遥控器发送过来的数据之后,可以通过串口9600bps波特率把按键值发送给ESP32主控,ESP32解析这串数据从而获得遥控器的按键值,然后通过MQTT协议把按键值发布出去,其他MQTT客户端通过订阅按键值主题,就可以获取遥控器的键值了,如下图所示。
关于ESP32主控端的MQTT代码,主要是基于乐鑫官方提供的SDK进行设计的,代码部分包括了MQTT客户端初始化,消息发布/订阅函数,MQTT消息分发函数,灵-R1接收模块的串口接收,等等,完整的代码请查看工程示例。
ESP32的MQTT客户端初始化和启动代码,首先配置一些必要的log打印信息,然后完成WiFi的初始化之后,连接互联网,然后根据MQTT的配置信息去连接MQTT的代理服务器,所有步骤都成功后,就可以正常创建一个MQTT的客户端了,代码如下图所示。
ESP32主控的MQTT客户端在连接代理服务器成功后,会收到一个MQTT_EVENT_CONNECTED事件,然后在这个事件里面订阅主题/topic/led_status,订阅成功后,其他的MQTT客户端就可以向这个主题发布消息,来控制ESP32主控上的LED灯状态,MQTT的事件处理函数,如下图所示。
当ESP32主控需要往MQTT代理服务器发布消息的时候,可以使用乐鑫SDK提供的消息发布函数,直接往指定的主题发布消息,比如按键值主题/topic/key_value,其他MQTT客户端只要订阅了该主题,就可以收到该消息,代码如下图所示。
当ESP32主控成功收到MQTT的订阅消息后,会触发一个MQTT_EVENT_DATA事件,可以在该事件中提取订阅到的主题和数据,再进行处理,订阅消息的处理分发函数,通过轮询消息列表里面的主题和数据,然后通过函数指针的方式调用对应的处理函数,具体实现如下图所示。
ESP32主控与灵-R1的串口接收部分,主要是通过创建一个FreeRTOS的串口数据接收任务,在这个任务里面提取串口缓冲区的数据,再根据灵-R1的规格书协议要求,提取按键值并通过MQTT的消息发布函数,发布到MQTT代理服务器,其他MQTT客户端只要订阅了/topic/key_value这个主题,就可以获取433遥控器的键值数据了,代码实现如下图所示。
完整的代码请查看工程示例,可以添加我的微信(wenjs0620)获取开发资料(包括代码工程和硬件原理图PCB),欢迎讨论该案例的具体应用场景,遥控器和ESP32主控运行的演示视频,如下所示。
https://www.bilibili.com/video/BV1CL4y1a7sx/
以上是关于ESP32应用案例 -- 低功耗433遥控器通过MQTT上报键值的主要内容,如果未能解决你的问题,请参考以下文章