使用树莓派3b+和DHT11监控温湿度。

简介:

DHT11集成了温度和湿度传感器,通过度娘能找到一大堆关于树莓派+DHT11进行温湿度监控的文章,其中代码不乏C系列的,Python系统的,我基本上也编辑实践了。C系列的程序基本上没有读取成功的,Python系列的也基本上没有成功的,在不断实践中终于发现一个好用的Python代码,记录下来以备后用。

#! /usr/bin/env python3
# encoding=utf-8
# power by : FUNCO_小风

import RPi.GPIO as GPIO
import time

# 延时函数
def delay(i):
    while i:
        i -= 1

# 初始化dht11连接引脚
# dht11_pin - dht11连接的引脚号
def init_dht11(dht11_pin):
    # 输出模式 初始状态给高电平
    GPIO.setup(dht11_pin, GPIO.OUT)
    GPIO.output(dht11_pin, 1)

# 用于获取
# dht11_pin - dht11连接的引脚号
# 返回二元组 [ 湿度 , 温度 ]
def get_dht11(dht11_pin):
    buff=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

    GPIO.output(dht11_pin,0)
    time.sleep(0.02)                    # 拉低20ms

    GPIO.output(dht11_pin,1)

    GPIO.setup(dht11_pin,GPIO.IN)        # 这里需要拉高20-40us,但更改模式需要50us,因此不调用延时


    while not GPIO.input(dht11_pin):    # 检测返回信号 检测到启示信号的高电平结束
        pass


    while GPIO.input(dht11_pin):        # 检测到启示信号的高电平则循环
        pass

    i=40

    while i:
        start=time.time()*1000000        # 为了严格时序 循环开始便计时
        i-=1
        while not GPIO.input(dht11_pin):
            pass
        while GPIO.input(dht11_pin):
            pass
        buff[i]=time.time()*1000000-start# 为了严格时序 每次测得数据后都不马上处理 先存储
 
    GPIO.setup(dht11_pin,GPIO.OUT)        # 读取结束 复位引脚
    GPIO.output(dht11_pin,1)

    # print "buff - ",buff

    # 开始处理数据
    for i in range(len(buff)):            # 将时间转换为 0 1
        if buff[i]>100:                    # 上方测试时是测试整个位的时间
                                        # 因此是与100比较 大于100为1(位周期中 低电平50us)
            buff[i]=1
        else:
            buff[i]=0
    # print "After - ",buff

    i=40
    hum_int=0
    while i>32:                # 湿度整数部分
        i-=1
        hum_int<<=1
        hum_int+=buff[i]
    # print "hum - ",hum_int

    tmp_int=0
    i=24
    while i>16:                # 温度整数部分
        i-=1
        tmp_int<<=1
        tmp_int+=buff[i]
    # print "tmp - ",tmp_int
    return [hum_int,tmp_int]

GPIO.setmode(GPIO.BOARD)
init_dht11(7)
print get_dht11(7)
GPIO.cleanup()

# 注意
# 若非连续测量 可以不延时 但连续测量时建议每次测量间间隔0.2s以上再调用get_dht11(dht11_pin)获取数据(树莓派不稳定)
# DHT11虽然有40位 实际温度和湿度的小数部分读数总为0
# 如果程序无法正常读取,可以考虑是否起始部分的延时不准确,可以参考注释以及实际环境的测量结果调整延时
# 程序测试环境为 $树莓派3代B+$ $python2.7.9 $Raspbian GNU/Linux 8$
目录
相关文章
|
4月前
|
传感器 数据安全/隐私保护 数据格式
STM32CubeMX DHT11温湿度传感器
STM32CubeMX DHT11温湿度传感器
213 11
|
5月前
|
传感器 数据格式
【STM32】DHT11温湿度模块传感器详解&代码
【STM32】DHT11温湿度模块传感器详解&代码
|
传感器 编解码 物联网
STC89C52+DHT20设计的环境温湿度检测仪
本项目基于STC89C52单片机和DHT20温湿度传感器,实现了一款环境温湿度检测仪。通过传感器采集环境的温度和湿度数据,利用IIC接口的OLED显示屏显示出来,便于用户实时监测环境温湿度状态。
185 1
|
6月前
|
传感器 监控 C#
使用STM32实现一个简单的温湿度监控系统
使用STM32实现一个简单的温湿度监控系统
186 0
|
传感器 Linux
树莓派从温度传感器DHT11读取数据
这里有个校验位,是为了确保数据传输的准确性的。如果byte1+byte2+byte3+byte4 == byte0,数据传输就是正确的。不过DHT11小数位是不工作的,所以只需要考虑byte2+byte4就行了。
91 0
|
传感器 芯片 数据格式
stm32读取DHT11温湿度传感器
stm32读取DHT11温湿度传感器
269 1
|
传感器
野火RA6M5开发板 DHT11温湿度传感器 OLED显示测试学习
野火RA6M5开发板 DHT11温湿度传感器 OLED显示测试学习
118 0
野火RA6M5开发板 DHT11温湿度传感器 OLED显示测试学习
|
传感器 Linux
linux驱动——dht11温湿度传感器驱动(5.4版本内核)
linux驱动——dht11温湿度传感器驱动(5.4版本内核)
720 0
|
传感器 监控
LabVIEW控制Arduino采集DHT11温湿度数值(进阶篇—4)
在多数情况下,测量温度的同时需要测量湿度,本篇博文将介绍使用DHT11温湿度传感器、Arduino Uno和LabVIEW组成温湿度测量系统,可用于粮仓等场合的温湿度监控。