Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5018442
  • 博文数量: 891
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8636
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(891)

文章存档

2020年(8)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Python/Ruby

2019-09-06 14:30:48

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

点击(此处)折叠或打开

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

  4. import RPi.GPIO as GPIO
  5. import time

  6. # 延时函数
  7. def delay(i):
  8.     while i:
  9.         i -= 1

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

  16. # 用于获取
  17. # dht11_pin - dht11连接的引脚号
  18. # 返回二元组 [ 湿度 , 温度 ]
  19. def get_dht11(dht11_pin):
  20.     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]

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

  23.     GPIO.output(dht11_pin,1)

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


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


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

  29.     i=40

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

  41.     # print "buff - ",buff

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

  50.     i=40
  51.     hum_int=0
  52.     while i>32: # 湿度整数部分
  53.         i-=1
  54.         hum_int<<=1
  55.         hum_int+=buff[i]
  56.     # print "hum - ",hum_int

  57.     tmp_int=0
  58.     i=24
  59.     while i>16: # 温度整数部分
  60.         i-=1
  61.         tmp_int<<=1
  62.         tmp_int+=buff[i]
  63.     # print "tmp - ",tmp_int
  64.     return [hum_int,tmp_int]

  65. GPIO.setmode(GPIO.BOARD)
  66. init_dht11(7)
  67. print get_dht11(7)
  68. GPIO.cleanup()

  69. # 注意
  70. # 若非连续测量 可以不延时 但连续测量时建议每次测量间间隔0.2s以上再调用get_dht11(dht11_pin)获取数据(树莓派不稳定)
  71. # DHT11虽然有40位 实际温度和湿度的小数部分读数总为0
  72. # 如果程序无法正常读取,可以考虑是否起始部分的延时不准确,可以参考注释以及实际环境的测量结果调整延时
  73. # 程序测试环境为 $树莓派3代B+$ $python2.7.9 $Raspbian GNU/Linux 8$

阅读(631) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~