人体红外传感器

原理简介

人体红外传感器(PIR,常见 HC-SR501)检测人或动物发出的红外线,有移动就输出高电平。

  • 工作原理:透镜把人体红外聚到探头,有移动热源时 OUT 变高电平(约 3.3V)
  • 输出电平:HC-SR501 的 OUT 是 3.3V 逻辑电平,和 Pico GPIO 兼容,可直接连
  • 接口:GPIO 数字输入(只读)
  • 模块上有:1 个触发模式跳线帽 + 2 个电位器(延时、灵敏度)

典型应用

  • 安防报警
  • 自动感应灯
  • 自动门控制
  • 人体计数器
  • 智能家居

接线图

[接线图占位,后续添加]

文字说明(具体接法见下方代码注释):

  • HC-SR501 VCC → Pico 5V(VBUS,模块标称 4.5–20V;部分模块也支持 3.3V)
  • HC-SR501 GND → Pico GND
  • HC-SR501 OUT → Pico GP15(3.3V 电平,可直接连 GPIO,不用分压)

示例代码

基础示例:人体检测

# ============ 接线 ============
# HC-SR501 VCC → Pico 5V(VBUS)
# HC-SR501 GND → Pico GND
# HC-SR501 OUT → Pico GP15(3.3V 输出,直接连,不用分压)
# 板载 LED 在 GP25,检测到人时点亮
# =============================
from machine import Pin
import time

pir = Pin(15, Pin.IN)
led = Pin(25, Pin.OUT)

print('人体红外传感器测试')
print('检测到人体时 LED 会点亮')

while True:
    if pir.value() == 1:        # 检测到移动热源
        print('检测到人体!')
        led.on()
        time.sleep(5)           # 保持点亮一会儿
    else:
        led.off()
    time.sleep(0.1)

进阶示例:带计数功能

# ============ 接线 ============
# HC-SR501 VCC → 5V,GND → GND,OUT → GP15(3.3V 直连)
# =============================
from machine import Pin
import time

pir = Pin(15, Pin.IN)
led = Pin(25, Pin.OUT)

count = 0
last_state = 0

print('人体计数器')

while True:
    current_state = pir.value()
    if current_state != last_state:        # 状态发生变化才算一次
        if current_state == 1:
            count += 1
            print(f'检测到人体,累计: {count} 次')
            led.on()
        else:
            led.off()
    last_state = current_state
    time.sleep(0.1)

应用示例:自动感应灯(继电器模块)

# ============ 接线 ============
# HC-SR501 VCC → 5V,GND → GND,OUT → GP15(3.3V 直连)
# 继电器模块(已带驱动,GPIO 只给信号,灯强电由模块隔离):
#   继电器模块 IN  → Pico GP14
#   继电器模块 VCC → Pico 3V3
#   继电器模块 GND → Pico GND
#   继电器模块 COM/NO 接灯和电源(别碰强电)
# =============================
from machine import Pin
import time

pir = Pin(15, Pin.IN)
relay = Pin(14, Pin.OUT)     # 继电器模块信号脚

LIGHT_DURATION = 60          # 灯亮持续时间(秒)

print('自动感应灯')

last_detection = 0

while True:
    if pir.value() == 1:
        print('检测到人体,开灯')
        relay.on()
        last_detection = time.time()

    # 超过设定时间且仍开着,就关灯
    if relay.value() == 1 and time.time() - last_detection > LIGHT_DURATION:
        print('超时,关灯')
        relay.off()

    time.sleep(0.5)

注意事项

  • OUT 直接连:HC-SR501 输出是 3.3V 电平,OUT 直接接 GPIO 即可,不用分压也不用上拉
  • 触发模式跳线帽:
    • H(可重复触发 / Retrigger):人在范围内持续移动,OUT 会一直保持高,灯常亮
    • L(不可重复触发 / Single):一次触发后固定亮一段时间(由延时电位器定),期间再动也不延长
    • 做感应灯一般用 H,做计数/单次报警用 L
  • 两个电位器:
    • TX(延时):调一次触发后高电平持续多久(约 0.3 秒~5 分钟)
    • SX(灵敏度):调检测距离远近(顺时针更远)
  • 上电预热:刚通电会先「乱跳」几十秒自检,属正常,等稳定再用
  • 误触发:阳光直射、正对空调/暖气出风口、宠物经过都可能误报,安装时避开
  • 强电隔离:控制灯/电器走继电器模块,强电部分手别碰

常见问题

Q: 传感器一直输出高 / 灯一直亮? A: 看跳线帽是不是在 H 且现场一直有热源;或灵敏度(SX)调太高。改成 L 模式或调低灵敏度试试。

Q: 完全检测不到人? A: 查 VCC/GND/OUT 有没有接反,OUT 是否真到 GP15;灵敏度调高、避开遮挡,并等上电预热结束。

Q: 刚一通电就乱报? A: 这是 HC-SR501 上电自检(几十秒),正常;等它稳定后再测试即可,不用修代码。