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.GPIOgpiozero。我个人更推荐 RPi.GPIO,因为它更底层,控制更精细。不过 gpiozero 封装得更好,适合快速开发。

咱们这次用 RPi.GPIO,因为后面要自己写时序,它更灵活。

安装步骤

  1. 打开树莓派的终端(或者 SSH 连上去)
  2. 先更新一下包列表:sudo apt update
  3. 安装 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 而已。别急,一步步来。