【雷达灯控】安信可Rd-03E+智能控制灯+eps32c3+esphome+homeassistant

[复制链接]
查看1086 | 回复14 | 2024-3-20 12:38:37 | 显示全部楼层 |阅读模式

本帖最后由 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模块并不在一个网络,是跨网络打通的,所以看起来不太灵敏。实际屋内没人的时候,反应是相当迅速的。

image.png

2.2m的位置一直有人在,所以不断输出微动,开关门是在5m以上的位置,可以准确输出。

回复

使用道具 举报

shawn | 2024-3-20 16:25:52 | 显示全部楼层
本帖最后由 shawn 于 2024-3-20 17:35 编辑

单独上传下代码,压缩包放了两个esphome方案的代码。方案1的是单独的那个文件,方案2的是那个文件夹。

rd03e.zip

12.92 KB, 下载次数: 8

回复 支持 反对

使用道具 举报

爱笑 | 2024-3-20 13:46:11 | 显示全部楼层
帖子写的非常不错,另附上效果视频,03L双手奉上!
用心做好保姆工作
回复 支持 反对

使用道具 举报

1084504793 | 2024-3-20 13:56:08 | 显示全部楼层
回复

使用道具 举报

1055173307 | 2024-3-20 14:00:15 | 显示全部楼层
回复

使用道具 举报

望风阁 | 2024-3-20 15:54:21 来自手机 | 显示全部楼层
esphome中需要拷贝2410B.c和2410b.h然后修改成rdo3e吗?软件部分不太行,我也刚看到esphome里有2410b的代码申明,修改的rd03e可以吃了分享下吗?还有修改后的rd03e.c和rd03e.h放在什么路径下编译呀?我猜测引用2410的话,编译是从网上下载再编译,
回复 支持 反对

使用道具 举报

shawn | 2024-3-20 16:23:57 | 显示全部楼层
望风阁 发表于 2024-3-20 15:54
esphome中需要拷贝2410B.c和2410b.h然后修改成rdo3e吗?软件部分不太行,我也刚看到esphome里有2410b的代码 ...

群里不知道是否是咱俩交流的,这个说简单也简单说麻烦也麻烦,可以群里交流。
回复 支持 反对

使用道具 举报

爱笑 | 2024-3-20 16:39:27 | 显示全部楼层
shawn 发表于 2024-3-20 16:23
群里不知道是否是咱俩交流的,这个说简单也简单说麻烦也麻烦,可以群里交流。 ...

就是你两交流的
用心做好保姆工作
回复 支持 反对

使用道具 举报

不错!
回复

使用道具 举报

Melo | 2024-3-20 19:11:48 | 显示全部楼层
向大佬学习了!
回复 支持 反对

使用道具 举报

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

本版积分规则