4、传感器数据采集:人体红外传感器(HC-SR501)接线与数据读取。

好,咱们进入实战环节。

前面聊了那么多架构和协议,现在终于要亲手摸一摸传感器了。我个人觉得,HC-SR501 是物联网入门最友好的传感器之一。它便宜、皮实、接线简单,而且效果立竿见影——你一动,它就亮。嗯,今天我们就把它搞定。

4.1 先认识一下这个“小圆球”

HC-SR501 本质上是一个热释电红外传感器。说白了,它能检测人体发出的红外辐射。你想想看,人体温度一般在 36-37°C,会持续向外辐射特定波长的红外线。传感器内部有一个敏感元件,一旦检测到这种辐射的变化,就会输出高电平信号。

我在项目中遇到过一个问题:有客户说传感器老是误报,后来发现是安装位置正对着空调出风口。空调吹出的冷风会引起温度剧烈变化,传感器就以为有人来了。所以,避坑指南第一条——别把它对着热源或风口

4.2 引脚定义与接线

这个传感器有三个引脚,从左到右分别是:

引脚 名称 说明
1 VCC 电源正极,接 5V(注意是 5V,不是 3.3V)
2 OUT 信号输出,高电平表示检测到人
3 GND 电源负极,接地

接线其实很简单。我习惯用杜邦线直接连到 Arduino 或 ESP32 上。具体来说:

  • VCC → 开发板的 5V 引脚
  • GND → 开发板的 GND 引脚
  • OUT → 开发板的数字引脚(比如 D2)
⚠️ 注意: 我曾经有一次接错了,把 VCC 接到了 3.3V 上。虽然传感器也能工作,但检测距离明显缩短,而且偶尔会死机。后来查手册才发现,HC-SR501 的最佳工作电压是 4.5-5V。低于 4V 就可能不稳定。所以,老老实实用 5V。

4.3 两个关键旋钮

传感器背面有两个小小的电位器,用十字螺丝刀可以调节。很多新手会忽略这一步,结果发现传感器要么一直触发,要么完全不触发。

  • 距离调节(Sensitivity): 顺时针拧,检测距离变远(最远约 7 米);逆时针拧,变近(约 3 米)。我个人建议,室内场景调到 4-5 米就够了,太远容易误报。
  • 延时调节(Time Delay): 控制检测到人后,输出高电平持续多久。最短约 0.5 秒,最长约 200 秒。我一般调到 5-10 秒,方便调试。
💡 小技巧: 如果你发现传感器一直输出高电平,大概率是延时旋钮拧到了最大。把它逆时针拧到底,再回拧半圈,通常就能恢复正常。

4.4 数据读取:写代码吧

接线搞定,旋钮调好,接下来就是读数据了。我用 Arduino 来演示,因为它的生态最成熟,代码也最直观。

为什么会选择轮询方式?因为人体红外传感器的输出是简单的数字信号,不需要复杂的协议解析。你想想看,它要么是高电平(有人),要么是低电平(没人),就这么简单。

// HC-SR501 人体红外传感器读取示例
// 作者:你的资深工程师朋友

const int sensorPin = 2;  // 传感器 OUT 引脚接 D2
const int ledPin = 13;    // 板载 LED,用于指示

void setup() {
  pinMode(sensorPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  Serial.println("传感器初始化完成,等待检测...");
}

void loop() {
  int sensorValue = digitalRead(sensorPin);
  
  if (sensorValue == HIGH) {
    digitalWrite(ledPin, HIGH);
    Serial.println("检测到人体移动!");
    // 这里可以触发告警或联动其他设备
  } else {
    digitalWrite(ledPin, LOW);
    // 没有检测到人,保持静默
  }
  
  delay(200);  // 每 200 毫秒读取一次,避免过于频繁
}

代码很简单,对吧?但有几个细节我想强调一下:

  • delay(200) 不是随便写的。 传感器内部有一个锁存机制,检测到人后,输出会保持一段时间(就是你刚才调的那个延时)。如果读取频率太高,反而可能读到重复的触发信号。200 毫秒的间隔,既能及时响应,又不会浪费 CPU。
  • Serial.println 只是调试用。 实际产品中,你肯定不会往串口打印数据。一般会通过 MQTT 或 HTTP 把状态上报到云端。这个我们后面章节会讲。

4.5 避坑指南:我踩过的三个坑

做项目这么多年,HC-SR501 的坑我基本都踩过。分享出来,希望大家少走弯路。

  1. 上电后需要预热。 传感器刚上电的 30-60 秒内,输出可能会乱跳。这不是坏了,是内部敏感元件在稳定。我建议代码里加一个初始化延时,等传感器稳定后再开始读取。
  2. 不要直接驱动继电器。 传感器的 OUT 引脚输出电流很小(微安级),带不动继电器。如果你要控制大功率设备,必须加一个三极管或光耦做隔离驱动。我曾经偷懒直接接继电器,结果烧了一个传感器。
  3. 注意安装高度。 传感器的最佳检测高度是 1.5-2.5 米。装得太低,检测范围会变小;装得太高,容易漏检。我一般装在门框上方 2 米左右的位置,稍微向下倾斜 15 度,效果最好。

4.6 进阶:如何区分“有人”和“无人”的持续状态?

基础版代码只能检测到“有人移动”。但如果人站着不动,传感器会认为“没人”了。为什么?因为热释电传感器只对变化的红外辐射敏感。人静止不动时,辐射没有变化,传感器就输出低电平。

那怎么办?我常用的方法是加一个状态机:

// 改进版:带状态保持的人体检测
bool humanPresent = false;
unsigned long lastTriggerTime = 0;
const unsigned long timeout = 30000;  // 30 秒无人移动则判定为无人

void loop() {
  int sensorValue = digitalRead(sensorPin);
  
  if (sensorValue == HIGH) {
    humanPresent = true;
    lastTriggerTime = millis();
    Serial.println("有人");
  }
  
  // 如果超过 timeout 时间没有新的触发,判定为无人
  if (humanPresent && (millis() - lastTriggerTime > timeout)) {
    humanPresent = false;
    Serial.println("无人");
  }
  
  delay(200);
}

这样,即使人站着不动,只要在 30 秒内有过一次移动,系统就认为房间里还有人。这个 timeout 值可以根据实际场景调整——走廊可以短一点(10 秒),卧室可以长一点(60 秒)。

核心要点总结:

  • HC-SR501 是数字输出,接线只需 VCC、GND、OUT 三根线
  • 背面两个旋钮分别控制检测距离和输出延时
  • 上电后需要 30-60 秒预热,代码里要加初始化延时
  • 基础读取用 digitalRead(),进阶应用需要状态机保持
  • 安装位置避开风口和热源,高度 1.5-2.5 米最佳

好了,这一章的内容就到这里。传感器数据读出来了,下一章我们聊聊怎么把这些数据变成真正的告警——也就是联网上报和联动控制。嗯,那才是物联网真正好玩的地方。