4. 读取PIR传感器信号:数字读取与人体移动检测

上一章我们把PIR传感器硬件接好了,通上电,LED也亮了。但说实话,那只是验证了电路通不通。真正的「人来灯亮」逻辑,得靠程序去读传感器的状态。

这一章我们就来干这件事——用Arduino读取PIR传感器的数字信号,通过串口监视器看数据变化,最终实现检测人体移动。

4.1 数字读取是什么?

PIR传感器输出的是数字信号,不是模拟信号。说白了,它只有两种状态:高电平(HIGH)和低电平(LOW)。有人移动时输出HIGH,没人时输出LOW。

Arduino读取这种信号,用的就是digitalRead()函数。这个函数会返回引脚当前的电压状态——5V就是HIGH,0V就是LOW。

核心概念:数字信号只有0和1,没有中间值。PIR传感器内部已经帮你把红外变化量转换成了开关信号。

我在项目中遇到过有人用analogRead()去读PIR,结果读回来一堆乱跳的数字,还以为传感器坏了。其实PIR输出就是数字量,别搞混了。

4.2 第一个读取程序

我们先写一个最简单的程序,把PIR的状态打印到串口监视器上。

// PIR传感器数字读取示例
// 引脚定义
const int pirPin = 2;     // PIR信号线接在D2
const int ledPin = 13;    // 板载LED,用来指示状态

void setup() {
  Serial.begin(9600);     // 初始化串口,波特率9600
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  
  Serial.println("PIR传感器初始化完成,等待检测...");
  delay(2000);            // 给传感器2秒稳定时间
}

void loop() {
  int pirState = digitalRead(pirPin);  // 读取PIR状态
  
  if (pirState == HIGH) {
    digitalWrite(ledPin, HIGH);
    Serial.println("检测到人体移动!");
  } else {
    digitalWrite(ledPin, LOW);
    Serial.println("无人移动");
  }
  
  delay(200);  // 每200毫秒读一次,别太快
}

这段代码逻辑很简单:循环里不断读PIR引脚,有人就亮灯并打印消息,没人就灭灯。

我的习惯:每次初始化PIR后,我都会加一个2秒的delay。因为PIR传感器上电后需要一段稳定时间,否则前几秒会乱报。这个坑我踩过,后来看数据手册才明白。

4.3 串口监视器怎么看数据?

把程序烧录进Arduino后,打开IDE右上角的「串口监视器」(Serial Monitor)。确保右下角的波特率选的是9600,跟程序里一致。

你会看到这样的输出:

PIR传感器初始化完成,等待检测...
无人移动
无人移动
无人移动
检测到人体移动!
检测到人体移动!
无人移动
无人移动
检测到人体移动!
...

用手在传感器前面晃一下,消息就会变成「检测到人体移动!」。手停下来几秒后,又变回「无人移动」。

为什么会这样?因为PIR检测的是变化,不是静态存在。你站在它面前不动,它认为没人。你动一下,它才触发。

注意:串口监视器里的数据是实时刷新的。如果数据不更新,检查三件事:1)波特率是否匹配;2)串口是否选对了端口;3)PIR的跳线帽是否在「可重复触发」模式。

4.4 数据背后的原理

你可能注意到了,PIR触发后不会立刻变回LOW。它会保持HIGH一段时间,这个时间由传感器上的电位器调节。默认一般是2-3秒。

我整理了一个表格,帮你理解PIR输出的时间特性:

参数 典型值 说明
触发保持时间 2-3秒 检测到移动后,输出保持HIGH的时间
触发间隔 0.5-1秒 两次触发之间的最小间隔
稳定时间 30-60秒 上电后传感器自校准的时间
检测距离 3-7米 取决于透镜和灵敏度调节

嗯,这里要注意:稳定时间指的是传感器刚上电那会儿。如果你把程序烧进去立刻测试,可能会发现它乱报。等个半分钟就好了。

4.5 检测人体移动的核心逻辑

现在你已经能读到数据了。但「检测人体移动」这件事,在实际项目中需要处理几个细节:

  1. 去抖动:PIR输出偶尔会有毛刺,尤其是电源不稳定的时候。可以在代码里加一个简单的滤波——连续读到两次HIGH才认为真的有人。
  2. 触发模式选择:PIR模块上通常有个跳线帽,用来选「可重复触发」还是「不可重复触发」。可重复触发模式下,只要人一直在动,输出就一直保持HIGH。不可重复触发模式下,每次触发只输出一个固定宽度的脉冲。
  3. 检测灵敏度:通过板载电位器调节。顺时针拧到底,灵敏度最高,能检测7-8米。逆时针拧到底,只有1-2米。

实战建议:做「人来灯亮」项目时,我建议用可重复触发模式。这样人一直在房间里走动,灯就不会灭。如果选不可重复触发,人动一下灯亮3秒就灭了,体验很差。

4.6 本章知识体系

下面这张图帮你理清这一章的核心逻辑:

PIR传感器数字读取知识体系 PIR传感器 输出数字信号 (HIGH/LOW) digitalRead() 读取引脚电平状态 串口监视器 查看实时数据 核心逻辑:if (digitalRead(pirPin) == HIGH) → 有人移动 触发保持时间 2-3秒(可调) 触发模式 可重复 / 不可重复 检测灵敏度 3-7米(电位器调节) 记住:PIR检测的是变化,不是静态存在。人不动 = 无人

4.7 常见问题与避坑

最后分享几个我在实际项目中踩过的坑:

  • 传感器不触发:先检查跳线帽是不是松了。我有一回折腾了半小时,结果发现跳线帽掉在桌上了。
  • 一直触发不停:可能是灵敏度调太高了,或者传感器正对着空调出风口、暖气片。PIR对温度变化很敏感,风吹过去也会触发。
  • 串口输出乱码:波特率不匹配。检查Arduino IDE右下角的波特率是不是9600。
  • 上电后前几秒乱报:正常现象。PIR需要30-60秒自校准。程序里加个初始化延时就行。

我的调试习惯:先用串口监视器看原始数据,确认传感器工作正常了,再写控制逻辑。这样出了问题能快速定位是硬件还是软件的问题。