跑跑啦航模

树莓派连接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温湿度传感器》