Skip to content

Arduino - PIR 传感器

被动红外(PIR)传感器对于检测运动至关重要,使其成为安防系统、自动照明和交互式项目的基石。它们检测由温暖物体(例如人类)发出的红外辐射变化。

  • 低功耗: 电池供电应用的理想选择。
  • 成本效益高: 价格低廉且广泛可用。
  • 接口简单: 通常提供简单的HIGH/LOW数字输出。
  • 耐用: 固态设计意味着它们不会磨损。

PIR 传感器通过使用两个热释电子传感器工作。它寻找其中一半传感器检测到的红外线水平与另一半不同的变化,这表明有物体在其视野中移动。请注意,PIR 传感器检测的是红外线的变化,而不是静态存在。如果一个人完全静止不动,传感器最终将停止检测到他们。

大多数PIR传感器模块有两个电位器用于调整:

  • 灵敏度: 调整检测范围(例如,从3到7米)。
  • 延时: 调整检测到运动后输出信号保持HIGH的时间长度(例如,从几秒到几分钟)。

重要提示: 初次上电时,大多数PIR传感器需要30-60秒的预热和校准期。在此期间,它们可能会不可预测地触发。请在传感器稳定时保持区域内没有移动。

  • 1 × Arduino UNO R3 或兼容开发板
  • 1 × PIR 运动传感器 (例如,HC-SR501)
  • 1 × LED (用于视觉反馈)
  • 1 × 220Ω 电阻 (用于LED)
  • 跳线
// PIR 传感器连接
// (引脚标签可能不同,请查阅传感器的数据手册)
PIR VCC Pin --- Arduino 5V
PIR OUT Pin --- Arduino Digital Pin 2
PIR GND Pin --- Arduino GND
// LED 指示灯连接
Arduino D13 --- [220Ω Resistor] --- [LED Anode (+)]
Arduino GND --- [LED Cathode (-)]

这段修订后的代码使用清晰、基于状态的方法来监控PIR传感器。它是非阻塞的,并且易于扩展。

/**
* @文件 modern_pir_sensor.ino
* @简介 一种清晰、基于状态的 PIR 运动传感器读取方法。
* @作者 现代化教程
*/
// 定义引脚,以提高可读性和可维护性。
constexpr int PIR_PIN = 2;
constexpr int LED_PIN = 13;
// 跟踪运动的状态变量。
// 使用枚举使代码更具自解释性。
enum MotionState { NO_MOTION, MOTION_DETECTED };
MotionState currentMotionState = NO_MOTION;
void setup() {
Serial.begin(9600);
while (!Serial); // 等待串口准备就绪(适用于 Leonardo/Micro 等现代开发板)
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
Serial.println("PIR 传感器预热和校准中...");
Serial.println("请保持区域内没有移动30秒。");
delay(30000); // 在 setup() 中使用阻塞延迟进行校准是可接受的。
Serial.println("传感器就绪。");
}
void loop() {
// 读取 PIR 传感器的当前状态。
int pirState = digitalRead(PIR_PIN);
if (pirState == HIGH) {
// 当前正在检测到运动。
digitalWrite(LED_PIN, HIGH); // 点亮指示灯 LED。
// 如果我们之前处于 NO_MOTION 状态,则这是一个新事件。
if (currentMotionState == NO_MOTION) {
Serial.println("运动开始!");
currentMotionState = MOTION_DETECTED; // 更新状态
}
} else {
// 当前未检测到运动。
digitalWrite(LED_PIN, LOW); // 关闭指示灯 LED。
// 如果我们之前处于 MOTION_DETECTED 状态,则事件已结束。
if (currentMotionState == MOTION_DETECTED) {
Serial.println("运动结束。");
currentMotionState = NO_MOTION; // 更新状态
}
}
// loop() 可以在这里继续执行其他任务而不会被阻塞。
}
  • 误触发: 如果传感器在没有运动的情况下触发,请尝试降低灵敏度。附近电器的电气噪声也可能是原因。
  • 未检测到: 确保传感器已完成校准。检查接线并提高灵敏度。请记住,传感器检测的是物体在其视野中横向移动,而不是直接靠近或远离它。
  • 保持HIGH: 延时电位器可能设置到最大值。请将其调整为较短的持续时间进行测试。

既然您能够检测运动,就可以构建令人兴奋的项目:

  • 自动化照明: 控制继电器来切换交流电源供电的灯。
  • 安防警报: 触发蜂鸣器或通过WiFi模块(如ESP8266或ESP32)发送通知。
  • 交互式艺术: 当有人靠近时,将项目从低功耗睡眠模式唤醒。