树莓派连接DHT11温湿度传感器教程
一、DHT11简介
DHT11是一款数字温湿度传感器,内置电阻式感湿元件和NTC测温元件,可同时测量温度和湿度。采用单总线协议通信,数据线只需一根GPIO引脚。
主要规格:
- 湿度检测范围:20-90%RH(±5%精度)
- 温度检测范围:0-50°C(±2°C精度)
- 采样间隔:至少1秒
- 供电电压:3.3V~5V
该厂商不建议读取频率小于2秒,否则数据可能会有误。
二、DHT11外观与引脚说明
DHT11有四个引脚,但其中一个没有被使用到,所以有的模块会简化成3个引脚。

DHT11温湿度传感器实物图——传感器外观
三、硬件接线
DHT11需要在电源和数据脚之间串联一个上拉电阻(4.7KΩ~10KΩ),通常情况下购买的DHT11模块都自带了这个电阻。
接线对照表:
| DHT11引脚 | 功能 | 树莓派GPIO |
|-----------|------|-----------|
| Pin 1 (VCC) | 电源正极 | 3.3V (Pin 1) |
| Pin 2 (DATA) | 数据输出 | GPIO17 (Pin 11) |
| Pin 3 (NC) | 悬空 | — |
| Pin 4 (GND) | 电源负极 | GND (Pin 6或9) |
注意:数据引脚可以根据需要自行修改。

DHT11与树莓派接线示意图
四、软件安装
方法一:使用Adafruit_DHT库(推荐)
Adafruit 提供了简单易用的DHT库,安装步骤如下:
```bash
# 开始之前需要更新软件包
sudo apt-get update
sudo apt-get install build-essential python-dev
# 从GitHub获取Adafruit库
sudo git clone
cd Adafruit_Python_DHT
# 给Python2和Python3安装该库
sudo python setup.py install
sudo python3 setup.py install
```

Adafruit库安装与测试命令行截图
测试示例程序:
```bash
cd ~
cd Adafruit_Python_DHT/examples
python AdafruitDHT.py 11 17
```
两个参数分别表示DHT11和数据引脚所接的树莓派GPIO编号,成功的话会输出:`Temp=22.0* Humidity=68.0%`
方法二:使用gpiozero库(树莓派OS自带)
```python
from gpiozero import DHT11
import time
sensor = DHT11(4)
while True:
if sensor.temperature is not None:
print(f"温度: {sensor.temperature:.1f}°C, 湿度: {sensor.humidity:.1f}%")
else:
print("等待传感器稳定...")
time.sleep(2)
```
方法三:手动读取(理解单总线协议)
```python
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
DHT_PIN = 4
def read_dht11():
GPIO.setup(DHT_PIN, GPIO.OUT)
GPIO.output(DHT_PIN, GPIO.HIGH)
time.sleep(0.05)
GPIO.output(DHT_PIN, GPIO.LOW)
time.sleep(0.018)
GPIO.output(DHT_PIN, GPIO.HIGH)
GPIO.setup(DHT_PIN, GPIO.IN)
# 等待响应信号
while GPIO.input(DHT_PIN) == GPIO.LOW:
pass
while GPIO.input(DHT_PIN) == GPIO.HIGH:
pass
data = []
for i in range(40):
while GPIO.input(DHT_PIN) == GPIO.LOW:
pass
count = 0
while GPIO.input(DHT_PIN) == GPIO.HIGH:
count += 1
if count > 100:
break
data.append(0 if count < 8 else 1)
# 解析数据
humidity = int(''.join(str(b) for b in data[0:8]), 2)
humidity_dec = int(''.join(str(b) for b in data[8:16]), 2)
temperature = int(''.join(str(b) for b in data[16:24]), 2)
temp_dec = int(''.join(str(b) for b in data[24:32]), 2)
checksum = int(''.join(str(b) for b in data[32:40]), 2)
calc = (humidity + humidity_dec + temperature + temp_dec) & 0xFF
if calc == checksum:
return temperature + temp_dec/10, humidity + humidity_dec/10
return None, None
try:
while True:
temp, hum = read_dht11()
if temp:
print(f"温度: {temp}°C, 湿度: {hum}%")
time.sleep(2)
except KeyboardInterrupt:
GPIO.cleanup()
```

DHT11读取程序运行结果——显示温度和湿度数据
五、在Python程序中使用Adafruit库
```python
import Adafruit_DHT
# 传感器类型选择:DHT11、DHT22或AM2302
sensor = Adafruit_DHT.DHT11
gpio = 17 # GPIO引脚号
# read_retry方法会重试最多15次
humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)
if humidity is not None and temperature is not None:
print('Temp={0:0.1f}*C Humidity={1:0.1f}%'.format(temperature, humidity))
else:
print('Failed to get reading. Try again!')
```
六、注意事项
DHT11采样间隔至少1秒,不建议高频读取
接线尽量短,避免干扰
读取时传感器可能返回None,建议添加重试机制
电源注意:绝不能直接从树莓派3.3V取电给大功率设备
如需更高精度,可升级至DHT22(精度±0.5°C,±2%RH)
七、扩展阅读
另外还有DS18B20温度传感器,虽然没有湿度数据,但易用且稳定。可参考Adafruit的树莓派教程:DS18B20温度传感器。

— DHT11温湿度传感器实物图 —

— DHT11接线示意图 —

— 命令行安装与测试 —

— 程序运行结果 —
内容综合自:《使用Adafruit读取DHT11温湿度传感器》

微信联系
淘宝联系