【更新3】无线调试、监控人体存在感应雷达数据(LD2410H)
本帖最后由 moe1983 于 2022-8-6 00:21 编辑最近拿到了LD2410新固件,功能相对完善了不少,但还是有死机的情况。
这次更新完善了工程模式切换、恢复出厂设置、能量数据接入HA,数据比较多,UI暂时没时间折腾了,大家根据自己喜好调整布局一下吧:lol
**** Hidden Message *****
说明:
en_mov_0 表示:移动距离门0的能量,以此类推
en_occ_0表示:静止距离门0的能量,以此类推
能量数据可以设置灵敏度的时候提供参考。
增加“Debug mode”开关,打开表示选择“工程模式”,反之为“正常模式”,只有在工程模式下才有能量数据,否则只有距离数据。
“Set default”按键,恢复出厂设置,其中静止距离门0、1的灵敏度不重置。 这次没弄波特率调整,因为调整了还要重新编译一次。出厂默认256000,降低不知道会不会减少发热,有空测试一下。
------------------------------------雷达旧固件(更新2)-------------------------------------
这几天完善了上次待解决的问题:一是获取雷达参数并赋值,二是监控探测数据(主要是移动、静止目标距离)。
一、配置
1、配置YAML文件,里面有些参数(例如IP、其他感应器等),按自己实际修改,雷达相关的参数id不能修改,name可以自己改(我没用中文,应为感觉ESPHOME对中文支持还是不太好)。
2、把ld2140h.h文件拷贝到YAML文件所在目录下,一般是config/esphome
3、编译YAML。
具体文件如下:7.24更正,原文件YAML里面的ld2410h.h写成了ld2140h.h
**** Hidden Message *****
二、使用
1、参数
这次在上一稿的基础上,展开所有感应距离、移动/静止9个门的灵敏度参数,取消了一次配置所有灵敏度参数按钮(我觉得作用不大,还不如逐个调一次就完了,有需要的可以参照第一稿自己加上去)。其中:
(1)max_distance, max_mov_distance, max_occ_distance 分别表示最大感应、移动、静止距离。不过最大感应距离没有意义,因为没有配置命令,可能以后有用吧。
(2)mov_sn_distance_x (x为0至8)表示“距离门x的移动灵敏度”一个门距离是0.75米;相应的,occ_sn_distance_x 表示距离门x的静止灵敏度。
(3)none_duration 表示“无人持续时间”,单位秒。有效值是0-255秒(我设定是0-120秒)。
(4)操作上,触发参数变动后,会自动打开“config_mode”模式并设置参数,调整完后要手动关闭“config_mode”开关。
(5)update_params 为更新雷达参数,点击后会获取雷达参数并更新HA里面的参数,一般情况下不用点,模块启动时设置了先更新参数的,除非出现雷达接收不到指令或者死机的情况,后面再吐槽。
3、监控
这一稿增加了实时监控雷达探测目标距离和目标状态的功能。
(1)run_RTA打开后,在感应器页面,会实时显示:
target state 是探测目标状态,none(没人),mov(运动),occ(静止),mov & occ(运动静止混合)
detect_distance_sensor 是探测目标距离(米,下同)
mov_distance_sensor 是移动目标距离
occ_distance_sensor 是静止目标距离
(2)update_interval 是刷新间隔,大概500代表1秒间隔,例如设置为1000,则每2秒刷新一次监测数据(太快可能会死机,我用500间隔运行了2个小时,基本没问题,CPU也几乎没有变化)。
4、回头再说说思路
监控思路其实很简单,就是读取雷达发送的串口数据,匹配处理后,传送给sensor。不过,ld2410这个雷达发热有点猛,所以加了两个条件,一是间隔时间,二是如果没人就不进一步处理读取的数据,减轻运算量。只是我没学过C++,写代码全靠蒙、抄,所以肯定还有很大优化空间,请大佬们修正后教学一下。
5、吐槽
LD2410H这个雷达,我感觉是个还没成熟的产品。其实上周就弄好代码了,但发现经常接收不到串口数据,有些参数也调整不了,后来咨询了海凌科的技术,说目前有些bug:
(1)旧版本(1.01,我不知道现在买的是不是新版本,至少我都是旧版本。。。)无法调整工程/工作模式、无法调整波特率、无法恢复出厂设置!
(2)连续密集发送指令给雷达,可能会造成雷达死机!这时只能拔电重启。。。。
我开始还以为是我的问题,调试了好几天。。。。。真是服了!所以,大家调参数的时候,尽量慢一点,不要一顿操作猛如虎,不然雷达怎么死都不知道。:lol
6、后续
目前这稿没有处理能量数据,一是感觉用处不大(可能对调整参数有辅助作用),二是不知道雷达和8266受不受得了。
后续我想可以利用探测数据,做一些自动化,例如根据移动/静止距离控制相应的设备联动(可以不用红外了?;P),或者可以取消高低电平输出,利用目标状态更精准地联动其他设配。大家有好的想法多交流交流。:handshake
=====以下为第一稿的内容=======================================
玩HA两个月多了,加入了ekingfan大佬的人体存在群(垃圾收集群;P),认识了很多大佬,发现了很多有趣的东西。
最近学着大佬们玩MMW+PIR,目前主要用LD1115H和LD2410H,主观感受是1115搭配MINI D1比较方便,直插针脚可以做到体积最小化;2410本身比较小,除了发热有点明显,其余功能比1115丰富一些,但针脚太小了,有几次换到上位机操作差点就直接验血了。所以,本着折腾的宗旨,打算像1115那样通过HA调节参数(自己写固件的大佬不要笑)。趁周末有空研究了一下,并得到kevin、lannister等大佬的指点,参(chao)考(xi)了国外大神的成果,初步调试成功,ESPHOME代码的主要部分如下:
captive_portal:
uart:
id: mod_bus5
tx_pin: GPIO15
rx_pin: GPIO13
baud_rate: 256000
parity: NONE
stop_bits: 1
debug:
direction: BOTH
after:
delimiter:
binary_sensor:
- platform: gpio
id: human_presence_5_motion
pin:
number: GPIO16
mode: INPUT_PULLDOWN
name: "human_presence_5"
device_class: presence
- platform: gpio
id: human_presence_5_PIR
name: "human_presence_5_PIR"
pin: GPIO12
device_class: motion
output:
- platform: gpio
id: "human_presence_5_light"
pin: GPIO2#D4
inverted: true
light:
- platform: binary
output: "human_presence_5_light"
name: "human presence 5 light"
sensor:
- platform: adc
pin: A0
name: "human_presence_5_Illuminance"
id: human_presence_5_illuminance
device_class: illuminance
unit_of_measurement: lx
update_interval: 5s
filters:
- multiply: 3.3
- lambda: |-
return (x / 10000.0) * 2000000.0 ;
switch:
- platform: template
name: "config mode"
id: config_mode
optimistic: true
on_turn_on:
- uart.write:
- delay: 1s
on_turn_off:
- uart.write:
- delay: 1s
- platform: template
name: "set all sensitivity"
id: set_all_sensitivity
optimistic: true
button:
- platform: template
name: "config get"
id: config_get
on_press:
- uart.write:
- delay: 1s
- platform: template
name: "set distance"
id: set_distance
on_press:
- uart.write: !lambda
return {0xFD,0xFC,0xFB,0xFA, 0x14, 0x00, 0x60, 0x00, 0x00, 0x00, (unsigned char)(int)(id(max_mov_dis).state/0.75), 0x00, 0x00, 0x00, 0x01, 0x00, (unsigned char)(int)(id(max_occ_dis).state/0.75), 0x00, 0x00, 0x00, 0x02, 0x00, (unsigned char)id(none_dur).state, 0x00, 0x00, 0x00, 0x04, 0x03, 0x02, 0x01};
- delay: 1s
- platform: template
name: "set sensitivity"
id: set_sensitivity
on_press:
- uart.write: !lambda
if (id(set_all_sensitivity).state) {
return {0xFD,0xFC,0xFB,0xFA, 0x14, 0x00, 0x64, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, (unsigned char)id(mov_sv).state, 0x00, 0x00, 0x00, 0x02, 0x00, (unsigned char)id(occ_sv).state, 0x00, 0x00, 0x00, 0x04, 0x03, 0x02, 0x01};
} else {
return {0xFD,0xFC,0xFB,0xFA, 0x14, 0x00, 0x64, 0x00, 0x00, 0x00, (unsigned char)(int)(id(dis_setup).state/0.75), 0x00, 0x00, 0x00, 0x01, 0x00, (unsigned char)id(mov_sv).state, 0x00, 0x00, 0x00, 0x02, 0x00, (unsigned char)id(occ_sv).state, 0x00, 0x00, 0x00, 0x04, 0x03, 0x02, 0x01};
}
- delay: 1s
- platform: template
name: "!set default!"
id: set_default
on_press:
- uart.write:
- delay: 1s
number:
- platform: template
name: "max_mov_dis" #最大运动距离
id: max_mov_dis
min_value: 0.75
max_value: 6
initial_value: 6
step: 0.75
restore_value: true
optimistic: true
# disabled_by_default: true
unit_of_measurement: m #单位:米
- platform: template
name: "max_occ_dis" #最大静止距离
id: max_occ_dis
min_value: 0.75
max_value: 6
initial_value: 6
step: 0.75
restore_value: true
optimistic: true
# disabled_by_default: true
unit_of_measurement: m #单位:米
- platform: template
name: "none_dur" #无人持续时间
id: none_dur
min_value: 0
max_value: 120
initial_value: 5
step: 1
restore_value: true
optimistic: true
# disabled_by_default: true
unit_of_measurement: s #单位:秒
- platform: template
name: "mov_sv" #运动灵敏度
id: mov_sv
min_value: 0
max_value: 100
initial_value: 40
step: 10
restore_value: true
optimistic: true
# disabled_by_default: true
- platform: template
name: "occ_sv" #静止灵敏度
id: occ_sv
min_value: 0
max_value: 100
initial_value: 40
step: 10
restore_value: true
optimistic: true
# disabled_by_default: true
- platform: template
name: "dis_setup" #灵敏度感应距离
id: dis_setup
min_value: 0
max_value: 6
initial_value: 6
step: 0.75
restore_value: true
optimistic: true
# disabled_by_default: true
unit_of_measurement: m #单位:米
说明:
1、开始设置参数前,需要先把"config mode"打开,否则调整不生效。
2、最大运动/静止感应距离(max_mov_dis/max_occ_dis)、无人持续时间(none_dur),这3个参数为一组,设置后点击按钮"set distance"完成输入。
3、运动/静止灵敏度(mov_sv/occ_sv)、灵敏度感应距离(dis_setup)、设置所有距离灵敏度(set all sensitivity),这几个为一组,设置后点击"set sensitivity"完成输入。
4、打开"set all sensitivity",意思是统一设置所有距离(0-6米)的灵敏度,此时dis_setup没有意义。关闭"set all sensitivity",意思是单独对某个距离(dis_setup)设置灵敏度。(0.75米以内的静止灵敏度不可设置)
5、上述设置完成后记得关掉"config mode",否则不生效。
6、"get_config"是获取雷达参数,自己调试验证用的,没需要可以删了。"!set_default!"是恢复出厂设置(慎用)。
7、时(neng)间(li)有限,代码写得比较啰嗦,不保证没BUG,有空再逐个验证。
8、有待解决:一是雷达参数获取赋值问题,二是实时跟踪感应距离问题。希望大佬们指点一下。
另外,无人感应时间如果很长可能会有问题(理论上限65535秒),我觉得2分钟足够了,所以没想了。
第一次在这里发帖,希望大家支持一下。
来来来。 我过来 顶一下!!!:$ 我用mqtt做的,给指定topic发配置内容,用串口接收反馈 tink 发表于 2022-7-17 00:23
我用mqtt做的,给指定topic发配置内容,用串口接收反馈
分享学习一下 ekingfan 发表于 2022-7-17 00:22
来来来。 我过来 顶一下!!!
谢谢群主支持 写得不错,虽然看不懂有什么用,打了这么多字值得给赞,再接再厉。 写的太好了!正是我需要的。我 支持群友分享,虽然没有用上,但使用下来感觉2410的调教确实比1115省心多了。 学习了!number里的内容都没法用,可能还是我哪里配置有问题 cuiqifan 发表于 2022-7-17 22:56
学习了!number里的内容都没法用,可能还是我哪里配置有问题
去HA里面实体设置,enable一下