PIR 人体红外传感器(HC-SR501)
| 器材 | 数量 | 参考 |
|---|---|---|
| HC-SR501 PIR 模块 | 1 | — |
价格随渠道波动,以购买页实时为准。
想做一个"人来灯亮、人走灯灭"的感应灯,最经典、最便宜的方案就是它——HC-SR501 人体红外模块。一块巴掌大的板子,正面那个白色半球形的"小灯泡"罩子很好认。它只有三根线,输出是干干净净的数字电平:有人就给高电平,没人就给低电平,单片机一个 digitalRead 就读完了。十几块钱,几乎是入门感应类项目的第一站。
不过这个模块有个绕不过去的脾气:它测的是"移动的热源",不是"有没有人"。这个区别后面会反复强调,因为踩坑的人大多栽在这上面。
工作原理
任何高于绝对零度的物体都会向外辐射红外线,人体(约 37℃)辐射的红外波长集中在 10μm 附近。模块里那块核心元件叫热释电红外传感器(PIR,Pyroelectric Infrared),它有一个关键特性:只对照射在它上面的红外能量变化产生电信号,红外能量稳定不变时它没有输出。
这就解释了那句"只测移动"。元件内部其实有两个串联反接的感应单元:
- 一个温体(人、猫、狗)从视野一侧移动到另一侧,会先扫过第一个单元、再扫过第二个,两个单元先后被激发、电压一正一负,叠加出一个明显的脉冲——模块判定"有人"。
- 如果热源静止不动,两个单元接收到的红外能量恒定且相互抵消,输出几乎为零——模块判定"没人"。
所以一个人坐在沙发上一动不动看电视,几分钟后感应灯很可能就灭了,这不是模块坏了,是它的物理原理决定的。
那白色半球罩子也不是装饰,它叫菲涅尔透镜。透镜表面被刻成很多个分区(一格一格的小棱镜),把前方的探测空间切分成许多明暗交替的"扇形区"。人每跨过一个区的边界,落在热释电元件上的红外能量就跳变一次,等于把"移动"这个动作放大成一连串清晰的能量脉冲。没有这块透镜,PIR 的探测距离和灵敏度会差很多。
接线
HC-SR501 是三脚模块,接线非常简单:
| HC-SR501 | ESP32 | 说明 |
|---|---|---|
| VCC | 5V(VIN) | 工作电压 4.5–20V,宽容差 |
| OUT | 任意 GPIO | 数字读,检测到人输出高电平 |
| GND | GND | 共地 |
关于 OUT 的电平:HC-SR501 触发时 OUT 输出约 3.3V 的高电平,可以直接接 ESP32 的 GPIO,无需电平转换。但市面上仿制板很多,丝印和元件不一定一致,第一次用最好拿万用表量一下触发时 OUT 到底是 3.3V 还是 5V,5V 直灌 ESP32 的脚不安全。供电用 5V 即可,板载稳压会处理。
板子上还有两个橙色电位器和一个三脚跳线,那是这个模块真正的"可玩之处",下面单独讲。先看代码。
完整代码
逻辑朴素到不能再朴素:读 OUT 脚,HIGH 就是检测到人。
const int PIR_PIN = 13; // OUT 接到 GPIO13
const int LED_PIN = 2; // 板载 LED,演示用
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT); // PIR 自带输出驱动,普通 INPUT 即可
pinMode(LED_PIN, OUTPUT);
Serial.println("PIR 预热中,请等约 1 分钟再走动测试...");
}
void loop() {
int motion = digitalRead(PIR_PIN);
if (motion == HIGH) {
digitalWrite(LED_PIN, HIGH); // 有人,点灯
Serial.println("检测到移动!");
} else {
digitalWrite(LED_PIN, LOW); // 无人,灭灯
}
delay(200); // 不必读太快,PIR 的高电平会保持一段时间
}
不需要复杂的去抖或滤波——模块内部已经把脉冲处理成一个稳定的高电平输出,并按你设定的延时时间保持。给单片机的就是一个干净的开关信号。
如果想让 AI 帮你扩展,可以这样描述需求:「ESP32 用 GPIO13 读 HC-SR501 的 OUT,检测到人时点亮继电器并打印时间戳,无人 30 秒后关闭」,把引脚号和动作说清楚,生成的代码基本能直接跑。
你应该看到什么
烧录后先别急。上电后模块需要约 1 分钟预热(见下文避坑),这段时间它会乱跳,串口可能时不时蹦出"检测到移动",属于正常现象。
等预热过后,离开传感器视野站着不动,串口应该安静下来、LED 熄灭。这时你从模块前方走过——OUT 立刻变高,串口打印"检测到移动!",LED 亮起。走出视野并保持不动,过了你设定的延时时间后,OUT 回落到低电平,LED 熄灭。
一个判断模块好坏的小技巧:用手在镜头前快速晃一下,应该立刻触发;把手稳稳停在镜头前不动,几秒后输出会回落——这正好印证了"测移动不测静止"。
调节与读数解读
HC-SR501 板上有两个电位器和一个跳线,这是它和很多"焊死参数"的模块不同的地方:
灵敏度 / 距离电位器(标 Sx 或 Sens) 调探测距离,范围约 3–7 米。顺时针通常是增大距离/灵敏度。如果发现稍微远点的移动测不到,往灵敏度高的方向拧;如果太容易被远处的动静触发,往回拧。
延时电位器(标 Tx 或 Time) 调触发后高电平保持多久。检测到人后 OUT 立刻变高,之后无论人是否还在,都会保持这个高电平一段时间(出厂常见可调范围约 5 秒到 5 分钟),保持期结束才重新判断。做感应灯时把它调到你希望"人走后灯再亮多久"。
触发模式跳线 这个跳线决定保持期内再次检测到人会怎样:
- 可重复触发(H 档):保持期内若又测到移动,延时重新计时。人持续活动时灯会一直亮,最常用,做感应灯/安防都选它。
- 单次触发(L 档):保持期内不响应新的移动,延时走完才重新判断,期间会有一小段不灵敏的"盲区"。
多数项目把跳线设到可重复触发(H)就对了。买来先确认跳线位置,它直接影响你对"灵敏度"的体感。
选型 / 避坑
PIR 便宜够用,但它的物理边界很硬,选型前先想清楚你要测的到底是什么:
- 只要检测"有人经过 / 移动"——感应灯、过道触发、来人提醒——PIR 完全够用,几块钱搞定。
- 要检测"有人在(静止也算)"——比如人坐在工位前不动也要算"有人在",做存在感应、占用检测——PIR 必漏检,应该上毫米波雷达 LD2410。它测的是物体(含微小起伏如呼吸)的存在,人静止也能稳定判定有人,且不受温度变化干扰,价格也只比 PIR 贵一点。
① 上电预热:通电后约 1 分钟内输出不稳定,会乱触发,这是热释电元件建立基线的正常过程,测试和判断好坏都要等预热过后。 ② 只测移动不测静止:人坐着不动会被判成"没人",做存在检测请改用毫米波雷达,别硬怪 PIR。 ③ 误触发源:阳光直射、空调/暖气出风口的热气流、宠物、突然的温度变化都可能让它误报。安装时避开窗户直射和风口,是减少误报最有效的一招。
故障排查
| 现象 | 可能原因 | 排查 |
|---|---|---|
| OUT 一直为高 | 预热期未过 / 误触发源持续 / 灵敏度过高 | 等满 1 分钟;移开风口、阳光;调低灵敏度 |
| OUT 一直为低,走过也不触发 | 灵敏度太低 / 距离超范围 / 接线错 | 拧高灵敏度电位器;靠近测试;查 VCC、GND |
| 频繁误触发 | 气流、阳光、宠物、附近发热源 | 改安装位置避开干扰;适当降灵敏度 |
| 人站着不动就灭 | 这是正常现象(只测移动) | 需要测静止存在请换毫米波 LD2410 |
| 触发后高电平很短/很长 | 延时电位器位置 | 调 Tx 电位器到合适保持时间 |
| ESP32 读不到电平变化 | OUT 电平/引脚不匹配 | 万用表量触发时 OUT 电压;换确认可用的 GPIO |
进阶 / 变体
- 配继电器控大功率灯:把 OUT 的信号接 ESP32,再用 ESP32 驱动继电器控制 220V 灯泡,就是一盏完整的智能感应灯。继电器隔离了强电,单片机只管逻辑。
- 加蜂鸣器做报警:检测到人时不点灯而是驱动蜂鸣器,配上一个按键做布防/撤防开关,就是最小的入侵报警雏形。
- 联网推送:ESP32 检测到移动后通过 Wi-Fi 推一条手机通知,配合延时去抖避免刷屏,是无人时段的简易看家方案。
- PIR + 光敏组合:白天有自然光时不点灯,只在天黑且有人时才亮,更省电。
典型应用
- 自动感应灯:楼道、卫生间、衣柜、车库——人来灯亮、人走延时熄灭,PIR 最经典的归宿。
- 安防报警:布防状态下检测到移动即报警/推送,配合摄像头联动。
- 自动门 / 迎宾:检测有人靠近触发开门或语音欢迎。
- 节能控制:办公室、会议室无人时自动关灯关空调。
小结
PIR(HC-SR501)是一颗"看红外能量变化"的开关:温体移动经过就给高电平,原理决定了它只测移动、不测静止。记住三件事就能用好它——上电等 1 分钟预热、两个电位器分别调距离和延时保持、需要检测静止存在时换毫米波雷达 LD2410。它是数字输出,读法和按键一样简单,属于典型的数字信号传感器。
相关阅读:理解数字与模拟信号的区别、GPIO 基础、用继电器控制强电、把传感器接入 AI 应用。更多模块见传感器总览与原理篇。
参数以 datasheet 为准;本页为公开资料整理,接线与代码请结合实物验证。