七、CM4树莓派连接DHT11温湿度传感器模块实现温湿度测定

4.DHT11说明书.pdf

DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。

该传感器包含一个电阻湿度感元件和一个NTC温度测量设备。

3个引脚+、-分别接VCC与GND,中间引脚DATA是一条数据线,通过它可以向传感器发送应答信号并返回40位的温湿度数据。

 

供电电压DC:3.3-5.5V
工作范围(温度)-20~+60℃
量程范围(湿度)5~95%RH
温度精度±2℃
湿度精度±5%RH
重复性温度:±1℃ ;湿度:±1%RH
迟滞(温度)±0.3℃
迟滞(湿度)±0.3%RH

 一、接线方式:

二、 引脚说明

pin名称注释
1VDD供电 3-5.5VDC
2DATA串行数据,单总线
3NC空脚
4GND接地,电源负极

 

  1. 首先由树莓派将数据拉高进入空闲状态(IdleState)

  2. 然后再把数据线拉低至少18ms通知DHT11需要进行数据采集(Star MCU),然后放弃总线的控制权

  3. 随后数据线会被DHT11拉高(20-40us),然后DHT11将发送一个80us的低电平与80us的高电平数据开始信号通知树莓派接收数据

  4. 随后将发送40位的0,1脉冲信号

    1. 其中0脉冲包括50us低电平,26us高电平

    2. 而1脉冲由50us低电平与70us的高电平组成

    3. 数据发送完毕之后数据总线被拉长时间拉高,总线又进入空闲模式

 三、树莓派连接实操

引脚图

 

本次连接选用的引脚为:

  1. BCM18 ——>pi 12

  2. VCC5V ——>pi 4

  3. GND GND ——>pi 6

 DHT11连接:

  • 黑线——VCC——面包板-极

  • 白线——GND——面包板+极

  • 红线——DATA——面包板e口

 树莓派连接

  • 黑线——VCC 5V——树莓派Pi4——面包板-极

  • 白线——GND GND——树莓派Pi6——面包板+极

  • 紫线——BCM 18——树莓派Pi12——面包板a口

 树莓派与DHT11合并

 四、测试

测试代码:

import RPi.GPIO as GPIO
import time

#温湿度
def delayMicrosecond(t):    # 微秒级延时函数
    start,end=0,0           # 声明变量
    start=time.time()       # 记录开始时间
    t=(t-3)/1000000     # 将输入t的单位转换为秒,-3是时间补偿
    while end-start<t:  # 循环至时间差值大于或等于设定值时
        end=time.time()     # 记录结束时间

tmp=[]      # 用来存放读取到的数据

data = 18   # DHT11的data引脚连接到的树莓派的GPIO引脚,使用BCM编号

a,b=0,0

def DHT11():
    GPIO.setup(data, GPIO.OUT)  # 设置GPIO口为输出模式
    GPIO.output(data,GPIO.HIGH) # 设置GPIO输出高电平
    delayMicrosecond(10*1000)   # 延时10毫秒
    GPIO.output(data,GPIO.LOW)  # 设置GPIO输出低电平
    delayMicrosecond(25*1000)   # 延时25毫秒      
    GPIO.output(data,GPIO.HIGH) # 设置GPIO输出高电平
    GPIO.setup(data, GPIO.IN)   # 设置GPIO口为输入模式
  
    a=time.time()           # 记录循环开始时间
    while GPIO.input(data): # 一直循环至输入为低电平
        b=time.time()       # 记录结束时间
        if (b-a)>0.1:       # 判断循环时间是否超过0.1秒,避免程序进入死循环卡死
            break           # 跳出循环
        
    a=time.time()
    while GPIO.input(data)==0:  # 一直循环至输入为高电平
        b=time.time()
        if (b-a)>0.1:
            break
                
    a=time.time()
    while GPIO.input(data): # 一直循环至输入为低电平
        b=time.time()
        if (b-a)>=0.1:
            break   
            
    for i in range(40):         # 循环40次,接收温湿度数据
        a=time.time()
        while GPIO.input(data)==0:  #一直循环至输入为高电平
            b=time.time()
            if (b-a)>0.1:
                break                      
        delayMicrosecond(28)    # 延时28微秒
            
        if GPIO.input(data):    # 超过28微秒后判断是否还处于高电平
            tmp.append(1)       # 记录接收到的bit为1
                
            a=time.time()
            while GPIO.input(data): # 一直循环至输入为低电平
                b=time.time()
                if (b-a)>0.1:
                    break
        else:
            tmp.append(0)       # 记录接收到的bit为0
            
#while True循环输出
while True:
    GPIO.setmode(GPIO.BCM)      # 设置为BCM编号模式
    GPIO.setwarnings(False)
    del tmp[0:]                 # 删除列表
    time.sleep(1)               # 延时1秒  
    DHT11()
  
    humidity_bit=tmp[0:8]       # 分隔列表,第0到7位是湿度整数数据
    humidity_point_bit=tmp[8:16]# 湿度小数
    temperature_bit=tmp[16:24]  # 温度整数
    temperature_point_bit=tmp[24:32]    # 温度小数
    check_bit=tmp[32:40]        # 校验数据
 
    humidity_int=0
    humidity_point=0
    temperature_int=0
    temperature_point=0
    check=0  
    for i in range(8):          # 二进制转换为十进制
        humidity_int+=humidity_bit[i]*2**(7-i)
        humidity_point+=humidity_point_bit[i]*2**(7-i)
        temperature_int+=temperature_bit[i]*2**(7-i)
        temperature_point+=temperature_point_bit[i]*2**(7-i)
        check+=check_bit[i]*2**(7-i)
  
    humidity=humidity_int+humidity_point/10
    temperature=temperature_int+temperature_point/10
  
    check_tmp=humidity_int+humidity_point+temperature_int+temperature_point
  
    if check==check_tmp and temperature!=0 and temperature!=0:  # 判断数据是否正常
        print("Temperature is ", temperature,"C\nHumidity is ",humidity,"%")# 打印温湿度数据     
        a={"Temperature":temperature,"Humidity":humidity}

    else:
        print("error")

    time.sleep(1)
    GPIO.cleanup()

测试结果:

树莓派(Raspberry Pi)上集成温湿度传感器并将其数据可视化,通常涉及以下几个步骤构建一个系统框图: 1. **硬件组成**: - **树莓派**: 作为主控制器,负责处理和存储数据。 - **温湿度传感器模块**: 例如DHT11DHT22或BME280等,用于实时测量环境温度和湿度。 - **I/O接口**: 连接传感器树莓派的数据线,如GPIO(通用输入输出)。 2. **软件环境**: - **Python库**: Python树莓派上有很好的支持,如`RPi.GPIO`用于控制GPIO,`smbus`或专用库如`Adafruit_BME280`或`pynmea2`用于读取传感器数据。 - **数据收集**: 使用Python脚本连接传感器并读取数据。 3. **数据处理**: - 数据获取模块 >> 存储传感器读取的温度和湿度值。 4. **数据传输与存储**: - 可能通过串口(UART)、USB或其他方式将数据发送到文件,也可以连接到本地数据库或云服务。 5. **数据可视化**: - 使用Python库,如`matplotlib`绘制图表展示历史数据,或者`Flask`创建Web应用实时显示数据。 6. **用户界面**: - Web页面或者终端命令行显示,如通过HTML/CSS和JavaScript(前端),或者直接在树莓派的终端查看。 **系统框图示例**: ``` +-------------------+ | Raspberry Pi | | - GPIO | | - Python Script | +-------------------+ | | v v +-----------+ +----------+ | Sensor Module| | Data Plot| | (DHT11/BME)| | (Graph) | +-----------+ +----------+ | | v v +---------------+ +--------+ | Local Storage | | Display| | (File/DB) | | (Web UI)| +---------------+ +--------+ ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白天数糖晚上数羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值