2、传感器数据采集基础:温湿度传感器(DHT22)原理、树莓派GPIO引脚介绍、Python的GPIO库安装
好,咱们正式开始动手了。
这一章,我会带你搞定最核心的一环——怎么让树莓派跟温湿度传感器 DHT22 对上话。说白了,就是让硬件开口说话,把环境里的温度和湿度数据,老老实实交到咱们的 Python 程序手里。
我个人习惯,做任何项目前,先把硬件的脾气摸透。不然代码写得再漂亮,线接错了也是白搭。你想想看,是不是这个理?
2.1 DHT22 传感器的工作原理
DHT22 这玩意儿,在物联网圈子里算是老熟人了。它比它的小弟 DHT11 精度高不少,温度误差 ±0.5°C,湿度误差 ±2% RH,对于咱们的温室监控来说,绰绰有余。
它内部其实挺有意思的:
- 一个电容式湿度感应元件
- 一个 NTC 热敏电阻(测温度用的)
- 一个 8 位单片机,负责把模拟信号转成数字信号
它跟树莓派通信,用的是单总线协议。什么叫单总线?就是只用一根数据线,既发命令又收数据。我刚开始接触时觉得挺神奇,后来发现其实挺折腾的——时序要求特别严。
数据格式(40位):
8位湿度整数 + 8位湿度小数 + 8位温度整数 + 8位温度小数 + 8位校验和
举个例子:收到 0000 0010 1000 1100 0000 0001 0101 1111 1110 1110
湿度 = 0x28 = 40% RH,温度 = 0x01 0x5F = 35.1°C,校验和 = 0xEE = (0x28+0x8C+0x01+0x5F) 的低8位
避坑指南:我曾经遇到过一批 DHT22,读出来的数据偶尔会跳变。排查了半天,发现是数据线太长,干扰太大。后来我把线控制在 20 厘米以内,问题就解决了。所以,线越短越稳。
2.2 树莓派 GPIO 引脚介绍
树莓派的 GPIO(通用输入输出引脚),就是它的「触手」。咱们得知道哪根针是干什么的。
以树莓派 4B 为例,40 个引脚排得密密麻麻。但别慌,咱们只用其中几个:
| 引脚编号(物理) | BCM 编号 | 功能 | 咱们用在哪 |
|---|---|---|---|
| 1 | 3.3V | 电源正极 | 给 DHT22 供电 |
| 6 | GND | 电源地 | 接地 |
| 7 | GPIO 4 | 通用输入输出 | 接 DHT22 数据线 |
这里有个小知识点:BCM 编号 vs 物理编号。物理编号就是引脚在板子上的位置,BCM 编号是 Broadcom 芯片内部定义的。写代码时,我习惯用 BCM 编号,因为更直观。比如 GPIO 4,就是物理引脚 7。
注意:DHT22 的工作电压是 3.3V 到 5.5V。树莓派的 GPIO 是 3.3V 逻辑电平,所以直接接 3.3V 供电就行。千万别接到 5V 上,不然可能会烧掉树莓派的 GPIO 口。嗯,这里要特别小心。
2.3 Python 的 GPIO 库安装
要让 Python 控制 GPIO,得装个库。目前最主流的有两个:RPi.GPIO 和 gpiozero。我个人更推荐 RPi.GPIO,因为它更底层,控制更精细。不过 gpiozero 封装得更好,适合快速开发。
咱们这次用 RPi.GPIO,因为后面要自己写时序,它更灵活。
安装步骤:
- 打开树莓派的终端(或者 SSH 连上去)
- 先更新一下包列表:
sudo apt update - 安装 RPi.GPIO:
sudo apt install python3-rpi.gpio
装完之后,可以验证一下:
python3 -c "import RPi.GPIO as GPIO; print('GPIO 库安装成功!')"
如果没报错,就说明装好了。
小技巧:我建议你顺便装一个 Adafruit_DHT 库,它是专门为 DHT 系列传感器写的。虽然咱们后面会自己写驱动,但拿它做个对比验证,心里更有底。
安装命令:pip3 install Adafruit_DHT
2.4 接线与初步测试
好了,理论讲完了,咱们来点实际的。接线其实很简单:
- DHT22 的 VCC 脚 → 树莓派物理引脚 1(3.3V)
- DHT22 的 GND 脚 → 树莓派物理引脚 6(GND)
- DHT22 的 DATA 脚 → 树莓派物理引脚 7(GPIO 4)
注意,DHT22 的数据脚和 VCC 之间,最好接一个 4.7kΩ 的上拉电阻。我刚开始做的时候没接,结果数据死活读不出来。后来查资料才知道,单总线协议需要上拉电阻来保证空闲时电平稳定。
接好线后,写个简单的测试脚本:
import RPi.GPIO as GPIO
import time
# 设置 GPIO 模式
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN)
# 读取数据(这里只是演示引脚是否正常)
try:
while True:
value = GPIO.input(4)
print(f"引脚状态: {value}")
time.sleep(1)
except KeyboardInterrupt:
GPIO.cleanup()
这个脚本只是看看引脚能不能读到电平变化。如果 DHT22 没发数据,引脚应该是高电平(1)。如果读到 0,说明接线可能有问题。
核心要点总结:
- DHT22 用单总线协议,数据格式固定,校验和很重要
- 树莓派 GPIO 用 BCM 编号更方便,注意 3.3V 逻辑电平
- RPi.GPIO 库是基础,装好后记得验证
- 上拉电阻不能省,线长尽量短
下一章,咱们会真正开始写代码,把 DHT22 的数据读出来。到时候你会发现,理解了原理,写代码其实就是把时序翻译成 Python 而已。别急,一步步来。