本帖最后由 shawn 于 2024-3-20 18:29 编辑
0、缘起
对于热衷于智能家居的朋友来说,雷达模组是一个不可或缺的组件,与传统的红外模组相比,24G雷达模组以其低成本和高效能而受到青睐。虽然我也买了不少模块,但由于实在懒~
最近,在论坛上得到了一个获得雷达模组的机会,这个rd03e模组不仅能检测人的存在,还支持微动、运动和手势等多种状态,功能远超我最初的预期,它的检测距离甚至可达7.14米(虽然宣传中写的是6米)。更重要的是,在富有智慧、知识渊博、经验丰富、洞察力和创造力超群、优雅和魅力并存的园长敦促下,不容易烂尾😄
在这里,我将分享一个适合初学者的指南,展示如何从零开始将rd03e雷达模组集成到智能家居(HA)系统中,并用它来实现对普通灯具的智能控制。 😊
1、使用场景
这次想实现智能化的地方是办公室,无遮挡,但采光不好,白天需要开灯。
想实现屋内有人自动开灯,如果没人一段时间后自动关灯的功能,并避免忘关灯的情况,节约用电。由于感应距离远,且需要感应屋内是否有人,雷达模块是最合适不过的了。
开发版选择了10元包邮的esp32c3,用esphome接入过不少设备,而且也用vscode+platformio点过灯了,算是有点基础。
灯是普通的机械控制,不想动强电,所以30元买了红外的懒人开关,坏处是没有反馈不知道灯的状态,好处是省钱,和空调一并使用小米的红外遥控器接入ha。
2、制定方案
首先阅读Rd-03E快速入门使用文档,了解到硬件有两个固件,一个测距2米带手势的,一个测距6米的精准测距,默认是手势固件,根据场景需要使用精准测距固件,所以还需要重新刷固件。
然后阅读Rd-03E 精准测距固件用户手册,了解雷达的安装要求,要点是雷达的探测范围及天线安装方向,以确定合适的安装位置。顺便简单的了解下通信协议,看看能否在自己能力范围之内,其实我也是第一次做,完全没谱。
等待快递期间,先在论坛上找了rd03相关模块的示例,发现有很多大佬写过类库了,特别是用wb2实现的ha接入,RD03D接入HA实例分享,里面解决了和ha通信的问题,感觉完全没有难度了。然后收到模块后故意等了两天,看大佬们分享的模块使用经验和代码,少走很多弯路。
那么方案基本确定下来,采用Rd-03e+esp32c3的组合,通过自己写代码的方式接入ha,通过ha平台实现智能控制。
3、动手DIY
3.1 刷固件
刷固件就不多说了,入门手册和论坛上都有介绍,我也是小白,这里说几点自己遇到的问题吧。
首先就是技术不行硬件来补,jlink、st-link、daplink一样一个,也不用贵的,就9.9包邮的,多多尝试总有一个成功。
根据手册安装完keil,之前玩海思买过jlink,我买的jlink比较便宜比较老,固件是2009的版本(估计现在淘宝买也是这个版本),jlink总是弹窗,折腾了一天换了无数版本都不行,总之固件没有刷成功,网上的解决版本是使用另外一个jlink给jlink升级固件……谁知道这个jlink咋这么辣鸡来。
翻江倒柜,发现还有一个st-link,貌似也有clk dio接口,然后keil中也有stlink,一顿操作顺利升级。只是升级后雷达没有数据返回了,比着手册又看了一遍,原来是没有选择擦除全部芯片,选上后重刷,雷达完美恢复。
既然stlink这么好用,又顺道研究了下stlink,发现还有个工具叫STM32 ST-LINK Utility,直接是刷固件神器,顺手把jlink刷到了205x的版本,再用keil打开jlink发现老实的很,啥毛病都没有了,有需要这个固件的可以单独找我,太完美了。到这1.5天过去了…
3.2 ESP32C3对接Rd03E模块,输出Uart数据
搭好vscode环境,接入esp32c3,点个灯试试,没问题。那么论坛上收集的xx大佬、yy大佬的代码,抄一抄,先输出下uart的数据:
#include <Arduino.h>
// put function declarations here:
void onReceiveSerial(void);
volatile bool is_rec=false;
uint8_t rec_buf[7];
void setup() {
Serial.begin(256000);
//Serial1.begin(256000, SERIAL_8N1,20,21);
Serial1.begin(256000, SERIAL_8N1,1,0);
Serial1.onReceive(onReceiveSerial);
}
void loop() {
// put your main code here, to run repeatedly:
if(is_rec){
for (int i = 0; i < 7; ++i) {
Serial.printf("%02X ", rec_buf);
}
Serial.println();
is_rec=false;
}
}
void onReceiveSerial(void){
noInterrupts();
size_t uartAvailable=Serial1.available();
if(uartAvailable==7 && !is_rec){
Serial1.readBytes(rec_buf,7);
is_rec=true;
}
interrupts();
}
如果上面的代码没有输出,大家也不用奇怪,可能有两个原因,一个是需要把“&& !is_rec”去掉就正常了,至于为什么鬼知道,除了鬼哪位大佬可以解个惑?跪求~另外一个原因,就是买的esp32c3板子不带串口芯片,Serial压根没输出,网上又是一顿搜,最后可用的platformio.ini配置如下:
[env:esp32-c3-devkitc-02]
platform = espressif32
board = airm2m_core_esp32c3
framework = arduino
board_build.flash_mode = dio
upload_speed = 256000
monitor_speed = 256000
build_flags = -DARDUINO_USB_CDC_ON_BOOT
最重要的就是最后一句,添加了就可以打开usb的serial调试。网上有篇文章里面这句是分成两行写的,然后我也写成两行,没报错也没输出……搞个硬件咋就这么难呢,坑一个接一个。除了这些,还遇到了win11驱动串口的问题,typec数据线有问题刷固件总是刷一半的问题,陆陆续续折腾了3天过去了~
3.3 对接HA-废弃篇
这里本来打算直接抄wb2接入rd03d的代码,可事实证明我还是太年轻了。里面有对接ha的代码是没错,但是引用的类库一个都没见过啊,只能是啃代码自己实现。可刚打开ha那个json结构体就懵了,交给AI解释下,AI倒是看懂了,可没给我解释清楚……难,还是难
在万般无奈之下,我又想到了gayhub,说不定哪路大神又给我铺好了路子呢,一顿乱搜,还真让我找到了。有大佬写了esphome-rd01,瞬间为我指明了方向,只需要改改uart的协议解析部分,其他都是现成的,perfect!
uart:
id: uart_rd03e
tx_pin: 0
rx_pin: 1
baud_rate: 256000
parity: NONE
stop_bits: 1
custom_component:
- lambda: |-
return {new RD03E(id(uart_rd03e))};
components:
- id: rd03e
binary_sensor:
- platform: custom
lambda: |-
auto uart_component = static_cast<RD03E *>(rd03e);
return {uart_component->hasTarget,uart_component->hasMovingTarget,uart_component->hasStillTarget,uart_component->lastCommandSuccess};
binary_sensors:
- name: "Has Target"
- name: "Has Moving Target"
- name: "Has Still Target"
- name: "Last Command Success"
sensor:
- platform: custom
lambda: |-
auto uart_component = static_cast<RD03E *>(rd03e);
return {uart_component->detectDistance};
sensors:
- name: "Detect Distance"
unit_of_measurement: "cm"
accuracy_decimals: 1
至此实现和ha的打通,目标马上就要实现了。
但此时在esphome中看到了
Warning
Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a future release. Please look at creating a real ESPHome component and “importing” it into your configuration with External Components.
这么好的引用方式说废弃就要废弃了么,作为完美主义着,必定不能使用这种要废弃的方式啊~
3.4 对接HA-终结篇
想来esphome解决了底层的很多问题,比如和ha的对接,和uart口的交互,自己只需要关心核心代码的实现就好了,这个思路是对的。然后就开始扒拉esphome中雷达模块的代码,发现2410的代码很像之前抄的rd01代码啊,目标锁定,一顿折腾2天的周末又过去了。
努力总是有回报的,因为手册里面固件版本格式有点问题,加上后面的参数设置比较复杂,所以没有完成相应设置代码的修改,只完成了数据接收,现阶段是可以交差了。
uart:
id: rd03e_uart
tx_pin: 0
rx_pin: 1
baud_rate: 256000
parity: NONE
stop_bits: 1
external_components:
source: components
rd03e:
binary_sensor:
- platform: rd03e
has_target:
name: Presence
has_moving_target:
name: Moving Target
has_still_target:
name: Still Target
#out_pin_presence_status:
# name: out pin presence status
sensor:
- platform: rd03e
detection_distance:
name: Detection Distance
完美对接。
4、HA配置
至此已经解决大部分问题,在ha平台上看到设备了。
然后不断摆放rd03e的位置,来找到最合适的位置和方向。至于自动控制的逻辑,放两张图来说明吧。
自动开灯:
自动关灯:
这里没什么难度,分别是早上和晚上的指定时间段对灯进行开关。唯一麻烦的地方就是灯状态的识别,这里我使用了一个辅助选择器进行灯状态的标识,默认close状态。坏处就是如果不通过ha控制,是无效的。但我们已经实现了自动控制,完全不用人工了,所以这个缺点倒是也可以接受。
码这些字的时候,刚好一周过去了,玩硬件虽然有难度,但也没有那么难,总有巨人的肩膀让你踩得的,不是么?学到了很多东西,雷达各种参数的意义、天线方向及安装位置对探测的影响、esphome中各种参数的使用、ha中自动化的各种控制,现在想想正是由于这些开源平台和硬件厂家的逐步完善,我们才能方便的接入这些先进又好玩的模块,实现更多想要的智能家居功能。
5、演示视频
https://www.bilibili.com/video/BV1AA4m1N7Ky?t=6.6
由于屋内还有其他人,存在很多微动干扰(下图),同时我的ha和rd03e模块并不在一个网络,是跨网络打通的,所以看起来不太灵敏。实际屋内没人的时候,反应是相当迅速的。
2.2m的位置一直有人在,所以不断输出微动,开关门是在5m以上的位置,可以准确输出。