树莓派感知温度和湿度,详细记录树莓派使用DHT22传感器

在本篇树莓派使用DHT22湿度传感器感知湿度变化的教程中,我详细记录了如何将DHT22传感器连接到树莓派,以及如何使用Python从传感器读取数据,欢迎阅读斧正。

Raspberry-Pi-Humidity-Sensor-DHT22-Thumbnail-WM.jpg

DHT22是一款多功能、低成本的湿度传感器,它还可以测量一个区域的温度。

这款传感器的数据传输距离相对较长,可以让传感器通过电线传输数据,最远距离可达20米。

DHT22还内置了模拟信号和数字信号转换器,该转换器使得将传感器连接到树莓派上变得更加容易,因为不需要添加额外的芯片。

DHT11和DHT22传感器最大的缺点是它们的测量速度比较慢传感器。DHT11的采样率为每秒一次,DHT22的采样率为每2秒一次。

也可以将DHT22与Arduino一起使用,如果你想使用Arduino板,一定要查看该教程。

虽然本教程只讲了怎样将DHT22连接到树莓Pi,但也适用于DHT11和AM2302湿度传感器,因为它们都使用相同的引脚。

设备清单

以下是将DHT22湿度传感器连接到树莓派所需的所有设备,点击链接直达优惠购买。

建议

可选

树莓派湿度传感器硬件设置

在本节教程中,我将展示如何将DHT22湿度传感器连接到树莓派。

DHT22是一个数字传感器,它与Raspberry Pi的连接非常简单。单个数据引脚能够直接连接到Raspberry Pi的GPIO引脚。

DHT22引脚

为了方便组装湿度传感器电路,这里提供了DHT22传感器的引脚。

这张图应该可以帮助你找出Raspberry Pi上每个引脚的位置。

  • 引脚1为VCC(电源)。
  • 引脚2为DATA(数据信号)。
  • 引脚3为NULL(不要连接)。
  • 引脚4为GND(接地)。

DHT22-Temperature-Sensor-with-numbering.png

树莓派连接DHT22电路

在这里,包含了几种方法,来构建树莓派湿度传感器电路。

可以依靠我下面的两张图来了解哪些引脚需要接什么,或者使用下面的书面步骤。

  • 在DHT22的引脚1和引脚2之间放置一个10k电阻。
  • 将DHT22的1号针脚连接到Pi的物理针脚1(3v3)。
  • 将DHT22的2号引脚连接到Pi的物理引脚7(GPIO4)。
  • 将DHT22的4号引脚连接到Pi的物理引脚6(GND)。

Raspberry-Pi-Humidity-Sensor-DHT22-Wiring-Schematic.png

Raspberry-Pi-Humidity-Sensor-DHT22-GPIO-Pins.png

配置Raspberry Pi与湿度传感器交互

1. 在开始为Raspberry Pi湿度传感器编程之前,首先确保Raspberry Pi上有最新的更新。

可以运行以下两个命令来更新包列表和安装包。

sudo apt-get update
sudo apt-get upgrade

2. 现在软件包列表已经更新,需要安装python 3和pip,使用这两个包来与湿度传感器进行交互。

运行以下命令安装python3-dev和python3-pip。

sudo apt-get install python3-dev python3-pip

3. 在安装DHT库之前,应该先运行下面的命令,以确保有最新版本的setuptools、wheel和pip python包。

sudo python3 -m pip install --upgrade pip setuptools wheel

4. 现在使用pip安装Adafruit的DHT库到Raspberry Pi上。

使用这个Python库与DHT22湿度/温度传感器进行交互。

该库还支持DHT11和AM2302湿度/温度传感器。

运行以下命令将DHT库安装到Raspberry Pi上。

sudo pip3 install Adafruit_DHT

为Raspberry Pi湿度传感器编程

1. 现在已经将Adafruit DHT库安装到Raspberry Pi上,现在可以使用它来编程了。

首先,必须制作一个Python脚本,在其中存储所有的代码。要开始编写这个文件,可以在Raspberry Pi中输入以下命令。

nano ~/humidity.py

2. 在这个文件中,需要输入以下几行代码。边走边解释代码的含义。

import Adafruit_DHT

这一行导入在上一节用pip得到的 “Adafruit_DHT “库。

使用这个库来与DHT22传感器对话和交互。这个库让可以很容易地用几行python代码从传感器中获取温度和湿度。

DHT_SENSOR = Adafruit_DHT.DHT22

在这一行,为传感器定义一个常数,用于DHT库。Adafruit DHT库有三种选择,可以根据使用的传感器来选择。

在本教程中,使用的是DHT22,所以将 “DHT_SENSOR “常量定义为 “Adafruit_DHT.DHT22″。

如果遵循本指南,但使用的是DHT11或AM2302,可以分别使用 “Adafruit_DHT.DH11 “或 “Adafruit_DHT_AM2302″。

DHT_PIN = 4

接下来,定义一个名为 “DHT_PIN “的常量,这是用来存储DHT22插入树莓派上的GPIO引脚的数量。

使用的数字是指GPIO引脚的BCM编号。在教程中,这意味着需要使用数字 “4”,因为要利用GPIO4引脚进行数据连接。

如果使用了不同的GPIO引脚,请相应地更新这个数字。

while True:
    humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)

接下来,使用 “while TRUE: “代码启动一个无限循环。这个循环将持续运行,直到杀死Python脚本。

在每个循环的开始,利用Adafruit DHT库从DHT22传感器中获取湿度和温度,同时指定我们的DHT_SENSOR和DHT_PIN常数。

read_retry “函数将不断尝试从湿度传感器中获取数据。

    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 retrieve data from humidity sensor")

最后,检查DHT库返回的数据。

如果 “humidity“或 “temperature “变量为 “None”,就返回一条消息,告诉最终用户未能从湿度传感器中检索到数据。

如果这两个变量中都有值,就会打印出一条消息,向终端用户显示刚刚从湿度传感器中获取的温度和湿度。

3. 完整的代码如下。

import Adafruit_DHT

DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4

while True:
    humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)

    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 retrieve data from humidity sensor")

4. 都写好后,就可以按CTRL + X,然后按Y,再按ENTER键保存文件。

5. 现在脚本已经保存,运行它看看。

可以执行以下命令来运行这个脚本。

python3 ~/humidity.py

6. 从这个命令,应该开始看到像我下面的结果。温度和湿度应该通过命令行显示。

Temp=25.6*C  Humidity=51.8%
Temp=25.2*C  Humidity=45.4%
Temp=25.1*C  Humidity=45.4%
Temp=25.0*C  Humidity=45.3%

7. 在本教程的下一节,我们将向您展示如何修改这个脚本,使其将数据记录到一个文件中。该文件将能够被Microsoft Excel或Google Spreadsheets等程序读取。

记录树莓派湿度传感器的数据

1. 重新创建一个脚本,这个脚本将与之前的脚本有些相似,但做了一些改动,以便写到一个文件。

首先运行以下命令开始编写新脚本。

nano ~/humidity_logger.py

2. 在该文件中输入以下几行。

import os
import time
import Adafruit_DHT

这里,导入 “os “和 “time “库添,使用 “os “库,就可以在向CSV文件写入之前检查它是否存在。

使用 “时间 “库,就可以用当前的日期和时间对每一行新的记录进行时间戳。

DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4

这两行字没有什么区别,保持之前的样子。

try:
    f = open('/home/pi/humidity.csv', 'a+')
    if os.stat('/home/pi/humidity.csv').st_size == 0:
            f.write('Date,Time,Temperature,Humidity\r\n')
except:
    pass

在这里,将所有的东西都包裹在try语句中,来捕捉错误。

打开一个”/home/pi/humidity.csv “文件的句柄,并应用 “a+”标签。a+标签意味着任何写入文件的数据都将被追加到文件的最后。

接下来,使用 “os “库来查看是否曾经向这个文件写入过。如果大小返回为0,就给文件写一行初始行。这一行将包含我们的列头,这样你就可以更容易理解数据。

while True:
    humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)

这里又有了while循环。利用DHT库再次读取DHT22湿度传感器的数据。

这个功能将把从传感器读取的数据存储到我们的 “湿度 “和 “温度 “变量中。

    if humidity is not None and temperature is not None:
        f.write('{0},{1},{2:0.1f}*C,{3:0.1f}%\r\n'.format(time.strftime('%m/%d/%y'), time.strftime('%H:%M'), temperature, humidity))  
    else:
        print("Failed to retrieve data from humidity sensor")

    time.sleep(30)

对这部分代码最大的改变是,不把温度和湿度打印到控制台,而是把它写到 “humidity.csv “文件中。通过使用之前打开的文件句柄来实现。

将写入文件的文本格式化,同时包括当前日期、当前时间、格式化的温度和湿度。

在循环结束时,让脚本睡眠30秒,如果想让它睡眠时间更长或轮询更频繁,那就修改这个数字。

3. 完整的代码如下。

import os
import time
import Adafruit_DHT

DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4

try:
    f = open('/home/pi/humidity.csv', 'a+')
    if os.stat('/home/pi/humidity.csv').st_size == 0:
            f.write('Date,Time,Temperature,Humidity\r\n')
except:
    pass

while True:
    humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)

    if humidity is not None and temperature is not None:
        f.write('{0},{1},{2:0.1f}*C,{3:0.1f}%\r\n'.format(time.strftime('%m/%d/%y'), time.strftime('%H:%M'), temperature, humidity))
    else:
        print("Failed to retrieve data from humidity sensor")

    time.sleep(30)

4. 完成后,按CTRL + X,然后按Y,再按ENTER键保存文件。

5. 运行脚本,测试一下效果。

python3 ~/humidity_logger.py

6. 退出脚本后,现在应该看到 “humidity.csv “文件,以查看你在一段时间内记录的所有结果。

如果运行下面的命令,应该看到文件的内容。

nano ~/humidity.csv

7. 以下是应该在这个文件中看到的内容的一个例子。

Date,Time,Temperature,Humidity
05/04/19,05:47,22.3*C,50.6%
05/04/19,05:48,22.2*C,50.4%
05/04/19,05:48,22.2*C,50.6%
05/04/19,05:49,22.2*C,50.4%
05/04/19,05:49,22.2*C,50.4%
05/04/19,05:50,22.2*C,50.3%
05/04/19,05:50,22.2*C,50.3%
05/04/19,05:51,22.2*C,50.2%

确认文件被成功写入,终于完成了对Raspberry Pi湿度传感器的编程。

如果需要一个防水温度传感器,那么一定要看看DS18B20温度传感器教程,这里有详尽的使用方法。

希望你一些顺利,收集的湿度和温度没有问题。如果你有什么问题,请在下面留言。

平均: 0 / 5. votes: 0

到目前为止还没有投票!成为第一位评论此文章。

欢迎转载,请留下出处链接:Labno3 » 树莓派感知温度和湿度,详细记录树莓派使用DHT22传感器

赞 (2)

1 评论

8+9=

  1. xffish

    这个库作者已经声明废弃了,作者声明现在换“adafruit-circuitpython-dht”,参考网址“https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/python-setup”

    回复