树莓派如何控制温湿度传感器DHT11

树莓派如何控制温湿度传感器DHT11,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

小π因为好几次断电之前没有关掉系统,导致系统老是起不来。无奈只好重写了SD卡。装好后前天晚上把一个温湿度传感器(DHT11)接到了小π上,顺利读出数据来了。废话不多说了,进入正题:

  • 首先,简单介绍下DHT11:

    DHT11是一个温湿度传感器,分为3个接口,分别为:VCCDATAGND

    引脚号 名称 类型 说明
    1 VCC 电源 +级,输入3V-5.5V
    2 DATA 数据输出 输出引脚
    3 GND 接地 接地引脚

    配一个DHT11的图片:

    树莓派如何控制温湿度传感器DHT11

    DHT11说明书200808修订版.pdf

    之前看网上说,需要在DHT11VCCDATA之间加一个电阻,经试验完全不需要。

  • 引脚连接:

    关于树莓派二代的引脚可以看下上篇Blog:树莓派控制有源蜂鸣器

  1. VCC接上3V3,可以选择1口或者17

  2. DATA接上GPIO口,我选的是GPIO4,第7

  3. GND接上接地口,我选的是第14

  • Python获取温湿度:

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #!/usr/bin/python
    import RPi.GPIO as GPIO
    import time
    
    channel =4 //GPIO4
    data = []
    j = 0
    
    GPIO.setmode(GPIO.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, "*C, humidity :", humidity, "%"
    else:
      print "wrong"
      print "temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ", tmp :", tmp
    
    GPIO.cleanup()
    • 展示结果:

    1
    2
    3
    4
    root@raspberrypi:/data/basedata# python/dht11.py
    sensor is working.
    [0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0]
    temperature : 20 *C, humidity : 38 %

    为了测试结果是否准确,我把手指放到传感器上,测试的数据为:

    1
    2
    3
    4
    5
    root@raspberrypi:/data/basedata/python# python dht11.py
    sensor is working.
    [0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1]
    wrong
    temperature : 36 *C, humidity : 38 %

    确认正确~

    备注: 如果你用的是DS18B20,需要做以下动作:

    1
    2
    3
    4
    5
    6
    7
    root@raspberrypi:/# apt-get update
    root@raspberrypi:/# apt-get upgrade #更新内核
    root@raspberrypi:/# reboot
    root@raspberrypi:/# vi /boot/config.txt #在最后一行手动添加:dtoverlay=w1-gpio-pullup,gpiopin=4 来支持新系统读取w1总线设备
    root@raspberrypi:/# modprobe w1-gpio #确认设备是否生效
    root@raspberrypi:/# modprobe w1-therm
    root@raspberrypi:/# cd /sys/bus/w1/devices/

    关于树莓派如何控制温湿度传感器DHT11问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。