DHT11温湿度传感器(配合树莓派使用)
传感器基本介绍以及参数
基本介绍以及接口
DHT11是一种数字温湿度传感器,可以测量周围环境的温度和相对湿度。该传感器使用单个数字信号线与微控制器通信,具有较高的可靠性和稳定性。它适用于许多应用领域,如气象观测、室内环境监测、工业控制等。
DHT11传感器使用的基本原理是通过感应元件测量周围环境的温度和湿度,并将这些值转换成数字信号。该传感器包括一个感应元件和一个数字信号处理芯片,具有较高的抗干扰性和稳定性。在测量时,传感器通过单个数字信号线向微控制器发送数据,包括温度和湿度值,以及校验和等信息。
DHT11传感器的优点是价格低廉,使用方便,同时具有较高的精度和稳定性。
需要注意的是,上图所购买的DHT11传感器是自带电阻的,如果买的是没有电阻的传感器(如下图所示),就需要在DHT11传感器的信号线(DATA)上,需要加入一个4.7K ~ 10K欧姆的上拉电阻。这个电阻的作用是将传感器的信号线拉高,以确保在没有数据传输时,信号线的电平为高电平。如果不加上拉电阻,传感器的信号线可能会漂移,导致数据传输错误。(注:3号NC引脚悬空即可,什么都不接)
工作过程(大概理解即可,后面配合程序可以更好理解)
DHT11传感器的工作过程可以分为三个阶段:启动、数据传输和结束。
- 启动阶段
当微控制器需要获取DHT11传感器的温湿度数据时,它会向传感器发送一个启动信号。启动信号包括一个低电平信号,持续时间至少18毫秒,然后再发送一个高电平信号,持续时间为20至40微秒。这个过程称为启动阶段,目的是唤醒传感器,并准备开始数据传输。
- 数据传输阶段
在启动阶段结束后,DHT11传感器会向微控制器发送40位的数据,其中包括16位的湿度数据、16位的温度数据和8位的校验和。每一位数据都是通过连续的50微秒的高电平或低电平来表示的。
具体地说,湿度和温度数据的高位先传输,低位后传输,每一位数据的高电平时间表示"1",低电平时间表示"0",数据总共需要传输40位。
传输数据过程中,如果传输的数据出现错误,传感器会重新发送数据,直到正确接收为止。在传输完成后,微控制器会对数据进行校验和验证,确保数据的准确性。
- 结束阶段
当数据传输完成后,传感器会将信号线拉高,以结束本次数据传输。此时,微控制器可以继续发送启动信号,以获取传感器的下一次温湿度数据。
总体来说,DHT11传感器通过感应元件和数字信号处理芯片测量温湿度,然后将数据转换成数字信号传输给微控制器。它的工作过程比较简单,但需要注意一些细节,如启动信号的发送、数据传输的顺序和校验和的验证等。
一张图概括:
树莓派上使用Python编程读取传感器数据
DHT11和树莓派的连接
关于树莓派的基本介绍和环境搭建,可以看上一篇: https://blog.csdn.net/HeX_Maker/article/details/130050637
树莓派上的各个引脚和接口非常简单,看下面两张图就够了:
我在树莓派上同时连接了三个DHT11传感器,分别用的17 22 27三个GPIO口
Python编程
代码
树莓派中的Python代码如下:
import RPi.GPIO as GPIO
import time
import serial
ser = serial.Serial("/dev/ttyAMA0",9600)
def delayMicrosecond(t):
start,end=0,0
start=time.time()
t=(t-3)/1000000
while end-start<t:
end=time.time()
tmp0=[] # Used to store the read data
tmp1=[]
tmp2=[]
data0 = 17 # DHT11 BCM
data1 = 27
data2 = 22
a,b=0,0
def DHT11_0():
GPIO.setup(data0, GPIO.OUT) # GPIO OUTPUT
GPIO.output(data0,GPIO.HIGH)
delayMicrosecond(10*1000) # delay 10ms
GPIO.output(data0,GPIO.LOW)
delayMicrosecond(25*1000) # delay 25ms
GPIO.output(data0,GPIO.HIGH)
GPIO.setup(data0, GPIO.IN) # GPIO INPUT
a=time.time() # Recording cycle start time
while GPIO.input(data0):
b=time.time() # time the record ended
if (b-a)>0.1: #Determine whether the cycle time exceeds 0.1 seconds to avoid the program from entering an infinite loop and getting stuck
break
a=time.time()
while GPIO.input(data0)==0:
b=time.time()
if (b-a)>0.1:
break
a=time.time()
while GPIO.input(data0):
b=time.time()
if (b-a)>=0.1:
break
for i in range(40):
a=time.time()
while GPIO.input(data0)==0:
b=time.time()
if (b-a)>0.1:
break
delayMicrosecond(28) # delay 28 microseconds
if GPIO.input(data0): # After more than 28 microseconds, it is judged whether it is still at a high level
tmp0.append(1) # Record the received bit as 1
a=time.time()
while GPIO.input(data0): # Loop until the input is low
b=time.time()
if (b-a)>0.1:
break
else:
tmp0.append(0) # Record the received bit as 0
def DHT11_1():
GPIO.setup(data1, GPIO.OUT)
GPIO.output(data1,GPIO.HIGH)
delayMicrosecond(10*1000)
GPIO.output(data1,GPIO.LOW)
delayMicrosecond(25*1000)
GPIO.output(data1,GPIO.HIGH)
GPIO.setup(data1, GPIO.IN)
a=time.time()
while GPIO.input(data1):
b=time.time()
if (b-a)>0.1:
break
a=time.time()
while GPIO.input(data1)==0:
b=time.time()
if (b-a)>0.1:
break
a=time.time()
while GPIO.input(data1):
b=time.time()
if (b-a)>=0.1:
break
for i in range(40):
a=time.time()
while GPIO.input(data1)==0:
b=time.time()
if (b-a)>0.1:
break
delayMicrosecond(28)
if GPIO.input(data1):
tmp1.append(1)
a=time.time()
while GPIO.input(data1):
b=time.time()
if (b-a)>0.1:
break
else:
tmp1.append(0)
def DHT11_2():
GPIO.setup(data2, GPIO.OUT)
GPIO.output(data2,GPIO.HIGH)
delayMicrosecond(10*1000)
GPIO.output(data2,GPIO.LOW)
delayMicrosecond(25*1000)
GPIO.output(data2,GPIO.HIGH)
GPIO.setup(data2, GPIO.IN)
a=time.time()
while GPIO.input(data2):
b=time.time()
if (b-a)>0.1:
break
a=time.time()
while GPIO.input(data2)==0:
b=time.time()
if (b-a)>0.1:
break
a=time.time()
while GPIO.input(data2):
b=time.time()
if (b-a)>=0.1:
break
for i in range(40):
a=time.time()
while GPIO.input(data2)==0:
b=time.time()
if (b-a)>0.1:
break
delayMicrosecond(28)
if GPIO.input(data2):
tmp2.append(1)
a=time.time()
while GPIO.input(data2):
b=time.time()
if (b-a)>0.1:
break
else:
tmp2.append(0)
while True:
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
del tmp0[0:] #delete list
del tmp1[0:]
del tmp2[0:]
time.sleep(1) # Delay 1 second
DHT11_0()
DHT11_1()
DHT11_2()
humidity0_bit=tmp0[0:8] # Delimited list, bits 0 to 7 are humidity integer data
humidity0_point_bit=tmp0[8:16]# Humidity Decimals
temperature0_bit=tmp0[16:24] # Integer temperature
temperature0_point_bit=tmp0[24:32] # temperature decimal
check0_bit=tmp0[32:40] # check data
humidity1_bit=tmp1[0:8]
humidity1_point_bit=tmp1[8:16]
temperature1_bit=tmp1[16:24]
temperature1_point_bit=tmp1[24:32]
check1_bit=tmp1[32:40]
humidity2_bit=tmp2[0:8]
humidity2_point_bit=tmp2[8:16]
temperature2_bit=tmp2[16:24]
temperature2_point_bit=tmp2[24:32]
check2_bit=tmp2[32:40]
humidity0_int=0
humidity0_point=0
temperature0_int=0
temperature0_point=0
humidity1_int=0
humidity1_point=0
temperature1_int=0
temperature1_point=0
humidity2_int=0
humidity2_point=0
temperature2_int=0
temperature2_point=0
check0=0
check1=0
check2=0
for i in range(8): # convert binary to decimal
humidity0_int+=humidity0_bit[i]*2**(7-i)
humidity1_int+=humidity1_bit[i]*2**(7-i)
humidity2_int+=humidity2_bit[i]*2**(7-i)
humidity0_point+=humidity0_point_bit[i]*2**(7-i)
humidity1_point+=humidity1_point_bit[i]*2**(7-i)
humidity2_point+=humidity2_point_bit[i]*2**(7-i)
temperature0_int+=temperature0_bit[i]*2**(7-i)
temperature1_int+=temperature1_bit[i]*2**(7-i)
temperature2_int+=temperature2_bit[i]*2**(7-i)
temperature0_point+=temperature0_point_bit[i]*2**(7-i)
temperature1_point+=temperature1_point_bit[i]*2**(7-i)
temperature2_point+=temperature2_point_bit[i]*2**(7-i)
check0+=check0_bit[i]*2**(7-i)
check1+=check1_bit[i]*2**(7-i)
check2+=check2_bit[i]*2**(7-i)
humidity0=humidity0_int+humidity0_point/10
temperature0=temperature0_int+temperature0_point/10
humidity1=humidity1_int+humidity1_point/10
temperature1=temperature1_int+temperature1_point/10
humidity2=humidity2_int+humidity2_point/10
temperature2=temperature2_int+temperature2_point/10
check0_tmp0=humidity0_int+humidity0_point+temperature0_int+temperature0_point
check1_tmp1=humidity1_int+humidity1_point+temperature1_int+temperature1_point
check2_tmp2=humidity2_int+humidity2_point+temperature2_int+temperature2_point
if check0==check0_tmp0 and temperature0!=0 and temperature0!=0 and check1==check1_tmp1 and temperature1!=0 and temperature1!=0 and check2==check2_tmp2 and temperature2!=0 and temperature2!=0 : # Determine if the data is normal
print("Temperature0 is ", temperature0,"C\nHumidity0 is ",humidity0,"%")# Print the temperature and humidity data
print("Temperature1 is ", temperature1,"C\nHumidity1 is ",humidity1,"%")
print("Temperature2 is ", temperature2,"C\nHumidity2 is ",humidity2,"%")
#ser.write(temperature0_int)
temperature00 = str(temperature0)
humidity00 = str(humidity0)
#th00 = temperature00 + ";" + humidity00
#ser.write(th00.encode())
#ser.write(temperature00.encode())
temperature11 = str(temperature1)
humidity11 = str(humidity1)
#th11 = temperature11 + ";" + humidity11
#ser.write(th11.encode())
temperature22 = str(temperature2)
humidity22 = str(humidity2)
th = temperature00 + ";" + humidity00 + ";" + temperature11 + ";" + humidity11 + ";" + temperature22 + ";" + humidity22
ser.write(th.encode())
else:
print("error")
time.sleep(1)
GPIO.cleanup()
结果
运行结果如下图所示:文章来源:https://www.toymoban.com/news/detail-460460.html
大功告成!文章来源地址https://www.toymoban.com/news/detail-460460.html
到了这里,关于DHT11温湿度传感器(配合树莓派使用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!