DHT11温湿度传感器学习

 DHT11温湿度传感器共有四个引脚

1个VCC高电平,1个GND接地低电平,1个数据输出引脚,一个空引脚

工作时候,通过out引脚可以向传感器传递应答信号并返回40位的温湿度数据,也就是5个字节

前2个字节表示温度的整数位和小数位,后面两个字节是湿度的整数位和小数位,最后一个字节是校验用

1.引脚

  • 4根引脚,名称与功能如下;
  • vdd 供电 3-5.5VDC
  • GND 接地,电源负极
  • DATA 串行数据,单总线
  • NC 空脚

2.温湿度测量范围

  • 温度范围为: 测量范围为-20~+60℃, 精度±2℃
  • 湿度范围为:测量范围为5~95%RH, 精度为±5%RH

3.工作时序阶段图 

接受数据通过0101010脉冲,数据进行高低电平的不断发送接收,直至40位数据发送完之后,

数据引脚将长时间处于一个高电平状态

python代码----

#!/usr/bin/python
# -*- coding:utf-8 -*-

import RPi.GPIO as GPIO
import time

channel = 7  # 引脚号Pin7
data = []  # 温湿度值
j = 0  # 计数器

GPIO.setmode(GPIO.BOARD)  # 以BOARD编码格式

time.sleep(1)  # 时延一秒

GPIO.setup(channel, GPIO.OUT)

GPIO.output(channel, GPIO.LOW)  #输出低电平
time.sleep(0.02)  # 给信号提示传感器开始工作
GPIO.output(channel, GPIO.HIGH)

GPIO.setup(channel, GPIO.IN)        #进入输入阶段----放弃总线控制权

while GPIO.input(channel) == GPIO.LOW:
    continue

while GPIO.input(channel) == GPIO.HIGH:     #跳出本次循环
    continue

while j < 40:
    k = 0
    while GPIO.input(channel) == GPIO.LOW:
        continue

    while GPIO.input(channel) == GPIO.HIGH:
        k += 1
        if k > 100:
            break                           #持续信号不变情况则,开始读取数据

    if k < 8:  # 通过计数的方式判断是数据位高电平长短,以置0或1。(此方式有待商榷)
        data.append(0)      #append函数 列表末端添加新对象
    else:
        data.append(1)

    j += 1      #直至40位数据传输完毕跳出循环

print("sensor is working.")
print(data)  # 输出初始数据高低电平01010101

humidity_bit = data[0:8]  # 分组40位就是5个字节分段
humidity_point_bit = data[8:16]
temperature_bit = data[16:24]
temperature_point_bit = data[24:32]
check_bit = data[32:40]

humidity = 0    #温湿度初始值
humidity_point = 0
temperature = 0
temperature_point = 0
check = 0

for i in range(8):
    humidity += humidity_bit[i] * 2 ** (7 - i)  # 转换成十进制数据加权-----1X2n次幂
    humidity_point += humidity_point_bit[i] * 2 ** (7 - i)  #湿度小数位
    temperature += temperature_bit[i] * 2 ** (7 - i)        #温度整数位
    temperature_point += temperature_point_bit[i] * 2 ** (7 - i)
    check += check_bit[i] * 2 ** (7 - i)#最后一位是校验码

tmp = humidity + humidity_point + temperature + temperature_point  # 十进制的数据相加

if check == tmp:  # 数据校验,相等则输出
    print("temperature : ", temperature, ", humidity : ", humidity)
else:  # 错误输出错误信息,和校验数据
    print("wrong")
    print("temperature : ", temperature, ", humidity : ", humidity, " check : ", check, " tmp : ", tmp)

GPIO.cleanup()  # 重置针脚

猜你喜欢

转载自blog.csdn.net/JLwwfs/article/details/125952207