在本篇树莓派使用DHT22湿度传感器感知湿度变化的教程中,我详细记录了如何将DHT22传感器连接到树莓派,以及如何使用Python从传感器读取数据,欢迎阅读斧正。
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电路
在这里,包含了几种方法,来构建树莓派湿度传感器电路。
可以依靠我下面的两张图来了解哪些引脚需要接什么,或者使用下面的书面步骤。
- 在DHT22的引脚1和引脚2之间放置一个10k电阻。
- 将DHT22的1号针脚连接到Pi的物理针脚1(3v3)。
- 将DHT22的2号引脚连接到Pi的物理引脚7(GPIO4)。
- 将DHT22的4号引脚连接到Pi的物理引脚6(GND)。
配置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温度传感器教程,这里有详尽的使用方法。
希望你一些顺利,收集的湿度和温度没有问题。如果你有什么问题,请在下面留言。
欢迎转载,请留下出处链接:Labno3 » 树莓派感知温度和湿度,详细记录树莓派使用DHT22传感器
这个库作者已经声明废弃了,作者声明现在换“adafruit-circuitpython-dht”,参考网址“https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/python-setup”