树莓派与DHT11温度传感器的那些事儿


一、简介

  为了熟悉树莓派的GPIO操作,而找的一个小案例,出现了一些问题,最近才解决,故记录之。

二、硬件准备

1、DHT11温湿度传感器

DHT11
现在市面是卖的DHT11引脚有三脚、四脚之分,因为有一脚是空脚,所以其实都是一样用的,我购买的就是三脚。
引脚图

2、树莓派4B

树莓派4B
扩展接口:
树莓派4B扩展接口

引脚接线:(当前接线是随意的,只要记住DATA的位置还有正负极别插反就可以了)

  • VCC - Pin1
  • DATA - Pin3
  • GND - Pin6

三、软件准备

Thonny

使用的是系统自带的Python IDE
在这里插入图片描述

四、程序设计

1、使用 Adafruit 读取 DHT11 温湿度传感器

①、软件安装

开始之前需要更新软件包:

sudo apt-get update
sudo apt-get install build-essential python-dev

从 GitHub 获取 Adafruit 库:

sudo git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT

给 Python 2 和 Python 3 安装该库:

sudo python setup.py install
sudo python3 setup.py install

②、使用示例程序

示例程序
Adafruit 提供了示例程序,运行下面的命令测试。

cd ~
cd Adafruit_Python_DHT
cd examples
python AdafruitDHT.py 11 2

示例程序

③、使用Adafruit 库的自定义Python程序

当然也可以在自己创建的 Python 程序中使用这个库来实现调用

import Adafruit_DHT
  
# Set sensor type : Options are DHT11,DHT22 or AM2302
sensor=Adafruit_DHT.DHT11
  
# Set GPIO sensor is connected to
gpio=2
  
# Use read_retry method. This will retry up to 15 times to
# get a sensor reading (waiting 2 seconds between each retry).
humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)
  
# Reading the DHT11 is very sensitive to timings and occasionally
# the Pi might fail to get a valid reading. So check if readings are valid.
if humidity is not None and temperature is not None:
  print('Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(temperature, humidity))
else:
  print('Failed to get reading. Try again!')

在这里插入图片描述

④、实现实时循环显示温湿度的自定义python程序

#!/usr/bin/python
# *-*- coding:utf-8 -*-*
import Adafruit_DHT

class DHT11:
    def DHT11_Read(self):
        sensor = Adafruit_DHT.DHT11
        gpio = 2
        humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)
        return humidity,temperature

if __name__ == '__main__':
    float humid,temp
    dht11 = DHT11()
    while True:
        humid,temp=dht11.DHT11_Read()
        if humid is not None and temp is not None:
            print('Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(temp, humid))
        else:
            print('Failed to get reading. Try again!')

在这里插入图片描述

2、使用GPIO读取 DHT11 温湿度传感器

import RPi.GPIO as GPIO
import time

channel =2 # 上文提到的GPIO编号 
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.")

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, "%")
    res='{value:%f}'% temperature
    import json
    with open('/home/pi/Desktop/data.txt', 'a') as outfile:
        json.dump(res, outfile)
    outest=open('/home/pi/Desktop/data.txt','a')
    outest.write(res)
    outest.close
    print(res)
else:
    print ("wrong")
GPIO.cleanup()

按理说应该是没什么问题,但是始终显示不了结果,温湿度均显示255,数据位没有派上用场,欢迎懂行的朋友给予解答。
在这里插入图片描述

3、遇到的问题

①、树莓派4B使用Adafruit_DHT不能正确显示温度

  这是因为下载的Adafruit_DHT驱动未支持4b处理器BCM2711,我们需要自己手动打开/home/pi/Adafruit_Python_DHT/Adafruit_DHT/platform_detect.py,并在红圈位置添加以下代码。

elif match.group(1) == 'BCM2711':
   # Pi 4b
   return 3

在这里插入图片描述
  然后退回到Adafruit_Python_DHT目录,重新安装Adafruit Python DHT Sensor函数库,再次运行示例程序即可显示正确温湿度。

cd Adafruit_Python_DHT/
sudo python setup.py install

猜你喜欢

转载自blog.csdn.net/qq_41071754/article/details/114122576