树莓派控制DHT11

首先先要了解温湿度传感器DHT11的特性

温湿度传感器 DHT11

硬件接口

DHT11有三个IO接口,一个VCC(正极)接3.3v,一个GND接GND,剩下一个DATA接树莓派的任意一个GPIO


硬件接口

通信时序

单片机触发DHT11工作:单片机IO,输出模式,由高电平拉低,至少18ms,再拉高,单片机改为输入模式

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

一次完整的数据传输为40bit,高位先出。

数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和

数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
如果上式不相等,说明程序还没有调试好,或者读取过快

python脚本编程

python比较简洁,因此选择python编写程序

#!/usr/bin/python
 
import RPi.GPIO as GPIO
import time
 
channel = 4                       #引脚号4
data = []                                 #温湿度值
j = 0                                     #计数器
 
GPIO.setmode(GPIO.BCM)        #以BCM编码格式
 
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:
        data.append(0)
    else:
        data.append(1)
 
    j += 1
 
print ("sensor is working.")
print (data)                    #输出初始数据高低电平
 
humidity_bit = data[0:8]        #分组
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)              #转换成十进制数据
    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, ".", temperature_point, ", humidity : " , humidity, ".", humidity_point)
else:                                       #错误输出错误信息,和校验数据
    print ("wrong")
    print ("temperature : ", temperature, ", humidity : " , humidity, " check : ", check, " tmp : ", tmp)
 
GPIO.cleanup()          

你可能感兴趣的:(树莓派控制DHT11)