HC-SR501 是玩 Arduino 最常见的人体红外(PIR)感应模块,探测距离最大 7 米、测角小于 110°,工作电压 4.5~20V,静态电流只有 50μA,属于被动式感应——它靠热释电元件感知人体散发出的红外辐射,自己并不发射红外,既省电又不容易误触发热源。你一到这就想把它和一个 LED 接起来,看人走过就自动亮灯,这篇按实操顺序把接线、调参和代码都捋清楚。
先搞懂 HC-SR501 怎么工作、背面三个件是干嘛的
模块背面有一块球面的菲涅尔透镜,负责把人体的红外辐射聚焦到红外传感器上。翻到背面能看到两个可调电位器和一个跳线帽:一个调灵敏度(感测距离 3~7 米),一个调延时(检测到人后输出保持 3~300 秒);跳线帽放在 H 是重复触发,放在 L 是单次触发。推荐上手阶段把延时拧到最小、跳线帽放 H,这样测试时才不会被一直保持的高电平干扰判断。

HC-SR501 和 Arduino 接线,三根线就够
接线非常简单:模块的 VCC 接 Arduino 的 5V,GND 接 GND,OUT 接数字引脚 2。注意上电后要等 30~60 秒让传感器自校准,期间灯可能会闪几下,这是正常现象,别急着下结论说它坏了。传感器尽量水平安装,因为人体走动大多在水平方向,这样探测最灵敏;同时也别正对着强光、空调风口或暖气片,否则容易误触发。
自动感应亮灯代码,看懂逻辑就能改成你要的
下面这段代码读取 PIR 的 OUT,检测到运动就把板载 13 号 LED 点亮,并在串口打印状态。核心逻辑是:每次循环用 digitalRead 读 OUT,读到高电平就开灯并打印 Motion detected,读到低电平就关灯打印 Motion ended;用 motionState 这个变量保证同一个动作只在状态翻转时打印一次,避免刷屏。
#define pirPin 2
#define ledPin 13
int val=0;
bool motionState=false;
void setup(){ pinMode(ledPin,OUTPUT); pinMode(pirPin,INPUT); Serial.begin(9600);}
void loop(){
val=digitalRead(pirPin);
if(val==HIGH){ digitalWrite(ledPin,HIGH); if(motionState==false){Serial.println("Motion detected!"); motionState=true;}}
else{ digitalWrite(ledPin,LOW); if(motionState==true){Serial.println("Motion ended!"); motionState=false;}}
}进阶:加个蜂鸣器做人体感应报警
把亮灯改成报警很顺手,只需加一个无源蜂鸣器接在 5 号引脚,检测到人就调用一个 alarm 函数用 tone() 让蜂鸣器响一会儿。把它放在门口、走廊或仓库门口,就能当简易防盗报警器用。

接下来能玩什么
再往上走,可以把 LED 换成 5V 继电器去控制更大功率的灯或电风扇,实现人进灯亮、人走灯灭的感应照明;或者把 OUT 接到物联网模块上报状态。传感器本身很皮实,理解了它的延时和触发机制,后续接继电器、蜂鸣器、物联网都不难。
本篇为实操改写整理,动手前记得确认你手上模块的引脚定义,不同批次引脚标注可能略有差异,以实测为准。







亮度再高也测 7 米不夸张,我家客厅从头到尾都能感应到。
求问,接继电器控制电风扇的话,延时旋钮是不是得调大点?
上电等一分钟那步太关键了,我第一次因为没等直接以为传感器是坏的。
我刚焊完蜂鸣器版本,放在门口能当简易防盗,动作多一点别逗它玩哈哈。
这个模块是真的便宜,几块钱就能搞人体感应,新手入门神器。