HC-SR501人体红外PIR接ESP32:接线调参避坑

2026-11-04 07:13:04 7阅读

给机器人或桌面装置加一个「有人靠近才动作」的触发,最省事的器件就是 HC-SR501 这颗人体红外(PIR)模块:三根线、一个数字输出口,ESP32 用一个 GPIO 就能读。但它也是出了名的新手劝退件——上电头一分钟乱触发、明明没人却报 HIGH、接 3.3V 直接没反应。这篇把几份教程和踩坑记录对下来,把接线、背面两颗电位器、跳线模式和代码一次理顺,照着走基本能一次点亮。

上手前先搞懂:它到底怎么「看」人

HC-SR501 是被动式红外传感器,英文全称 Passive Infrared,模块本身不发射任何东西,只接收环境中物体散发出的红外辐射,也就是体温热信号。这也是它名字里「被动」两个字的由来。

模块正面那颗乳白色半球是菲涅尔透镜,负责把大范围的红外信号聚焦到内部的双元热释电传感器上,并把探测区分割成多个敏感区。当有人在探测区内移动,热源会依次划过不同敏感区,传感器感受到红外辐射的变化,背面的 BISS0001 处理芯片把这种微弱变化放大、比较,最后从 OUT 脚输出一个干净的高电平。

理解了这个原理,两个常见「故障」就解释通了。第一,静止的人、持续发热的暖气片不会触发,因为传感器检测的是红外辐射的变化率,不是温度本身;第二,冰块这类低于环境温度的物体基本检不到。遇到这种情况别急着换模块,这不是坏了。

顺带记住模块的三件套结构:菲涅尔透镜负责聚焦、双元热释电元件负责感应变化、BISS0001 负责放大比较和输出。后面调参数,调的全是围绕这颗芯片的外围设置。

接线:三根线的事,电源千万别接错

HC-SR501 一共三个引脚,接线对应关系如下:

HC-SR501接 ESP32说明
VCCVIN(5V)模块供电,走 USB 取电的 5V 脚
OUTGPIO14数字输出,任意可用 GPIO 都行
GNDGND共地,信号基准

最容易翻车的是供电。这颗模块必须用 5V 供电,接 3.3V 会出现输出乱跳甚至完全不工作的现象。不同批次的资料口径略有出入,有标 5V 至 12V 的,也有标 4.5V 至 20V 的,但按 5V 供电没有任何争议——ESP32 DevKit 上的 VIN 脚直接取 USB 的 5V,接这里最稳。

好消息是输出侧不用担心电平问题。模块用 5V 供电时,OUT 脚的高电平是 3.3V 左右,与 ESP32 的 GPIO 电平直接兼容,不需要电平转换,也不需要分压电阻。这一点和很多 5V 传感器要加转换电路的情况不一样,也是 HC-SR501 好接的原因之一。

另外两个小细节:信号线尽量短,长线容易拾取噪声造成误触发;接线时先断开 USB,接完再上电,别带电插拔。

HC-SR501引脚定义

接线本身不复杂,对着下面这张示意图从左到右捋一遍即可:

ESP32与HC-SR501接线示意图

上电后先别急着判断好坏。模块需要 30 到 60 秒的预热稳定期,这段时间输出乱跳是正常的,后面代码里会专门跳过它。

背面两颗电位器加一颗跳线帽,上手先调这里

把模块翻过来,背面有两颗蓝色电位器和一组三针跳线,这是 HC-SR501 的全部可调项,也是很多人装完就翻车的地方。

标着 Tx 的是延时电位器,决定检测到运动后 OUT 脚保持高电平多久,可调范围从几秒到几分钟,不同批次的标称口径不完全一样,有的写 3 秒到 5 分钟,有的标 0.3 秒到 200 秒,以手上模块实测为准。做走廊感应灯可以设短一点,几秒就够;做无人值守的告警触发可以适当拉长。拧得过长的典型症状是「人走了灯还亮半天」,串口里表现为 OUT 一直 HIGH。

标着 Sx 的是灵敏度电位器,实际调的是探测距离,大约 3 米到 7 米。逆时针方向探测距离近、误触发少,顺时针方向看得远、但也更容易被远处干扰骗到。家里有宠物或者对着过道的,建议先调低。

跳线帽控制触发模式。插在 H 档是可重复触发,只要有人在动,OUT 就一直保持高电平,每次新动作都会重置计时;插在 L 档是单次触发,高电平维持设定的延时就拉低,之后还有一个约 2.5 秒的闭锁期,期间再怎么动也不响应。做存在检测、感应灯、机器人避障启动,绝大多数场景都用 H 档。

上手建议:两颗电位器都先拧到中间位置,跳线插 H 档,跑通之后再按场景细调。

HC-SR501背面电位器与跳线

代码:先跑最小验证,再加 LED 做可视化

无需任何库,digitalRead 就够了。第一段是最小验证代码,接线按上表 OUT 接 GPIO14,串口监视器开 115200 波特率:

// HC-SR501 + ESP32 | theorycircuit.com
#define PIR_PIN 14

void setup() {
  Serial.begin(115200);
  pinMode(PIR_PIN, INPUT);
  Serial.println("HC-SR501 Ready. Warming up...");
  delay(30000); // 30 sec warm-up — don't remove this
}

void loop() {
  int motionState = digitalRead(PIR_PIN);

  if (motionState == HIGH) {
    Serial.println("Motion Detected!");
    // Your action here: LED on, buzzer, MQTT publish
  } else {
    Serial.println("No Motion.");
  }
delay(500);
}

setup 里那个 delay(30000) 不能省,它就是前面说的预热期。省掉之后串口会刷一堆莫名的 Motion Detected,让人以为模块是坏的,其实只是它还在采样环境基线。烧录完等半分钟,再伸手在透镜前晃一下,串口输出 Motion Detected 就算通了。

想看得更直观,可以按下面第二段加一颗 LED:LED 阳极经 150 欧限流电阻接 GPIO33,阴极接 GND,PIR 的 OUT 改接 GPIO12:

#define PIR_PIN   12    // PIR OUT → GPIO12 (as per your diagram)
#define LED_PIN   33    // LED → GPIO33

void setup() {
  Serial.begin(115200);

  pinMode(PIR_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);

  Serial.println("=================================");
  Serial.println(" ESP32 + PIR Motion Sensor ");
  Serial.println("=================================");
  Serial.println("Warming up sensor... (30 sec)");

  // PIR warm-up time
  for (int i = 30; i > 0; i--) {
    Serial.print("Ready in: ");
    Serial.print(i);
    Serial.println("s");
    delay(1000);
  }

  Serial.println("Sensor ready! Monitoring...");
  Serial.println("---------------------------------");
}

void loop() {
  int pirState = digitalRead(PIR_PIN);

  if (pirState == HIGH) {
    Serial.println(">> MOTION DETECTED!");
    digitalWrite(LED_PIN, HIGH);   // Turn ON LED
  } 
  else {
    Serial.println("   No motion.");
    digitalWrite(LED_PIN, LOW);    // Turn OFF LED
  }

  delay(500);
}

这段把预热期做成了 30 秒倒计时打印,烧录时串口会一秒一秒往下数,数完再开始监测,验证起来更直观。跑通这两段之后,把 if 分支里的动作换成蜂鸣器、继电器或者 MQTT 推送,就是各种人体感应项目的基础骨架。

ESP32接PIR传感器与LED演示电路

避坑清单:这几类误触发都遇得到

第一坑,上电一分钟内乱触发。BISS0001 上电后要花 30 到 60 秒采样环境红外基线,期间输出不稳定,代码里必须跳过这段窗口,前面两段代码里的 warm-up 处理就是干这个的。

第二坑,离 WiFi 太近。BISS0001 前端是高阻抗放大器,很容易把射频干扰拾进来变成假信号,有踩坑记录提到 ESP32 开发板或路由器贴着模块十厘米内会频繁误报,实际安装时让天线部分离 PIR 至少 15 厘米以上。

第三坑,热气流和阳光。空调风口、暖气片、风扇、太阳直射都会让透镜后的热释电元件「看到」快速变化的热信号,从而误触发。安装时把透镜朝向避开窗户和风口,配合调低灵敏度电位器,能解决大部分问题。

第四坑,OUT 一直 HIGH 拉不下来。先检查延时电位器是不是拧到最大了,拧回中间再试;再确认跳线是不是在 H 档且有人持续在动,可重复触发模式下有人在动它就一直保持高电平,这是特性不是故障。

第五坑,该触发的时候不触发。除了前面说的静止热源原理性限制,还要检查供电是不是 3.3V——供电不足时输出会非常不可靠,这是接线环节返工最多的一处。

最后:什么场景别硬用 PIR

HC-SR501 便宜好用,但它穿不过墙体和封闭外壳,也怕环境热干扰。如果需求是隔着木板、塑料外壳检测人的存在,PIR 这条路走不通,该换微波雷达模块比如 RCWL-0516,它能穿透非金属材料;如果只是狭小空间里做近距离感应,AM312 这类迷你 PIR 体积更合适。按需选型,别让一颗传感器硬扛所有场景。

总结一下这条链路:5V 供电走 VIN、OUT 直连 GPIO、跳线插 H、两颗电位器先居中、代码里留足 30 秒预热、安装避开热干扰源。六步都对上,HC-SR501 基本就是即插即用的级别,剩下的就是把触发动作用在你想让它用的地方。


作者:固件烧录仔
链接:https://www.aiddithome.com/p/19b622cee55606.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论
装过才知道
1楼 · 5小时前

供电那坑我踩过,接3V3没反应还以为模块到货就是坏的,换VIN秒好。

线比代码多
2楼 · 5小时前

三根线里两根是电源,这模块对新手确实友好,接错概率最低的一类。

老张装机
3楼 · 5小时前

H档L档这段讲得清楚,很多帖子只让你插跳线不解释区别。

参数党小马
4楼 · 5小时前

这颗模块我装过三四个,文章里说的上电一分钟乱触发太真实了。当时以为是坏的差点退货运费都花出去了,后来查了资料才知道是BISS0001在采环境基线,代码里加个开机延时跳过就行。另外提醒一句,延时电位器真的别拧到头,我第一次拧到最大,人走开十分钟灯还亮着。