树莓派+Python温湿度传感器监控

  1. 所需材料:
  • 树莓派卡片电脑
  • 安装在sd卡中的基于Linux的树莓派操作系统
  • 电源
  • 显示器
  • 视频线
  • 键盘、鼠标
  • DHT-11温湿度传感器
  • 1 pin 母对母杜邦线3根
  1. 操作步骤:
  • 传感器连接树莓派

使用杜邦线将DHT-11传感器的VCC针脚和树莓派的3.3V PWR相连。(示例代码连接1针脚)

使用杜邦线将DHT-11传感器的DATA针脚和树莓派的GPIO相连。(示例代码连接4针脚)

使用杜邦线将DHT-11传感器的GND针脚和树莓派的GND相连。(示例代码连接6针脚)

  • 将树莓派卡片电脑连接输出设备和电源,进入操作系统。
  • 在PC端或树莓派端的文本编辑器中编写Python代码
  • 运行代码
    • 在该文件的位置处打开命令行工具
    • 执行命令: python 代码名称.py ,观察输出
    • 按Ctrl + C 结束

 

  1. 原理说明

DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。在工业上有着广泛的应用。

代码:

# coding: utf-8

#!/usr/bin/python

 

import RPi.GPIO as GPIO

#导入树莓派的GPIO(General Purpose Input Output,通用输入/输出)库

import time

#导入时间库

 

def getTempandHum():

#定义一个函数来获取温湿度

channel = 4

#定义一个变量channel,代表第四个GPIO引脚

data = []

#定义一个数组变量data来获取温湿度

j = 0

#计数器

 

GPIO.setmode(GPIO.BCM)

#GPIO采取BCM编码格式

 

GPIO.setup(channel, GPIO.OUT)

#将引脚设置为OUTPUT模式,以便树莓派向传感器发送起始信号

GPIO.output(channel, GPIO.LOW)

#将引脚设置低电平,树莓派向传感器发送起始信号

time.sleep(0.02)

#低电平的时间需要保持至少18us,以保证传感器能检测到起始信号

GPIO.output(channel, GPIO.HIGH)

#树莓派输入起始信号过程结束,将引脚设置高电平(主机拉高20-40us)

GPIO.setup(channel, GPIO.IN)

#将引脚设置为INPUT模式,以便传感器向树莓派发送温湿度数据

 

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

continue

#等待传感器低电平结束(DHT响应信号80us)

 

while GPIO.input(channel) == GPIO.HIGH:

continue

#等待传感器高电平结束(DHT拉高80us)

 

 

#接下来的代码用于传送和处理数据:

开始正式传输40bit的二进制数据(0或1)。每一个bit的数据(0或者1)总是由一段持续50us的低电平信号开始,

#再由一段持续26us-28us(数据0)或者持续70us(数据1)的高电平结束。一直到40位数据传输完毕。这40位的数据内容是:

#8bit湿度整数数据 + 8bit湿度小数数据 + 8bi温度整数数据 + 8bit温度小数数据 + 8bit校验和。

#校验和数据应该等于“湿度整数数据+湿度小数数据+温度整数数据+温度小数数据”所得结果的末8位。

数字0的表示

数字1的表示

while j < 40:

k = 0

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

continue

#等待每一位开始时50us的低电平

 

while GPIO.input(channel) == GPIO.HIGH:

k += 1

if k > 100:

break

#变成高电平后,计数器k增加1。如果高电平时间为26-28us,则代表0。如果高电平时间为70us,则代表1。

if k < 8:

data.append(0)

else:

data.append(1)

j += 1

 

humidity_bit = data[0:8]

#8bit湿度整数数据

humidity_point_bit = data[8:16]

#8bit湿度小数数据

temperature_bit = data[16:24]

#8bit温度整数数据

temperature_point_bit = data[24:32]

#8bit温度小数数据

check_bit = data[32:40]

#8bit校验和

 

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, “湿度 :”, humidity, “%”

else:

print “–本次测量数据可能不准确,请重试–“

print “温度 :”, temperature, “湿度 :”, humidity, “%”

 

GPIO.cleanup()

 

#主函数,

if __name__==”__main__”:

while 1:

getTempandHum()

print

time.sleep(3)

程序运行界面: