DHT11数字温湿度传感器是一种含有校准数字信号输出的温湿度复合传感器。虽然不是高效传感器,但价格便宜,连接方便。
1.性能指标和特点:
工作电压范围:3.5V-5.5V
工作电流 :平均 0.5mA
湿度测量范围:20-90%RH
温度测量范围:0-50℃
湿度分辨率 :1%RH 8 位
温度分辨率 :1℃ 8位
采样周期 :1S
2.DHT11 数据结构
DHT11数字湿度传感器采用单总线数据格式。
输入输出双向传输。数据包由5组成Byte(40Bit)组成数据分为小数部分和整数部分
以下描述了体格式。
完整的数据传输为40bit,高位先出。
数据格式:8bit湿度数据 8bit湿度小数据
8bit温度整数据 8bit温度小数据
8bit校验和
前四个字节加上校准和数据。
传感器数据输出未编码的二进制数据。数据(湿度、温度、整数、小数)之间
应单独处理。如果从传感器中读取以下5Byte数据:
byte4 byte3 byte2 byte1 byte0
00101101 00000000 00011100 00000000 01001001
整数 小数 整数 小数 校验和
湿度 温度 校验和
湿度和温度
humi (湿度)= byte4 . byte3=45.0 (%RH)
temp (温度)= byte2 . byte1=28.0 ( ℃)
jiaoyan(校验)= byte4 byte3 byte2 byte1=73(=humi temp)(校准正确)
注意:DHT11最大的通信时间是3ms,建议主机连续采样间隔不小于1000ms。
线路连接
直接用公对公杜邦线连接树莓派:
DHT11的正极( /VCC)连接4号引脚(5)V);数据脚连接18号引脚(BCM 24);负极(-//);GND)连接20号引脚(GND)。*注意不要将正负极反转,模块会烧坏。
编写程序
#导入函数
import RPi.GPIO as GPIO
import time
#定义数据端口
channel = 18
data = []
j = 0
#初始化模式
GPIO.setmode(GPIO.BOARD)
#一秒钟后开始工作
time.sleep(1)
#设置GPIO接口是写入数据模式
GPIO.setup(channel, GPIO.OUT)
#输出低电平信号
GPIO.output(channel, GPIO.LOW)
time.sleep(0.02)
#0.02秒后输出高电平信号,启动模块测量
GPIO.output(channel, GPIO.HIGH)
#设置GPIO读取数据模式的接口
GPIO.setup(channel, http://GPIO.IN)
#等待,获得高电平信号
while GPIO.input(channel) == GPIO.LOW:
continue
#等待,获取低电平信号
while GPIO.input(channel) == GPIO.HIGH:
continue
#获取高底电平信号后,开始读取模块获取数据
while j < 40:
k = 0
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
k =1
if k > 100:
Break
#放入获取数据list中
if k < 20:
data.append(0)
else:
data.append(1)
j =1
#读取模块数据后,打印显示
print ("sensor is working.")
print (data)
#根据获取数据定义分析数据(5组二进制数据)
humidity_bit = data[0:8]
humidity_point_bit = data[8:16]
temperature_bit = data[16:24]
temperature_point_bit = data[24:32]
check_bit = data[32:40]
humidity = 0
humidity_point = 0
temperature = 0
temperature_point = 0
check = 0
#根据公式定义分析温湿度数据
for i in range(8):
humidity =humidity_bit[i] * 2 ** (7-i)
humidity_point =humidity_point_bit[i] * 2 ** (7-i)
temperature =temperature_bit[i] * 2 ** (7-i)
temperature_point =temperature_point_bit[i] * 2 ** (7-i)
check =check_bit[i] * 2 **(7-i)
tmp = humidity humidity_point temperature temperature_point
#打印显示模块数据解释的温湿度数据
if check == tmp:
print ("temperature :", temperature, "*C, humidity :", humidity, "%")
else:
print ("wrong")
print ("temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ",tmp :", tmp)
#结束过程,释放GPIO引脚
GPIO.cleanup()
运行后取得结果。*如果结果异常,试着调整if k < 20: 中的数值
确定硬件连接正常稳定,模块工作错误导致程序卡住。
除了自己编写程序外,还可以使用已编译的库:
使用 Adafruit 读取 DHT11 温湿度传感器
更新软件包
sudo apt-get update
sudo apt-get install build-essential python-dev
从GitHub获取Adafruit库
安装完成后pi新添加的文件夹Adafruit_Python_DHT文件夹,进入文件夹安装库。
cd Adafruit_Python_DHT
sudo python setup.py install
sudo python3 setup.py install
安装完成后进入examples文件夹运行AdfruitDHT.py能得到结果。
cd examples
Python AdafruitDHT.py 11 24
*后两个值11代表使用DHT11模块,24代表着所接的GIPO引脚编号(BCM)。
运行结果:
在其他Python 该库用于程序
参照以下方法介绍Adafruit库,可用 “read_retry” 方法来读取 DHT11 数据:
import Adafruit_DHT
# Set sensor type : Options are DHT11,DHT22 or AM2302
sensor=Adafruit_DHT.DHT11
# Set GPIO sensor is connected to
GPIO=24
# Use read_retry method. This will retry up to 15 times to
# get a sensor reading (waiting 2 seconds between each retry).
humidity, temperature = Adafruit_DHT.read_retry(sensor, GPIO)
# Reading the DHT11 is very sensitive to timings and occasionally
# the Pi might fail to get a valid reading. So check if readings are valid.
print('Temp={0:0.1f}*C Humidity={1:0.1f}%'.format(temperature, humidity))
else:
print('Failed to get reading. Try again!')
END