简介:本资源是面向嵌入式开发者与传感器应用工程师的STHS34PF80高灵敏度红外存在检测完整实现方案,聚焦于解决宽温域下人体/物体存在感应精度低、环境温度漂移导致测温失准等实际工程难题。资源包含225个文件(4.21MB),涵盖90个头文件(h)、36个C源码(c)及37个目标文件(o),主体为基于STM32H5系列MCU的InfraredPD算法库工程,包含HAL驱动、TIM/I2C/RTC等外设配置、TMOS温度补偿核心模块及预编译静态库(.a),支持低增益模式下替代传感器内置算法并实现线性/非线性环境温补。已有224人学习下载,提供可直接集成的固件工程(uvprojx、mxproject)、完整编译产物(axf、hex、map)及技术文档(pdf、md),便于快速验证存在检测逻辑、调试温度补偿效果与移植至同类红外传感项目。
1. 项目缘起:为什么是STHS34PF80?
在智能家居、办公节能、安防监控这些领域,我们总在琢磨一件事:如何更精准、更可靠地判断一个空间里“有没有人”?传统的方案,比如PIR(被动红外)传感器,大家都很熟悉了,它靠检测人体移动带来的红外热辐射变化来工作。但它的短板也很明显:人一旦静止不动,它就“瞎”了,误判成无人,空调、灯光可能就关了,体验非常糟糕。而像摄像头方案,又涉及到隐私和算力成本的问题。
所以,当我在寻找一个能解决“静态存在检测”这个痛点的方案时,STMicroelectronics的STHS34PF80进入了我的视野。它被官方称为“高灵敏度红外存在检测传感器”,核心卖点就是能探测到静止人体的微小红外辐射。这听起来正是我需要的。但 datasheet 上的参数和官方演示是一回事,实际拿回来集成、调试,让它稳定可靠地工作,又是另一回事。市面上关于它的中文实战资料很少,大多停留在功能介绍。因此,我决定把这个从零开始折腾STHS34PF80,并实现稳定存在感应检测的完整过程记录下来,重点分享那些官方文档里不会写的配置细节、调试坑点和实战心得。
简单来说,STHS34PF80 不是一个简单的红外接收管,它是一个集成了红外热电堆传感器、低噪声放大器、24位ADC以及一个复杂数字信号处理内核的完整系统级芯片。它的核心原理是探测8-14微米波长的远红外辐射,这个波段正好是人体体温辐射的峰值区域。通过其内部的InfraredPD算法,它能将微弱的辐射信号转化为一个代表“存在可能性”的数值,而不仅仅是“有/无”的开关量。
2. 核心硬件选型与电路设计要点
拿到一颗传感器,第一步永远是看硬件怎么接。STHS34PF80 提供了两种接口:I2C 和 SPI。对于大多数嵌入式应用,I2C 因其简单和引脚少而成为首选,我的项目也基于 I2C。
2.1 电源与去耦:稳定的基石
Datasheet 上明确要求供电电压(VDD)范围为 1.7V 到 3.6V。我强烈建议使用3.3V供电。原因有三:第一,3.3V是大多数现代MCU(如STM32、ESP32)的标准IO电压,电平匹配,省去电平转换的麻烦;第二,在这个电压下,传感器的模拟前端和数字内核都能工作在最佳性能区间;第三,避免使用接近下限的电压,以防电源纹波导致工作不稳定。
注意:绝对不要用5V直接供电,会永久损坏传感器。
电源引脚(VDD)的去耦电容至关重要。官方推荐在VDD引脚附近放置一个100nF的陶瓷电容(C1)和一个4.7μF的陶瓷电容(C2)。这里的布局有讲究:
- 100nF电容:必须尽可能靠近传感器的VDD和GND引脚,它的作用是滤除高频噪声,路径要短,引线电感要小。
- 4.7μF电容:可以稍远一些,用于提供瞬时电流和滤除低频纹波。
我最初的板子上为了省空间,把4.7μF电容放得有点远(约2cm),在快速启停传感器进行功耗测试时,偶尔会出现数据读取错误。后来严格按照推荐布局修改后,问题消失。所以,别小看这两个电容的位置。
2.2 I2C 接口与地址配置
STHS34PF80 的 I2C 地址由SAO引脚的电平决定:
SAO接 GND:I2C 地址为0xB6(写) /0xB7(读)(7位地址表示为0x5B)。SAO接 VDD:I2C 地址为0xB2(写) /0xB3(读)(7位地址表示为0x59)。
这个地址是固定的,无法通过软件更改,所以在一根I2C总线上挂多个同类传感器时,需要硬件上区分SAO引脚。I2C 的上拉电阻通常为 4.7kΩ,如果总线较长或设备较多,可以适当减小,比如用到 2.2kΩ,以改善上升沿时间。
2.3 红外窗口与FOV(视场角)
这是影响检测性能最关键的物理因素之一。STHS34PF80 本身是一个裸露的芯片,需要在其上方安装一个红外滤光片窗口。这个窗口只允许8-14μm的红外光通过,屏蔽掉可见光和其他波段的干扰,比如白炽灯、太阳光中的近红外成分。
官方模块通常已经集成好了。如果你是自己设计外壳,需要注意:
- 材料:必须使用针对8-14μm波段高透过的材料,如聚乙烯(PE)、锗(Ge,但成本高)或专用的红外滤光片。
- FOV:视场角。STHS34PF80 芯片本身的FOV很宽(约80°)。通过窗口的形状和安装距离,可以塑造最终的探测区域。一个平顶窗口会提供一个圆锥形的探测区域。你需要根据安装高度(比如天花板2.8米)和需要覆盖的地面范围,来计算所需的FOV。FOV太宽,可能探测到门外的走廊;FOV太窄,又容易有死角。
- 清洁:窗口务必保持清洁,灰尘、指纹、油污都会严重衰减红外信号。
在我的测试中,我将传感器模块(带标准窗口)安装在天花板角落,距离地面约2.5米,其地面覆盖范围大致是一个直径约3.5米的圆形区域,这对于一个工位或小房间的检测是合适的。
3. 寄存器配置与驱动开发实战
硬件连接妥当后,接下来就是通过I2C配置传感器,让它开始工作并输出数据。STHS34PF80 的寄存器不算特别多,但几个关键配置决定了它的行为模式。
3.1 初始化流程与关键寄存器
一个稳健的初始化流程如下:
- 检查设备ID:首先读取
WHO_AM_I寄存器(地址 0x0F)。STHS34PF80 的这个寄存器值应该是0xD3。这一步能验证I2C通信是否正常,以及你拿到的是不是正品。 - 软件复位:向
CTRL1寄存器(地址 0x20)的SW_RESET位写1。这会复位所有寄存器到默认值。等待至少 1ms 后再进行后续操作。 - 配置输出数据率(ODR):在
CTRL1寄存器中设置ODR位。这是最重要的参数之一,决定了传感器多久测量一次。选项从 1Hz 到 30Hz。对于存在检测,通常不需要太快,1Hz 或 4Hz 就足够了。更低的 ODR 意味着更低的功耗。我选择4Hz,在响应速度和功耗间取得了平衡。 - 启用InfraredPD算法:这是核心。向
CTRL2寄存器(地址 0x21)的INITIAL_PD位写1。这个操作会触发传感器内部的InfraredPD算法初始化。根据官方说明,初始化过程可能需要最多500ms。在此期间,不要进行其他寄存器操作。 - 配置算法参数(可选但重要):
CTRL3寄存器(地址 0x22)包含算法的一些关键参数。AVG_TRIM:平均修剪因子,影响背景噪声估计的稳定性。默认值通常可行,在环境变化剧烈的场景可以微调。MASK_DIST:屏蔽距离。这是一个高级功能,可以屏蔽传感器前方一定距离内的信号,防止过近的物体(如桌上的水杯)被误判为人。需要根据实际安装高度计算。
- 启用数据就绪中断(可选):可以配置
CTRL4寄存器来设置中断引脚INT的行为,例如当新的存在检测数据就绪时触发中断。这样MCU就不需要轮询,可以进入低功耗睡眠,由传感器中断唤醒,非常适合电池供电设备。 - 启动连续测量:最后,向
CTRL1寄存器的BDU(块数据更新)位写1(推荐,防止在读取多字节数据时高低字节更新不同步),然后向CTRL1的MODE位写1,让传感器进入连续测量模式。
3.2 数据读取与解析
传感器开始工作后,我们需要定期读取数据。核心数据位于两个寄存器:
STATUS(地址 0x23):其中DA位表示是否有新的存在检测数据可用。PRESENCE(地址 0x28, 0x29):这是一个16位有符号整数(两个8位寄存器拼接),它直接输出InfraredPD算法的结果,我称之为“存在值”。
这个“存在值”是关键。它不是一个简单的0或1,而是一个范围很大的数值(理论上是16位有符号,即-32768到+32767)。数值越大,表示检测到“存在”的可能性越高。你需要为你的应用场景设定一个阈值(Threshold)。当读取到的PRESENCE值超过这个阈值时,就判定为“有人”;低于另一个阈值(或低于设定阈值一定迟滞量)时,判定为“无人”。
这里就引出了第一个实战坑点:这个“存在值”的绝对大小受多种因素影响,包括环境温度、传感器朝向、窗口洁净度、甚至供电电压的微小波动。因此,你不能把一个固定的阈值(比如1000)写死在代码里,然后指望它在所有安装位置都工作良好。
4. 动态阈值与自适应算法:从数据到可靠判断
直接使用固定阈值是STHS34PF80应用中最常见的失败原因。为了解决这个问题,必须引入动态或自适应的阈值管理机制。
4.1 环境基线自学习
核心思想是:让系统在明确“无人”的状态下,学习当前环境的“存在值”基线水平。
实现步骤:
- 上电初始化后,延迟一段时间(比如30秒),等待传感器输出稳定,并且确保这段时间内检测区域无人。这段时间内,持续采样
PRESENCE值。 - 计算这段时间内采样值的移动平均或中位数,作为初始的
baseline(环境基线)。这个基线代表了当前环境温度、墙壁辐射等静态因素产生的本底信号。 - 你的检测阈值
detection_threshold应该设置为baseline + offset。这个offset是一个经验值,需要通过实验确定。在我的测试中,一个静止的人通常会使PRESENCE值比基线高出200 到 1000点(取决于距离和角度),因此我将offset初始设为 300。
4.2 引入迟滞与状态机
为了防止在阈值附近频繁抖动(比如人轻微晃动导致数值在阈值上下跳动),必须引入迟滞(Hysteresis)。
- 有人 -> 无人的判定阈值应低于无人 -> 有人的判定阈值。
- 例如:
- 如果
current_presence > (baseline + 300),则判定为“有人”。 - 一旦判定为“有人”,只有当
current_presence < (baseline + 100)时,才切换回“无人”状态。
- 如果
这样,就形成了一个“检测窗口”,避免了状态的乒乓切换。
4.3 基线的缓慢跟踪
环境温度会缓慢变化(如从清晨到午后),墙壁和家具的温度也会变。因此,baseline不能是固定不变的。在系统判定为“无人”的状态时,应该以非常慢的速度更新baseline,使其跟踪环境的本底变化。
例如,每次在“无人”状态下读取到新的PRESENCE值P_new时:
baseline = baseline * 0.995 + P_new * 0.005这是一个一阶低通滤波器,时间常数很大,确保基线只跟随缓慢变化,而不会被人体的瞬时信号带偏。
4.4 我的实战代码逻辑片段(伪代码)
// 状态定义 typedef enum { STATE_NO_PERSON, STATE_HAS_PERSON } detection_state_t; // 全局变量 int16_t presence_baseline = 0; detection_state_t current_state = STATE_NO_PERSON; uint32_t last_detection_time = 0; void presence_detection_task(void) { int16_t current_presence = read_presence_value(); // 读取STHS34PF80的PRESENCE寄存器 switch(current_state) { case STATE_NO_PERSON: // 缓慢更新基线(仅当持续无人时) presence_baseline = (presence_baseline * 99 + current_presence) / 100; if(current_presence > (presence_baseline + DETECTION_THRESHOLD)) { current_state = STATE_HAS_PERSON; last_detection_time = get_current_time(); printf("检测到人!\n"); } break; case STATE_HAS_PERSON: // 有人状态下,不更新基线 if(current_presence < (presence_baseline + RELEASE_THRESHOLD)) { // 可能人离开了,但需要持续一段时间低于阈值才确认 if((get_current_time() - last_detection_time) > DEBOUNCE_TIME_MS) { current_state = STATE_NO_PERSON; printf("人已离开。\n"); } } else { // 人还在,刷新最后检测时间 last_detection_time = get_current_time(); } break; } }其中DETECTION_THRESHOLD(例如300)>RELEASE_THRESHOLD(例如100),DEBOUNCE_TIME_MS(例如5000毫秒)用于防止短暂信号消失(如人坐下后调整姿势)导致的误判。
5. 干扰源识别与滤波策略
即使有了自适应算法,现实环境中还是充满了干扰。STHS34PF80 虽然对8-14μm的光谱有选择性,但并非万能。
5.1 常见干扰源及应对
- 空调、暖气出风口:这是最棘手的干扰之一。热风或冷风直接吹到传感器窗口,会引起窗口温度快速变化,产生巨大的红外信号,极易误报。解决方案:安装时必须避开空调正对的位置。如果无法避开,可以考虑在软件上增加一个“风速”或“温度变化率”的判断(如果系统有其他传感器),当环境温度剧烈变化时,临时提高检测阈值或暂停存在判断。
- 阳光直射或移动:太阳是极强的红外源。虽然窗口滤光片能阻挡大部分,但强烈的阳光照射在窗口上,仍会引起温升和信号波动。早晨或傍晚阳光斜射入室,光斑移动也可能被误判。解决方案:避免安装在有阳光直射的位置。或者,利用其内部的温度传感器(STHS34PF80也提供环境温度数据),当检测到环境温度异常高且快速上升时,可以认为是阳光干扰。
- 白炽灯、卤素灯:这类热光源在近红外波段也有较强辐射,虽然主要能量被滤光片阻挡,但长时间近距离照射仍有影响。解决方案:尽量使用LED灯。如果必须用,让传感器远离灯具。
- 小动物:猫、狗等宠物。它们的体温和人体接近,也会被探测到。解决方案:利用
MASK_DIST功能(如果安装高度足够),屏蔽地面附近区域。或者,通过算法判断信号特征(幅度、变化频率),人体的信号通常更稳定和持续。
5.2 软件滤波:移动平均与野值剔除
在读取PRESENCE值后,直接使用原始值进行判断是不稳健的。建议加入软件滤波:
- 移动平均滤波:对最近N次采样值求平均。N不宜过大,否则响应太慢;N太小,滤波效果差。对于4Hz的ODR,N=4或8(即1-2秒的窗口)是不错的选择。
- 中值滤波:对最近N次采样值取中位数。这对脉冲型干扰(比如飞虫快速掠过)有极好的效果。
- 野值剔除:在计算平均或中值前,先判断当前采样值是否与历史均值偏差过大(例如超过3倍标准差),如果是则视为野值,用上一次的有效值或平均值代替。
在我的实现中,我采用了一个“中值滤波+移动平均”的组合:先对最近的5个采样值取中值,再将这个中值放入一个长度为4的移动平均队列。这样既能抵抗瞬时脉冲干扰,又能让输出曲线平滑。
6. 低功耗设计与中断唤醒实战
对于电池供电的无线传感器节点,功耗是生命线。STHS34PF80 在这一点上设计得相当友好。
6.1 传感器本身的功耗模式
通过配置CTRL1寄存器的ODR和MODE位,可以控制其功耗。
- 掉电模式:
MODE=0,功耗最低(典型值<1μA)。 - 单次转换模式:配置
ONE_SHOT位。每次需要测量时,由MCU触发一次转换,转换完成后自动回到掉电模式。这是最省电的方案,但需要MCU精确计时。 - 连续模式:
MODE=1,并设置ODR。功耗随ODR增加而增加。在4Hz时,典型功耗约为30μA,已经非常低了。
6.2 基于中断的系统级低功耗设计
最理想的架构是:MCU绝大部分时间深度睡眠,STHS34PF80以低ODR(如1Hz)运行。当InfraredPD算法判断“存在值”超过预设的硬件阈值时,传感器通过INT引脚产生中断,唤醒MCU。MCU被唤醒后,快速读取数据寄存器,进行更精细的软件判断,然后通过无线方式上报结果或执行控制,之后再次进入睡眠。
配置步骤:
- 配置
CTRL4寄存器,将INT引脚功能设置为在PRESENCE数据就绪时触发。 - 配置
THS_P_H和THS_P_L寄存器,设置硬件中断阈值。这个阈值可以设得比较保守(较低),确保不漏报,哪怕有些误报也没关系,因为MCU醒来后还有软件算法进行二次确认。 - 配置
CTRL5寄存器,设置中断是脉冲模式还是锁存模式。 - 将MCU的对应GPIO配置为外部中断唤醒模式,并连接到传感器的
INT引脚。 - 让MCU进入停止(Stop)或深度睡眠(Deep Sleep)模式。
这样,整个系统的平均电流可以控制在几十个微安级别,一颗CR2032纽扣电池理论上可以工作数年。
我实测了一个基于STM32L0和STHS34PF80的节点,设置ODR=1Hz,MCU每秒被唤醒一次读取数据(未使用硬件中断,是最简单但功耗略高的模式),系统平均电流约为45μA。如果优化为上述的中断唤醒模式,平均电流有望降到20μA以下。
7. 实测场景与调参经验分享
理论说完,最后分享一些在不同场景下的实测数据和调参经验。
场景一:小型办公室工位(3m x 3m)
- 安装:天花板,中心位置,离地2.7米。
- 挑战:办公椅(尤其是皮质或黑色网布)与人体的红外反射/吸收特性不同;桌面上的笔记本电脑是热源。
- 调参:
DETECTION_THRESHOLD需要设得稍高(如350),因为环境本底(电脑、显示器)会推高baseline。MASK_DIST设置为约0.5米,屏蔽桌面热源的影响。效果:人员坐下、站起、伏案工作均能稳定检测,起身去接水离开约5秒后判定为无人。
场景二:家庭卫生间
- 安装:天花板,靠近门口,避免正对浴霸和淋浴区。
- 挑战:温差大(洗澡时室温骤升),镜面反射,空间小。
- 调参:启用
CTRL3中的AVG_TRIM以增强对背景变化的鲁棒性。软件算法中,当检测到温度传感器数值在短时间内快速上升(>1°C/分钟)时,临时锁定“有人”状态,并暂停baseline更新,防止热水蒸汽导致误判。效果:可实现“人来灯亮,人走灯灭”的自动照明,即使坐着看手机也能持续检测。
场景三:会议室门口人数统计(尝试性)
- 安装:门框上方,向下倾斜一定角度,覆盖门口区域。
- 挑战:区分进入和离开,以及多人并排通过。
- 结论:STHS34PF80不适合精确的人数统计。它的“存在值”与人数并非线性关系,且无法区分方向。对于门口检测,它更适合做“有无人员进出”的二进制判断,精确计数需要用到ToF或双目视觉等方案。
通用调参建议:
- 先硬件,后软件:确保传感器安装位置合理,窗口清洁,避开强干扰源,这是所有软件算法的基础。
- 使用官方GUI工具:STMicroelectronics提供的
Unico-GUI或FP-SNS-STHS34PF80软件包中的演示程序,是前期调试的神器。它可以实时图形化显示PRESENCE值、温度值,并能直接修改寄存器。先用它在你目标场景下观察数据曲线,直观地感受信号和噪声,确定大致的阈值范围。 - 分步调试算法:先实现固定阈值,看基本检测是否生效。然后加入迟滞,解决抖动。最后再实现复杂的基线学习和动态更新。每步都验证。
- 长时间稳定性测试:让系统连续运行至少24小时,记录日志。观察在无人时段是否有误报(检查干扰源),在有人时段是否有漏报(检查阈值是否太高或基线是否漂移)。根据日志数据来微调参数。
折腾STHS34PF80的过程,是一个典型的嵌入式传感器应用案例:从读懂数据手册,到硬件设计,再到驱动编写,最后是上层算法优化和抗干扰处理。它不是一个“即插即用”的开关,而是一个需要精心调教的“模拟前端+智能算法”系统。当你看到它能在各种复杂环境下稳定地区分出“静止的人”和“静止的热源”时,那种成就感是巨大的。希望我的这些踩坑经验和实战细节,能帮你更快地驯服这颗高性能的红外存在感应芯片。
本文还有配套的精品资源,点击获取