当前位置:   article > 正文

七、CM4树莓派连接DHT11温湿度传感器模块实现温湿度测定_树莓派连接传感器

树莓派连接传感器

4.DHT11说明书.pdf

DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。

该传感器包含一个电阻湿度感元件和一个NTC温度测量设备。

3个引脚+、-分别接VCC与GND,中间引脚DATA是一条数据线,通过它可以向传感器发送应答信号并返回40位的温湿度数据。

 

供电电压DC:3.3-5.5V
工作范围(温度)-20~+60℃
量程范围(湿度)5~95%RH
温度精度±2℃
湿度精度±5%RH
重复性温度:±1℃ ;湿度:±1%RH
迟滞(温度)±0.3℃
迟滞(湿度)±0.3%RH

 一、接线方式:

二、 引脚说明

pin名称注释
1VDD供电 3-5.5VDC
2DATA串行数据,单总线
3NC空脚
4GND接地,电源负极

 

  1. 首先由树莓派将数据拉高进入空闲状态(IdleState)

  2. 然后再把数据线拉低至少18ms通知DHT11需要进行数据采集(Star MCU),然后放弃总线的控制权

  3. 随后数据线会被DHT11拉高(20-40us),然后DHT11将发送一个80us的低电平与80us的高电平数据开始信号通知树莓派接收数据

  4. 随后将发送40位的0,1脉冲信号

    1. 其中0脉冲包括50us低电平,26us高电平

    2. 而1脉冲由50us低电平与70us的高电平组成

    3. 数据发送完毕之后数据总线被拉长时间拉高,总线又进入空闲模式

 三、树莓派连接实操

引脚图

 

本次连接选用的引脚为:

  1. BCM18 ——>pi 12

  2. VCC5V ——>pi 4

  3. GND GND ——>pi 6

 DHT11连接:

  • 黑线——VCC——面包板-极

  • 白线——GND——面包板+极

  • 红线——DATA——面包板e口

 树莓派连接

  • 黑线——VCC 5V——树莓派Pi4——面包板-极

  • 白线——GND GND——树莓派Pi6——面包板+极

  • 紫线——BCM 18——树莓派Pi12——面包板a口

 树莓派与DHT11合并

 四、测试

测试代码:

  1. import RPi.GPIO as GPIO
  2. import time
  3. #温湿度
  4. def delayMicrosecond(t): # 微秒级延时函数
  5. start,end=0,0 # 声明变量
  6. start=time.time() # 记录开始时间
  7. t=(t-3)/1000000 # 将输入t的单位转换为秒,-3是时间补偿
  8. while end-start<t: # 循环至时间差值大于或等于设定值时
  9. end=time.time() # 记录结束时间
  10. tmp=[] # 用来存放读取到的数据
  11. data = 18 # DHT11的data引脚连接到的树莓派的GPIO引脚,使用BCM编号
  12. a,b=0,0
  13. def DHT11():
  14. GPIO.setup(data, GPIO.OUT) # 设置GPIO口为输出模式
  15. GPIO.output(data,GPIO.HIGH) # 设置GPIO输出高电平
  16. delayMicrosecond(10*1000) # 延时10毫秒
  17. GPIO.output(data,GPIO.LOW) # 设置GPIO输出低电平
  18. delayMicrosecond(25*1000) # 延时25毫秒
  19. GPIO.output(data,GPIO.HIGH) # 设置GPIO输出高电平
  20. GPIO.setup(data, GPIO.IN) # 设置GPIO口为输入模式
  21. a=time.time() # 记录循环开始时间
  22. while GPIO.input(data): # 一直循环至输入为低电平
  23. b=time.time() # 记录结束时间
  24. if (b-a)>0.1: # 判断循环时间是否超过0.1秒,避免程序进入死循环卡死
  25. break # 跳出循环
  26. a=time.time()
  27. while GPIO.input(data)==0: # 一直循环至输入为高电平
  28. b=time.time()
  29. if (b-a)>0.1:
  30. break
  31. a=time.time()
  32. while GPIO.input(data): # 一直循环至输入为低电平
  33. b=time.time()
  34. if (b-a)>=0.1:
  35. break
  36. for i in range(40): # 循环40次,接收温湿度数据
  37. a=time.time()
  38. while GPIO.input(data)==0: #一直循环至输入为高电平
  39. b=time.time()
  40. if (b-a)>0.1:
  41. break
  42. delayMicrosecond(28) # 延时28微秒
  43. if GPIO.input(data): # 超过28微秒后判断是否还处于高电平
  44. tmp.append(1) # 记录接收到的bit为1
  45. a=time.time()
  46. while GPIO.input(data): # 一直循环至输入为低电平
  47. b=time.time()
  48. if (b-a)>0.1:
  49. break
  50. else:
  51. tmp.append(0) # 记录接收到的bit为0
  52. #while True循环输出
  53. while True:
  54. GPIO.setmode(GPIO.BCM) # 设置为BCM编号模式
  55. GPIO.setwarnings(False)
  56. del tmp[0:] # 删除列表
  57. time.sleep(1) # 延时1秒
  58. DHT11()
  59. humidity_bit=tmp[0:8] # 分隔列表,第0到7位是湿度整数数据
  60. humidity_point_bit=tmp[8:16]# 湿度小数
  61. temperature_bit=tmp[16:24] # 温度整数
  62. temperature_point_bit=tmp[24:32] # 温度小数
  63. check_bit=tmp[32:40] # 校验数据
  64. humidity_int=0
  65. humidity_point=0
  66. temperature_int=0
  67. temperature_point=0
  68. check=0
  69. for i in range(8): # 二进制转换为十进制
  70. humidity_int+=humidity_bit[i]*2**(7-i)
  71. humidity_point+=humidity_point_bit[i]*2**(7-i)
  72. temperature_int+=temperature_bit[i]*2**(7-i)
  73. temperature_point+=temperature_point_bit[i]*2**(7-i)
  74. check+=check_bit[i]*2**(7-i)
  75. humidity=humidity_int+humidity_point/10
  76. temperature=temperature_int+temperature_point/10
  77. check_tmp=humidity_int+humidity_point+temperature_int+temperature_point
  78. if check==check_tmp and temperature!=0 and temperature!=0: # 判断数据是否正常
  79. print("Temperature is ", temperature,"C\nHumidity is ",humidity,"%")# 打印温湿度数据
  80. a={"Temperature":temperature,"Humidity":humidity}
  81. else:
  82. print("error")
  83. time.sleep(1)
  84. GPIO.cleanup()

测试结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/468149
推荐阅读
相关标签
  

闽ICP备14008679号