HC-SR501接Arduino:灵敏度与延时怎么调

2026-11-12 20:36:08 5阅读

走廊灯人一走近就亮,楼道里的感应灯半夜自动开——这类"人来了才有反应"的装置,多数用的就是 PIR 人体红外传感器。而玩家手里最常见的一款,是几块钱一片的 HC-SR501。它功耗不到 2mA,最远能感知 7 米内的人体移动,三个引脚,接上就能用。这篇把它的原理、两个电位器怎么调、单触发/再触发模式怎么选,以及接 Arduino 的完整做法一次讲清楚。

HC-SR501人体红外感应模块实物

工作原理:热释电传感头加菲涅尔透镜

任何高于绝对零度的物体都在向外辐射红外线,人体自然也不例外。普通红外接收器只能判断"有没有红外辐射",而 PIR 传感器(Passive Infrared,被动红外)抓的是红外辐射的"变化"——只有温热的物体在探测范围内移动时,它才有输出。

模块核心是两样东西。一个是热释电传感头:正面看是一块圆形金属件,中间有矩形窗口,窗口后并排两个红外感应电极,一个输出正信号、一个输出负信号。静态时两个电极收到的红外量相同,互相抵消,没有信号;当人从探测区走过,两个电极先后感受到变化,差值出现,模块就判定"有东西在动"。

另一个是白色蜂巢状的菲涅尔透镜。它由一圈圈同心刻槽组成,每个小格都是一块独立的聚光透镜,把各自对应区域的红外线汇聚到同一个传感头上。这些探测区彼此重叠,才让一颗很小的感应元件覆盖住大半个房间。

硬件概览与关键参数

拆开透镜看板子,主控是一颗 BISS0001 PIR 控制芯片,负责把热释电头的微弱信号整形 成数字输出,抗噪表现在同类芯片里算好的。模块板载 3.3V 精密稳压,供电范围按规格表是 4.5V 到 20V,典型 5V,日常直接吃 Arduino 的 5V 就行。电源脚还串了一颗保护二极管,接反了也不至于烧模块。

规格逐项过一遍:工作电压 4.5–20V(典型 5V);最大工作电流小于 2mA;输出保持时间约 1 秒到 3 分钟可调;探测距离 3–7 米;探测角典型 120 度。输出是 3.3V TTL 电平——检测到人时 OUT 拉高 3.3V,无人时保持 0V。

HC-SR501引脚定义图

三个引脚的丝印常被透镜挡住,认准图示顺序:VCC 接电源(5V 到 12V 都可以,常见 5V),OUT 是 3.3V 逻辑输出,GND 接地。板上还有两个可选焊盘:RT 位置焊热敏电阻可改善极端温度下的精度,RL 位置焊光敏电阻后,模块可以做成"只在天黑后才触发",很适合夜灯和夜间警戒类项目。

灵敏度与延时,两个电位器分别管什么

板子背面有两颗橙色电位器,功能完全独立,别调混了。

HC-SR501灵敏度调节电位器

靠近 sensitivity 丝印的那颗管探测距离。顺时针旋,灵敏度升高,最远能探到约 7 米(21 英尺);逆时针旋,探测半径收缩,最近约 3 米(9 英尺)。做小走廊的感应灯时,建议调低灵敏度,免得隔壁房间路过的人也把它触发。

另一颗管输出保持时间(Time-Delay):检测到人之后,OUT 会保持 HIGH 多久。可调范围约 1 秒到 3 分钟,顺时针加长、逆时针缩短。想让灯亮久一点就往顺时针方向拧,做"人走过闪一下"的指示就旋到最短。

单触发还是再触发,跳线怎么选

触发方式由板上那组 H/L 跳线(有些板是焊桥)决定,两种模式行为差别很大。

HC-SR501触发模式跳线选择

L 挡是单触发(Single Trigger):触发后输出拉高,保持满你设定的延时,期间再来多少动作都被无视;延时结束、输出回低,才重新开始检测。极端情况是延时窗口内连续有人走动,后面的动作会被整段漏掉。

H 挡是再触发/多重触发(Multiple Trigger):延时期间每检测到新动作,计时器就重置一次,只要人一直在动,输出就一直保持 HIGH;全部动作停下之后,再等满一个延时时长才回低。做"有人在屋里灯就常亮"的场景,选 H 挡明显更合理。

除此之外还有两个隐藏延时值得记牢。一个是闭锁时间(Lockout Time):输出从 HIGH 回 LOW 之后,模块会强制休息约 2 秒,期间完全无视新动作——调短延时做快速响应时,要把这 2 秒算进去。另一个是上电预热:刚通电的 30 到 60 秒内,模块在学习房间环境的正常红外水平,期间可能乱触发几次,这段时间的信号直接忽略,也别在人前大幅走动,否则它学不准,后面误报不断。

接 Arduino:先单独点亮,再上主控

HC-SR501 不接单片机也能干活:给 VCC、GND 接上电池,OUT 串一颗 220Ω 限流电阻接一颗 LED,人一走近灯就亮。它的输出也能直接推动继电器模块去控制台灯这类大件。动手前记住一点:通电后先等 30–60 秒让模块完成预热,看到 LED 不再乱闪再挥手测试。

接 Arduino 只需要三根线:VCC 接 5V,GND 接 GND,OUT 接数字脚 D8。为了配合程序逻辑,建议把跳线拨到 H 挡(多重触发),延时电位器逆时针旋到底(约 3 秒附近的最短档),灵敏度不确定就先放中间。

HC-SR501与Arduino Uno接线图

代码逻辑很简单:循环读 D8 的电平,变高就点亮板载 LED 并在串口打一行提示;回到低电平时再打一行"Motion ended"。下面这份示例代码逐字符照搬自底稿页,引脚号和注释都未改动:

int ledPin = 13;                // choose the pin for the LED
int inputPin = 8;               // choose the input pin (for PIR sensor)
int pirState = LOW;             // we start, assuming no motion detected
int val = 0;                    // variable for reading the pin status

void setup() {
  pinMode(ledPin, OUTPUT);      // declare LED as output
  pinMode(inputPin, INPUT);     // declare sensor as input

  Serial.begin(9600);
}

void loop(){
  val = digitalRead(inputPin);  // read input value

  if (val == HIGH)        // check if the input is HIGH
  {
    digitalWrite(ledPin, HIGH);  // turn LED ON

    if (pirState == LOW)
        {
      Serial.println("Motion detected!");        // print on output change
      pirState = HIGH;
    }
  }
  else
  {
    digitalWrite(ledPin, LOW); // turn LED OFF

    if (pirState == HIGH)
        {
      Serial.println("Motion ended!");        // print on output change
      pirState = LOW;
    }
  }
}

烧录后打开串口监视器(9600 波特率),手掌在传感头上方挥过,应能看到 Motion detected 和 Motion ended 交替出现。想做成感应灯常亮的版本,把 LED 换成继电器模块、跳线保持 H 挡即可;注意继电器线圈电流较大,别直接从 Arduino 的 5V 引脚取电,单独供电更稳妥。

最后提一句选型判断:HC-SR501 只会告诉你"有温热物体在动",分不清人还是宠物,也测不了静止的人。需要辨方向、测距离就得换毫米波或双 PIR 方案;但对楼道灯、入侵提醒、机器人避障辅助这类"动了就响应"的需求,它便宜、省电、接线简单,性价比至今没对手。


作者:电机传感器师
链接:https://www.aiddithome.com/p/4a4cc4e7cb140.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
5条评论
阿伟不emo
1楼 · 12分钟前

这个模块我去年买过一批,最坑的就是上电预热那一段,头一回用的时候以为买到了坏货,通电一分钟一直乱触发。文里提醒得对,等它安静下来再测就正常了。

老张装机
2楼 · 12分钟前

H/L 跳线那段讲得清楚,以前一直没搞明白 L 挡为啥会漏动作,原来是延时窗口里的移动被整段无视了。

触底反弹的Tony
3楼 · 12分钟前

楼道灯选 L 还是 H?

电烙铁爱好者
4楼 · 12分钟前

请教一下,OUT 是 3.3V 电平,接 ESP32 是不是可以不用分压直接读?

拆机党
5楼 · 12分钟前

220Ω 那个细节赞一个,见过有人不串电阻直接把 LED 接 OUT 上,亮是亮,就是心疼模块。