你是不是也遇到过这种情况:大晚上窝在沙发里刷手机,头顶的智能灯“啪”地灭了——不是因为睡着太久,是因为红外人体传感器觉得这屋没人了。后来我把全屋的检测方案换成24G毫米波雷达,才算把这毛病根治。这篇就聊聊,为什么智能家居的“人体存在检测”必须靠毫米波雷达,以及我在实际接入开源HA系统、基于STM32做嵌入式方案时踩过的坑和调参经验。
我最早接触智能家居人体检测,用的也是几十块钱的红外PIR传感器,装上那会儿觉得挺灵敏,人一走近灯就亮。但用久了发现一个致命问题:它只对“移动的人”敏感。我坐在书桌前写东西,手不动、身体幅度小,三五分钟后灯就灭了;在卧室躺着刷手机,明明是活生生的人,系统判断为“无人”。后来换了一批更贵的红外传感器,加了灵敏度延时,情况好一点,但本质上还是治标不治本。真正解决这个问题的,是24G毫米波雷达。
这篇内容涉及怎么理解24G雷达的检测原理、怎么把它接到智能家居里(包括HA系统、STM32方案)、以及实际部署时那些容易踩坑的参数调整,适合正在折腾全屋智能、或者在做嵌入式项目的朋友参考。
1. 为什么24G毫米波雷达成了智能家居“人体存在检测”的新宠
1.1 红外传感器最大的硬伤:静止就等于“没人”
先说说我为什么抛弃了红外PIR。PIR的工作原理是热释电效应,传感器里有两片热释电元件,当人体辐射的红外线经过菲涅尔透镜,在元件上形成变化的热场时,才会输出触发信号。换句话说,它检测的是“红外辐射的变化”,不是“有没有人”。
人体一旦静止,红外辐射场就不变了,传感器自然认为环境恢复了平静。你可以把它理解成一个只对“动”敏感的门卫,只要你不动,他就当你走了。这在家里的很多场景下非常离谱:上厕所超过五分钟灯灭了,坐沙发上看电视手一抬灯灭了,在床上睡觉翻身不及时灯也灭了。
有人会加长延时来缓解,比如设置人体离开后5分钟再关灯。但这样又带来新问题:真的人离开了,灯还要白白亮五分钟;人一直不动,灯还是会灭。所以PIR本质上只适合做短时效的“有人移动检测”,没法满足智能家居“人在灯亮、人走灯灭”的核心需求。
1.2 24G毫米波雷达怎么破解“人坐着灯灭了”
24G毫米波雷达解决的是“人体存在检测”问题。它发射24GHz频段的电磁波,波长大致在12.5mm,这个波长足以感知人体非常细微的动作——包括呼吸时胸腔的起伏。
我最初也怀疑过,人坐在那儿刷手机,身体明明没怎么动,雷达怎么知道有人在?后来看串口波形才明白,雷达检测的是多普勒频移和微多普勒特征。人即使整体不动,呼吸和心跳也会让胸腔产生毫米级的周期性位移,这个位移会让反射波的相位发生变化,雷达处理器把这段微弱的相位变化提取出来,就能判断“这里有一个生命体”。
所以24G毫米波雷达输出的是三态结果:有人运动、有人微动、有人静止,并且能输出目标的距离和能量。这才叫真正意义上的人体存在检测。
1.3 实际场景盘点:哪些智能联动离不开“存在检测”
我把自己家里改完雷达之后的联动逻辑整理了一下,这几个场景是PIR无论如何做不到的:
- 书房联动:我在电脑前写东西,手可能长时间不动,但灯和显示器背后的氛围灯一直保持开启状态;离开5分钟后自动关灯、关排插。
- 卫生间联动:人在里面坐着玩手机,灯不会灭;排气扇也不因为“没人”而自动停。
- 卧室睡眠监测:半夜人睡着,呼吸带来的微动依然能被识别,系统不会把房间判定为无人而触发安防报警。
- 全屋无人自动关电:只有所有房间都判定为无人,系统才执行全屋断电逻辑,这个在PIR时代完全没法做。
说白了,人体存在检测是智能家居从“自动化”走向“场景感知”的关键一环。没有它,所谓智能就只是“传感器触发开关”而已。
2. 原理不等于玄学:24G毫米波雷达是如何“看见”静止人体的
2.1 多普勒效应与呼吸微动:毫米波雷达的核心逻辑
先从多普勒效应聊起,这个大家都熟悉:救护车朝你开过来,声音变尖;驶过去,声音变低沉。声波如此,电磁波也一样。雷达发射电磁波,遇到运动目标反射回来,回波频率和发射频率之间会有一个差值,叫多普勒频移。
频移的大小和目标的径向速度成正比,公式是 f_d = 2v/λ。λ是波长,24G雷达约12.5mm。目标速度只要稍微有一点变化,频移就会被检测到。问题是,人在静止状态下,整个身体的径向速度几乎是零,那怎么检测?
关键就藏在“呼吸”里。成年人呼吸时胸腔起伏的位移大概在0.5到2mm,这个位移虽然小,但已经达到波长量级了,会带来不可忽略的相位变化。我做过一个简单估算:2mm位移在24G雷达下对应的相位变化大概是4πd/λ,算出来约2弧度,这个量级完全能被雷达的数字信号处理部分识别出来。所以雷达检测到的是“呼吸带来的周期性微动”,而不是笼统的“身体动了”。
2.2 FMCW调频连续波:测距测速的底层机制
光靠多普勒只能判断有没有微动,要判断“人在哪个位置、距离多远”,还需要测距能力。24G雷达普遍用FMCW,也就是调频连续波。
它的发射方式可以理解成:把电磁波的频率随时间线性拉高,形成一个个锯齿波。信号碰到目标反射回来后,因为传播需要时间,同一时刻的发射频率和接收频率会有一个差值,叫差频。差频和距离是线性关系,公式是 f_b = 2BR/(cT),其中B是调频带宽,T是调频周期,c是光速。测出差频,就能算出目标距离。
所以24G雷达输出的不只是“有人/没人”,还有“目标离我多远”。我在HA里能看到“人体距离”这个实体,人从客厅门口走到沙发,距离从3.2米慢慢变成1.1米,这个数据在自动化里可以做不少文章,比如走近台灯时自动调亮,离远时调暗。
2.3 微动识别算法:怎么区分“真人”和“干扰源”
调完雷达之后最头疼的问题是误报,尤其是把窗帘、风扇、宠物当成“人”。这就要靠雷达内部的微动识别算法来兜底。
不同厂家的算法流程不同,但思路基本一致:先做FFT把目标从距离维度上拆开,得到不同距离门上的能量分布;然后再看每个距离门上的能量随时间的变化是否稳定。人体的呼吸微动是有规律的周期性信号,频率大概在0.2到0.5Hz;而窗帘被风吹、风扇转动、树叶晃动这种干扰,它们的频率特征和稳定性都不一样,算法可以把它们分类剔除。
我实际体验下来,当前主流的24G模块基本都能做到“人在静止状态下持续判定存在”,同时对窗帘、宠物误报的控制也在可接受范围。不过有个前提,安装位置不能正对干扰源太近,否则再好的算法也没辙,这点后面专开一节细说。
2.4 24G、60G、77G怎么选:参数对比与选型建议
聊到选型,很多朋友会问:为什么不用60G或者77G?这里我直接列个对比表,方便大家判断:
| 频段 | 波长 | 距离分辨率 | 穿透性 | 典型成本 | 主要应用 |
|---|---|---|---|---|---|
| 24G | 约12.5mm | 一般(米级) | 较好,可穿薄墙 | 低,几十到百来块 | 智能家居存在检测、工业安防 |
| 60G | 约5mm | 高(厘米级) | 一般,对非金属穿透略差 | 中等 | 手势识别、屏保唤醒、车内感知 |
| 77G | 约3.9mm | 高 | 一般 | 高 | 车载雷达、自动驾驶 |
智能家居场景里,我强烈建议优先考虑24G,理由有三点:一是技术方案成熟,市面上多数人体存在传感器用的都是它,踩坑资料多;二是成本便宜,几十块钱的模块就能实现完整的人体存在检测;三是24G波长长,穿墙能力相对好,适合装在室内跨越门窗做区域检测。
60G虽然距离分辨率更高,能做细微手势,但价格和功耗都上去了,普通智能家居场景属于“杀鸡用牛刀”。77G主要面向车载场景,功耗和成本也不适合家庭。
3. 手把手实操:把24G毫米波雷达接入智能家居系统
3.1 选型与硬件准备:雷达模块、主控和电源怎么搭
我自己用过的模块里,比较有代表性的就是海凌科的HLK-LD2410系列,出厂默认工作在串口模式,同时还有一个GPIO输出引脚,另外它的固件支持通过串口改参数。市面上还有其他品牌24G模块,原理类似,但协议各有差异,使用前一定先看对应数据手册。
硬件准备方面,最基础的一套是这样的:
- 24G雷达模块一块(我用的LD2410B,支持5V供电)
- 一个支持串口或者PWM输出的主控,比如ESP32开发板,或者STM32F103C8T6
- 一个继电器模块(如果直接控制220V灯具)
- 外壳和杜邦线若干
- 如果是ESPHome方案,还需要一台运行HA的设备
接线前一定要确认雷达模块的供电电压。LD2410B是5V供电,串口电平是3.3V,可以直接接ESP32和大部分STM32,但如果你的板子是5V电平,最好串一个电阻分压或者用电平转换模块,避免烧串口。
3.2 GPIO模式:最简单的人来灯亮改造
如果你只想快速体验一下,不关心距离和人体状态数据,那用GPIO模式就够了。
把雷达的OUT引脚接到单片机任意GPIO(或者直接接继电器模块的IN),供电接5V,共地。人在检测范围内活动时,OUT输出高电平;判定无人延时结束后,OUT输出低电平。
我当时测试时,用LD2410的OUT引脚接了一个光耦继电器,继电器控制宿舍的台灯,实现了“人坐定亮灯、人走灯灭”。但这里要提醒一下,GPIO模式输出的是“是否存在目标”的判断结果,不带距离和运动状态信息,同时参数也只能靠出厂默认,不太灵活。如果是要做全屋智能,还是得走串口模式。
3.3 UART数据模式:读取距离和人体状态
串口模式才是24G雷达的完全体。我把雷达TX/RX接到ESP32的串口引脚,用115200波特率、8位数据、无校验、1位停止位去读,就能持续收到数据帧。
不同厂家的帧格式不一样,但基本思路是一样的:帧头 + 长度 + 数据段 + 校验。以我记得的LD2410标准帧为例,帧头是0xAA 0xAA,之后跟着长度字段,数据段里包含目标状态(无人、有人运动、有人微动/静止)、运动目标距离、运动能量、静止目标距离、静止能量等字段,最后是校验和。
解析的关键是写状态机,别一上来就按固定长度收。我建议用一个字节一个字节地处理,先找帧头,再根据长度字段收完整个帧,最后校验,这样在串口数据有粘包、断包的时候都能正确对齐。收到数据后,我一般会把“目标状态”和“静止距离”单独拎出来,用来驱动自动化逻辑。
3.4 接入开源HA系统:用ESPHome 20分钟完成配置
如果你跟我一样用开源HA系统做全屋智能,那接入24G雷达最省事的方式就是ESPHome。ESPHome在较新版本里已经内置了LD2410组件,不用自己写解析代码。
我当时的配置大概是这样的:
uart: rx_pin: GPIO16 tx_pin: GPIO17 baud_rate: 115200 binary_sensor: - platform: ld2410 has_target: name: "客厅人体存在" sensor: - platform: ld2410 moving_distance: name: "客厅移动距离" stationary_distance: name: "客厅静止距离" moving_energy: name: "客厅移动能量" stationary_energy: name: "客厅静止能量"刷进去之后,HA里会自动出现一个人体存在实体,以及距离、能量等传感器。然后我就在自动化里配了一条很典型的规则:当“客厅人体存在”状态从关闭变开启,且光照传感器数值低于阈值,就打开客厅主灯;当“客厅人体存在”状态变为关闭,延迟5分钟后关灯。
这样配置完之后,人坐在沙发上不动弹,灯也不会灭,真的就是“感知到人存在”了。需要注意的是,ESPHome的LD2410组件不是所有版本都有,建议把ESPHome升级到2023年5月之后的版本再试。
3.5 基于STM32的智能家居集成方案
除了接HA玩生态,很多朋友做项目会选STM32做主控,这也非常常见,尤其是在做嵌入式课程设计或者产品原型的时候。我实测过STM32F103C8T6接LD2410,接线很简单,雷达TX接PA10、RX接PA9,供电接5V,串口配置成115200-N-1。
主控这边要写串口解析。推荐用逐字节状态机方式,我给出一个简化版示例逻辑:
#define FRAME_HEADER 0xAA #define FRAME_LEN_OFFSET 2 uint8_t rx_buf[64]; uint8_t rx_len = 0; uint16_t frame_len = 0; uint8_t frame_started = 0; void uart_rx_byte(uint8_t byte) { if (!frame_started) { if (byte == FRAME_HEADER) { rx_buf[0] = byte; rx_len = 1; frame_started = 1; } return; } if (rx_len == 1) { rx_buf[1] = byte; rx_len = 2; if (byte != FRAME_HEADER) { frame_started = 0; } return; } if (rx_len == 2) { frame_len = byte; } else if (rx_len == 3) { frame_len |= (byte << 8); } rx_buf[rx_len] = byte; rx_len++; if (frame_len > 0 && rx_len >= frame_len + 4) { parse_radar_frame(rx_buf, rx_len); frame_started = 0; frame_len = 0; rx_len = 0; } }收到完整帧后,把目标状态字段和静止距离字段提取出来。状态为“有人”时,置高一个GPIO去控制继电器开灯;状态为“无人”时,启动一个定时器,倒计时结束后关灯。做到这一步,一个基于STM32的人体存在检测节点就完成了,后续还可以通过NB-IoT、Wi-Fi或者CAN总线把状态上报给更上层的系统。
4. 实测避坑:误报、漏报和参数调优实录
4.1 安装位置不对,再贵的雷达也会误报
我调测期间踩过最大的坑就是安装位置。第一次我把雷达放在客厅电视柜上,正对着阳台推拉门,结果一到傍晚,太阳把窗帘晒热、风一吹窗帘摆动,雷达就判定“有人”,灯自己亮了。
后来又试过把雷达放在墙角,结果它正对着走廊,人在走廊外走动,隔着一层薄墙也能被雷达捕捉到,客厅灯又乱亮。24G雷达的穿透性虽然不算强,但普通的石膏板墙和木门是挡不住的,所以安装时不要让它正对家里经常有人走动的走廊或者门外。
我自己最终确定的位置是房间天花板的角落,雷达斜向下45度角,覆盖主要活动区域,同时避开窗户和门。这样既不会漏检,也不会因为窗帘和走廊误报。安装高度建议离地1.2到1.5米,如果是吸顶安装尽量选带旋转底座的支架,方便调整角度。
4.2 四个关键参数:灵敏度、无人延迟这样调
24G雷达一般不推荐直接出厂默认值用到底,尤其在不同房间大小、不同布局下,误报漏报的表现差距很大。以LD2410为例,主要通过串口指令配置内部的灵敏度门限和无人判定延迟。
我把调参经验整理一下,这几个参数是需要重点关注的:
- 运动灵敏度:检测运动目标的门限。设太高,人的微小动作容易被忽略;设太低,窗帘摆动、蚊虫飞过都可能触发。
- 静止灵敏度(微动灵敏度):检测静止人体呼吸的门限。这个是存在检测的核心,建议先保持默认,等运动灵敏度调好后再微调。
- 无人判定延迟:目标消失后,多长时间才判定为无人。我一般设置在30秒到3分钟之间,客厅取30秒,卧室取3分钟。
- 检测距离上限:超过该距离的目标直接忽略,适合用来规避门外和窗外运动。
调参的方法很直接:接上串口,打开串口调试工具,盯着数据看。人从检测区域的远端慢慢往里走,记录运动距离和能量值;再坐下不动,看静止能量值。然后把门限设在实际值的1.5倍左右,留出余量,既不会漏报,也不容易被干扰源触发。
提示:调节参数时务必在“实际使用环境”下做,不要在库房里调好了直接搬回家用。房间大小、家具布局甚至地毯颜色都会影响反射能量。
4.3 常见问题速查表:误报、漏报、串口不通
实操中大家遇到最多的问题基本就这三类,我整理成一张排查表,方便直接对着查:
| 问题现象 | 可能原因 | 解决思路 |
|---|---|---|
| 人没动,灯自己亮 | 雷达正对窗帘、风扇、窗户、走廊 | 调整安装角度,降低运动灵敏度,开启距离上限 |
| 人坐着不动,灯灭了 | 静止灵敏度太低,或无人延迟太短 | 提高静止灵敏度,把无人延迟调到30秒以上 |
| 人在门外走动,屋里亮灯 | 24G雷达穿透薄墙检测到门外目标 | 调整安装位置,设置最大检测距离 |
| 串口没有数据 | TX/RX接反,或者没有共地 | 检查接线,确保雷达TX接主控RX,且电源共地 |
| 读到的数据偶尔乱码 | 供电电压不足或电源纹波大 | 换稳压电源,不要用劣质USB供电模块 |
| 多台雷达互相干扰,状态跳变 | 雷达之间距离太近,载波相互干扰 | 拉开设备间距,尽量错开朝向,避免对射 |
我遇到过最隐蔽的问题是供电不足。某次雷达忽然频繁重启,串口数据时有时无,测了一下才发现是那根USB线压降太大,5V供电实际到模块只有4.2V。换成稳定的电源之后,问题立刻消失。
4.4 多雷达部署与全屋联动注意事项
如果你打算做全屋智能,不止装一个雷达,我这里还有几条亲测有效的建议:
相邻房间的雷达不要面对面安装,否则天线方向图重叠,可能出现两套设备同时检测到同一个目标,导致自动化逻辑互相打架。我一般会让相邻房间的雷达朝向相反方向,或者上下错开高度。
多雷达的数据在HA里建议做“或逻辑”联动处理。比如卫生间有人是A雷达,卧室有人是B雷达,全屋无人关电的逻辑要写成所有区域都没有人,而不是某个雷达没有人。这点在node-red里实现起来很方便,但在HA的自动化默认模式下容易写错,建议用模板或者group把所有存在检测实体组合起来。
最后是关于自动化流程的一个小建议:灯的开和关不要绑定同一个触发条件。我之前图省事,直接用“目标状态从开启变关闭”去关灯,结果人坐在床边刷手机,雷达短暂判断丢失,灯就灭了,过两秒又亮,体验非常差。后来改为“关闭状态持续30秒以上才执行关灯”,问题就没了。这种防抖思路虽然简单,但在实际使用中非常关键。
我个人在实际操作中最大的体会是:24G毫米波雷达不是万能神器,它解决了红外PIR“静止漏报”的痛点,但引入了一系列新的调参和位置工程问题。如果你正处于改造阶段,我建议别急着一次装全屋,先拿一个房间试水,用串口挂着看一段时间数据,摸清这个房间的底噪再定参数,这样后面大规模部署会省心得多。