DHT11温湿度传感器(配合树莓派使用)

这篇具有很好参考价值的文章主要介绍了DHT11温湿度传感器(配合树莓派使用)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DHT11温湿度传感器(配合树莓派使用)

传感器基本介绍以及参数

基本介绍以及接口

DHT11是一种数字温湿度传感器,可以测量周围环境的温度和相对湿度。该传感器使用单个数字信号线与微控制器通信,具有较高的可靠性和稳定性。它适用于许多应用领域,如气象观测、室内环境监测、工业控制等。

DHT11传感器使用的基本原理是通过感应元件测量周围环境的温度和湿度,并将这些值转换成数字信号。该传感器包括一个感应元件和一个数字信号处理芯片,具有较高的抗干扰性和稳定性。在测量时,传感器通过单个数字信号线向微控制器发送数据,包括温度和湿度值,以及校验和等信息。

DHT11传感器的优点是价格低廉,使用方便,同时具有较高的精度和稳定性。

DHT11温湿度传感器(配合树莓派使用)

需要注意的是,上图所购买的DHT11传感器是自带电阻的,如果买的是没有电阻的传感器(如下图所示),就需要在DHT11传感器的信号线(DATA)上,需要加入一个4.7K ~ 10K欧姆的上拉电阻。这个电阻的作用是将传感器的信号线拉高,以确保在没有数据传输时,信号线的电平为高电平。如果不加上拉电阻,传感器的信号线可能会漂移,导致数据传输错误。(注:3号NC引脚悬空即可,什么都不接)

DHT11温湿度传感器(配合树莓派使用)DHT11温湿度传感器(配合树莓派使用)

工作过程(大概理解即可,后面配合程序可以更好理解)

DHT11传感器的工作过程可以分为三个阶段:启动、数据传输和结束。

  1. 启动阶段

当微控制器需要获取DHT11传感器的温湿度数据时,它会向传感器发送一个启动信号。启动信号包括一个低电平信号,持续时间至少18毫秒,然后再发送一个高电平信号,持续时间为20至40微秒。这个过程称为启动阶段,目的是唤醒传感器,并准备开始数据传输。

  1. 数据传输阶段

在启动阶段结束后,DHT11传感器会向微控制器发送40位的数据,其中包括16位的湿度数据、16位的温度数据和8位的校验和。每一位数据都是通过连续的50微秒的高电平或低电平来表示的。

具体地说,湿度和温度数据的高位先传输,低位后传输,每一位数据的高电平时间表示"1",低电平时间表示"0",数据总共需要传输40位。

传输数据过程中,如果传输的数据出现错误,传感器会重新发送数据,直到正确接收为止。在传输完成后,微控制器会对数据进行校验和验证,确保数据的准确性。

  1. 结束阶段

当数据传输完成后,传感器会将信号线拉高,以结束本次数据传输。此时,微控制器可以继续发送启动信号,以获取传感器的下一次温湿度数据。

总体来说,DHT11传感器通过感应元件和数字信号处理芯片测量温湿度,然后将数据转换成数字信号传输给微控制器。它的工作过程比较简单,但需要注意一些细节,如启动信号的发送、数据传输的顺序和校验和的验证等。

一张图概括:

DHT11温湿度传感器(配合树莓派使用)

树莓派上使用Python编程读取传感器数据

DHT11和树莓派的连接

关于树莓派的基本介绍和环境搭建,可以看上一篇: https://blog.csdn.net/HeX_Maker/article/details/130050637

树莓派上的各个引脚和接口非常简单,看下面两张图就够了:

DHT11温湿度传感器(配合树莓派使用)DHT11温湿度传感器(配合树莓派使用)

我在树莓派上同时连接了三个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()

结果

运行结果如下图所示:

DHT11温湿度传感器(配合树莓派使用)

大功告成!文章来源地址https://www.toymoban.com/news/detail-460460.html

到了这里,关于DHT11温湿度传感器(配合树莓派使用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32+DHT11温湿度传感器

    DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次 通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数 部分用于以后扩展,现读出为零.操作流程如下: 一次完整的数据传输为40bit,高位先出。 数据格式:8bit湿度整数数据+8bit湿度小数数据

    2023年04月13日
    浏览(50)
  • STM32--DHT11温湿度传感器

    本文介绍基于STM32F103实现的DHT11温湿度传感器数据采集及显示,完整代码见文末链接 一、DHT11传感器简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期

    2024年02月16日
    浏览(54)
  • STM32—DHT11温湿度传感器

    (1).下图一是DHT11总的时序图。 (2).图二对应图一的左边黑色部分,图三对应图一的绿色部分,图四的左部分图对应图一的红色部分,图四的右部分对应图一的黄色部分。 (3).首先图二部分是单片机向DHT11发送我要开始的信号,此时单片机IO口处于输出模式,输出低电平至少18MS,

    2024年02月19日
    浏览(56)
  • FPGA—DHT11数字温湿度传感器

    目录 1. 理论学习 2.实操 2.1 顶层模块 2.1.1 整体模块框图 2.1.2 顶层代码 2.2 DHT11 控制模块 2.2.1 模块框图 2.2.2 状态转换图绘制 2.2.3 波形图绘制 2.2.4 RTL代码 2.3 上板验证 3. 总结 DHT11简介        DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应

    2024年02月06日
    浏览(85)
  • 玩转传感器——DHT11温湿度传感器(STM32版)

    DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产

    2024年02月03日
    浏览(46)
  • FPGA读取DHT11数字温湿度传感器

    最近在做一个DHT11相关的东西,写了一个DHT11控制模块。参考了正点原子和野火电子的文档资料后总觉得又乱又杂,所以自己跟着数据手册写了一遍,当然了也很感谢正点原子和野火文档的帮助。 DHT11是一种数字温湿度传感器,有4个引脚但只有三个有效引脚,分别是VDD,DATA和

    2024年02月05日
    浏览(50)
  • 51单片机(DHT11温湿度传感器)

    DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用领域:暖通 空调;汽车;消费品;气象站;湿度调节器;除湿器;家电;医疗;自动控制 相对湿度和温度测量 全部校准,数字输出 长期稳定性 超长的信号传输距离:20米 超低能耗:休眠 4 引脚

    2024年02月02日
    浏览(68)
  • stm32读取DHT11温湿度传感器

    我们知道DHT11是单总线协议,只有一根数据线。 且内部有个上拉电路(下图)。那么数据线默认就是高电平那接下来就可以讲解主机如何和DHT11通讯的 读取DHT11的芯片手册,可以知道,DHT11一次完成的数据输出是40bit,高位先出。 格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温

    2024年02月09日
    浏览(49)
  • FPGA project : dht11 温湿度传感器

    没有硬件,过几天上板测试。        其他模块都是之前的,就不发了。    

    2024年02月08日
    浏览(57)
  • stm32连接DHT11温湿度传感器

    目录 1. DHT11简介 1.1. 连接电路  1.2. 串行接口 (单线双向)  2. cubeMX设置 3. 代码开发  3.1. 实现定时函数 3.2. 打开串口调试 3.4. 测试代码实现 4. 运行效果 信息如下: 建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使 用合适的上拉电阻  DHT11的供电电压为 3-5

    2023年04月16日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包