Sensors
Raspberry Pi 5 supports a variety of sensors to extend its capabilities. This document provides an overview of how to connect and read common sensors.
DHT22 温湿度传感器
DHT22 是常见的温湿度传感器,适合直接连接到树莓派的 GPIO 引脚。推荐接线如下:
- VCC 接 3.3V(引脚 1)
- GND 接 GND(引脚 6)
- DATA 接 GPIO4(引脚 7)
- 在 VCC 与 DATA 之间串联一个 4.7k~10kΩ 的上拉电阻
使用 Adafruit_DHT
库可以读取温度和湿度,示例代码如下:
import Adafruit_DHT
sensor = Adafruit_DHT.DHT22
pin = 4 # DATA 对应的 BCM 编号
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
print(f"Temp: {temperature:.1f}°C Humidity: {humidity:.1f}%")
else:
print("Sensor failure. Check wiring.")
更多高级用法可以参考外部仓库 pi5-dht22-tools。
HC-SR04 超声波测距模块
HC-SR04 用于测量距离,需要 TRIG 与 ECHO 两个控制引脚,推荐接线如下:
- VCC 接 5V(引脚 2 或 4)
- GND 接 GND(引脚 6)
- TRIG 接 GPIO23(引脚 16)
- ECHO 经电阻分压后接 GPIO24(引脚 18)
下面是基于 lgpio
的示例代码:
import lgpio
import time
TRIG = 23
ECHO = 24
# 打开第 0 号 gpiochip
h = lgpio.gpiochip_open(0)
lgpio.gpio_claim_output(h, TRIG)
lgpio.gpio_claim_input(h, ECHO)
def read_distance():
lgpio.gpio_write(h, TRIG, 0)
time.sleep(0.05)
lgpio.gpio_write(h, TRIG, 1)
time.sleep(0.00001)
lgpio.gpio_write(h, TRIG, 0)
while lgpio.gpio_read(h, ECHO) == 0:
start = time.time()
while lgpio.gpio_read(h, ECHO) == 1:
end = time.time()
duration = end - start
distance = duration * 17150
return distance
try:
while True:
dist = read_distance()
print(f"Distance: {dist:.2f} cm")
time.sleep(1)
except KeyboardInterrupt:
lgpio.gpiochip_close(h)
更多脚本与说明请参考 pi5-ultrasonic-tools,该仓库已改用 lgpio
实现。
有关树莓派常用的 ADC 模块与接线方法,请参阅新增的 模数转换器 页面。
光敏电阻(数字检测)
如果暂时没有 ADC 模块,可以将光敏电阻当作二值开关使用。将传感器一端接 3.3V,另一端接到 GPIO17,并在程序中启用下拉电阻。亮度高时电压被拉高,读取到逻辑 1;亮度低时下拉电阻使其变为逻辑 0。以下示例使用 lgpio
读取电平:
import lgpio
import time
LDR_PIN = 17
# 打开第 0 号 gpiochip
h = lgpio.gpiochip_open(0)
lgpio.gpio_claim_input(h, LDR_PIN, lgpio.SET_BIAS_PULL_DOWN)
try:
while True:
if lgpio.gpio_read(h, LDR_PIN):
print("Bright")
else:
print("Dark")
time.sleep(1)
except KeyboardInterrupt:
lgpio.gpiochip_close(h)
这种方法只能粗略地区分明暗,但足以在没有模数转换器的情况下测试光敏电阻。
更多脚本与说明请参考 pi5-photoresistor-tools。
声音传感器 (KY-038)
KY-038 或 KY-037 等声音传感器可侦测环境中的噪音强度,通常同时提供模拟 (A0) 与数字 (D0) 输出。如果只需判断是否有较大的声音,可直接读取 D0;若要量化声音幅度,则需将 A0 接至 MCP3008 等 ADC 模块。
接线示例
- VCC 接 3.3V
- GND 接 GND
- A0 接 MCP3008 的 CH0
- D0 可接任意 GPIO,用于阈值触发 (可选)
示例代码
from gpiozero import SoundSensor
mic = SoundSensor(channel=0) # 读取 MCP3008 通道 0 的模拟值
while True:
mic.wait_for_sound()
print("Sound detected!")
上述示例在声音达到阈值时打印提示,可通过 threshold
属性调整灵敏度。
更多脚本与说明请参考 pi5-soundsensor-tools。
D0 数字输出示例
如果没有 ADC,仅需侦测是否出现噪音,可直接读取模块的 D0 引脚:
import lgpio
import time
MIC_PIN = 17 # D0 所连接的 BCM 编号
# 打开第 0 号 gpiochip,并声明输入
h = lgpio.gpiochip_open(0)
lgpio.gpio_claim_input(h, MIC_PIN)
try:
while True:
if lgpio.gpio_read(h, MIC_PIN):
print("Noise detected!")
time.sleep(0.1)
except KeyboardInterrupt:
lgpio.gpiochip_close(h)
HS-SR501 PIR 红外感应模块
被动红外传感器(PIR)可侦测人体或动物移动,HS-SR501 是常见的廉价模块。 模块上通常带有调整延时与灵敏度的电位计,OUT 引脚在检测到移动时输出高电平。
接线示例
- VCC 接 5V(引脚 2 或 4)
- GND 接 GND(引脚 6)
- OUT 接 GPIO17(引脚 11)
输出为 3.3V 兼容逻辑电平,因此可直接连接至树莓派 GPIO。
SENS 与 TIME 调校要点
旋钮可视作在调节“门卫的警觉程度”与“报警后的冷却时间”。
SENS:调节警觉程度
SENS
实际上控制比较器阈值。顺时针阈值降低、灵敏度提升,能感应更远但更易受环境干扰;逆时针阈值升高,可减少误报,但过低时可能漏报远处或轻微的动作。
旋钮位置 | 阈值 | 检测距离 | 常见表现 | 精度特点 |
---|---|---|---|---|
顺时针极限 | 最低阈值 | 最远 | 远处轻微动作即触发 | 捕捉率高但误报增多 |
中间位置 | 中等阈值 | 中等 | 日常走动可靠触发 | 捕捉率和误报较平衡 |
逆时针极限 | 最高阈值 | 最近 | 只有非常靠近、明显的动作才触发 | 误报极少但容易漏报 |
- 室内小空间(玄关、书房等)可适当降低灵敏度,避免频繁误触;
- 开阔走廊、车库或庭院可提高灵敏度,以扩大监测范围。
TIME:冷却/锁存时间
TIME
决定触发后 OUT 引脚保持高电平的时长。该期间模块不会再次触发。- 时间越长,报警次数减少;时间越短,可更快响应下一次动作。
TIME 位置 | 锁存时间 | 应用场景示例 | 特点 |
---|---|---|---|
顺时针最高档 | 约 5 分钟 | 长时间有人活动但无需重复提醒 | 减少重复触发 |
中间位置 | 约 30 秒~1 分钟 | 门口或客厅有人来回走动 | 平衡检测频率与干扰 |
逆时针最低档 | 约 2~3 秒 | 对快速移动非常敏感的场合 | 捕捉高频动作 |
建议从两枚旋钮的中间位置开始,根据误报或漏报情况逐步微调,并记录测试结果以找到最合适的组合。
示例代码
import lgpio
import time
PIR_PIN = 17
h = lgpio.gpiochip_open(0)
lgpio.gpio_claim_input(h, PIR_PIN)
try:
while True:
if lgpio.gpio_read(h, PIR_PIN):
print("Motion detected!")
time.sleep(0.5)
except KeyboardInterrupt:
lgpio.gpiochip_close(h)
更多示例脚本与说明请参阅 pi5-hs-sr501--tools。