DHT11温湿度传感器的树莓派3 python3驱动代码

时间:2022-07-20 04:36:02

DHT11是很常见的温湿度传感模块,但是貌似没有找到比较好的树莓派python驱动代码,于是自己对照手册写了一个。
基于python3,可以直接用。

#!/usr/bin/env python3

import time
import RPi.GPIO as gpio
import numpy as np

'''
获取温湿度和校验结果。
硬件连接方式:将树莓派的11脚(GPIO17)、12脚(GPIO18)连接在一起,接在DHT11模块的data脚上。(这个连接也很容易,就是要牺牲一根杜邦线)
humidity:湿度
tempture:温度
chk:校验结果
'''

def get_t_and_h():
# 为了保证读取的时序完整,用了两个IO口
ch_in = 17 # 边沿触发读取IO口
ch_out = 18 # 初始化信号发送IO口
t_last = 0
time_diffs = [] # 保存两次下降沿之间的时间差
data = [] # 收到的二进制数据

# IO设置
gpio.setmode(gpio.BCM) # 设置IO模式
gpio.setwarnings(False)
gpio.setup(ch_in, gpio.IN) # 设置输入端口

'''
边沿触发时的回调函数,保存上次下降沿到本次下降沿之间的时间差
'''

def record_time(ch):
nonlocal time_diffs, t_last
t = time.time() # 单位是秒,精度是一微秒
time_diffs.append(t - t_last)
t_last = t
gpio.add_event_detect(ch_in, gpio.FALLING, callback=record_time) # 给IO添加监听器

# 初始化信号发送过程
gpio.setup(ch_out, gpio.OUT, initial=gpio.HIGH)
time.sleep(0.02)
gpio.output(ch_out, gpio.LOW)
time.sleep(0.02)
gpio.output(ch_out, gpio.HIGH)
gpio.setup(ch_out, gpio.IN) # 发送完后得把输出模式换成输入模式,不然信号线上电平始终被拉高
time.sleep(0.1) # 休眠0.1秒等到信号读取完成

length = len(time_diffs)
# 判断一下读取到的数据数量是否正确,错误的话做一下处理
if length != 43:
humidity = 0
tempture = 0
chk = False
else:
data_end = length
data_start = data_end - 40
# 信号值判决, 根据时间差长短不同,大于85微秒即为1,否则为0
for t in time_diffs[data_start:data_end]:
data.append(1 if t > 0.000085 else 0)

# 利用numpy的矩阵乘法,计算出湿度、温度
m = np.array([128, 64, 32, 16, 8, 4, 2, 1])
data = np.array(data)
humidity = m.dot(data[0:8])
tempture = m.dot(data[16:24])
chk = True if m.dot(data[32:40]) == humidity + tempture else False # 检验校验和是否相等

return tempture, humidity, chk

if __name__ == "__main__":
print(get_t_and_h())

硬件连接好之后是这样子的:
这样可以看到两个IO连接在一起
DHT11温湿度传感器的树莓派3 python3驱动代码
这样看可以看清楚插在那个IO上
DHT11温湿度传感器的树莓派3 python3驱动代码
旁边那个小模块是用来根据CPU温度控制风扇转速的~下次再介绍~