树莓派读取DHT11温湿度传感器并将其转化为类 实现其他py文件对其进行调用

项目场景:

首先,任何一个环境监测类项目都需要用到温湿度,只要想到温湿度,DHT11绝对是耳熟能详的。但是在树莓派上直接应用DHT11代码还是有点问题的。此外,环境监测类项目所需收集的数据肯定不止温湿度一个,所以我们还需要将简单的代码转化为类,方便主函数调用,为实现多监测数据合并打下基础。


问题描述:

温湿度模块是通过普通I/O口进行数据传输,但直接引用肯定是不行的,数据并不能有效的读取到。在查阅了相关资料(Adafruit DHT)后,才发现DHT11 的读取需要遵循特定的信号协议完成,为了方便我们使用Adafruit DHT 库。
在这里插入图片描述


Adafruit DHT 库:

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

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

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

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

示例代码:

从网上查找出来的DHT11代码是这样的:

#!/usr/bin/python
#--------------------------------------
#    ___  ___  _ ____
#   / _ \/ _ \(_) __/__  __ __
#  / , _/ ___/ /\ \/ _ \/ // /
# /_/|_/_/  /_/___/ .__/\_, /
#                /_/   /___/
#
#           dht11.py
#  Basic example script to read DHT11 sensor using 
#  Adafruit DHT library:
#  https://github.com/adafruit/Adafruit_Python_DHT
#
#  Based on examples by Tony DiCola
#
# Author : Matt Hawkins
# Date   : 04/09/2017
#
# http://www.raspberrypi-spy.co.uk/tag/dht11/
#
#--------------------------------------
import Adafruit_DHT

# Set sensor type : Options are DHT11,DHT22 or AM2302
sensor = Adafruit_DHT.DHT11

# Set GPIO sensor is connected to
gpio = 4
# 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!')

这个代码直接运行,是可以出来温湿度的具体数据的。若是仅需要DHT11出来数据的读者,读到这里功能其实就算是实现了。

代码类化:

我们将DHT11的I/O口初始化与温湿度读取写成函数(def DHT11_Read(self)),方便主函数调用。再在前面加上(class DHT11)将整个代码类化。这样就可以通过 dht11 = DHT11()创建类,通过humid,temp=dht11.DHT11_Read()来调用DHT11类里的函数,进行温湿度数据的读取。

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

class DHT11:
    def DHT11_Read(self):
        sensor = Adafruit_DHT.DHT11
        gpio = 4
        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!')

类的引用:

上面的代码是在一个py文件中对类进行创建与引用。接下来我们如下图重新创建两个py文件(注意:将DHT11名字改为DHT 不能和类DHT11的名字一样 否则主函数引用时会产生错误):
在这里插入图片描述
DHT.py代码:

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

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

main.py代码:

from DHT import DHT11
import time

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

main.py代码较之前的示例代码多了from DHT import DHT11,其目的就是为了引用DHT文件里的DHT11类。直接运行main.py文件后的结果如下图所示:
在这里插入图片描述
可以发现第一个上传的数据是有异常的,可能是初始化时的抖动问题吧。不过没有什么大碍。

总结:

本博客主要展示了如何将代码进行类化,以实现其他.py文件对该类进行调用。总体来说还是很基础的。有很多模块的代码在给的时候可能本身就有class。这样也可以为我们节省了修改的时间。只需类的名字与函数的名字不同,即可在其他.py文件进行调用。
笔者在这里只是做一个总结与记录,希望能给读者一定的帮助,省下找各种解决方案的时间,笔者现在水平还是比较一般的,感谢观看,如有不足,请批评指正,再次感谢。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_47390133/article/details/113504307