太热了!我想我不应该抱怨住在天堂,但当我和妻子去年秋天搬到夏威夷时,我并没有过多考虑天气。别误会,天气几乎总是很可爱,我们 24/7 都开着窗户,但这意味着现在正值盛夏,房子里非常温暖。
那么,所有这些谦虚的吹嘘与开源有什么关系呢?嗯,我们计划安装一个全屋风扇——那种可以吸走你房子里的所有空气并将其排到阁楼里,从而将所有热空气排出阁楼的大风扇。我确信这会让房子凉快很多,但我这个极客想知道到底能凉快多少。
所以今天,我正在玩温度传感器、Raspberry Pis 和 Python。
在家一起玩!没有什么比一点#公民科学 更好的了!

迷人的小开发环境,不是吗? (Chris Collins, CC BY-SA 4.0)
是的,好吧,我可以只买一两个温度计,每天检查它们,看看会发生什么。但是,当你可以完全过度设计解决方案、自动化数据收集并随着时间的推移绘制所有数据时,为什么要这样做呢,对吧?
这是我需要的
- Raspberry Pi Zero W(或者,实际上,任何 Raspberry Pi)
- DHT22 数字传感器
- SD 卡
将 DHT22 传感器连接到 Raspberry Pi
通过快速的网络搜索,您可以找到许多廉价的 DHT22 温度和湿度传感器。 DHT22 是一种数字传感器,使其易于交互。如果您购买的是原始传感器,则需要一个电阻和一些焊接技能才能使其工作(查看 Pi My Life Up 的 DHT22 文章,了解关于使用原始传感器的精彩说明),但您也可以购买带有包含所有这些的小型 PCB 的传感器,这就是我所做的。
带有 PCB 的 DHT22 有三个引脚:一个正极引脚(标有+)、一个数据引脚和一个接地引脚(标有-)。您可以将 DHT22 直接连接到 Raspberry Pi Zero W。我使用了 Raspberry Pi Spy 的 Raspberry Pi GPIO 指南,以确保我正确连接了所有内容。
正极引脚提供从 Pi 到 DHT22 的电源。 DHT22 在 3v-6v 电压下运行,所以我选择了 Raspberry Pi 上的 5v 引脚之一来提供电源。我将 DHT22 上的数据引脚连接到 Raspberry Pi GPIO 引脚之一。我在此使用 GPIO4,但任何一个都可以;只需记下您选择的那个,因为从传感器读取数据的 Python 代码需要知道从哪个引脚读取。最后,我将 DHT22 上的接地引脚连接到 Raspberry Pi 接头上的接地引脚。
这是我的接线方式
- DHT22 正极引脚 <-> Raspberry Pi GPIO v5 引脚 (#2)
- DHT22 数据引脚 <-> Raspberry Pi GPIO4 引脚 (#7)
- DHT22 接地引脚 <-> Raspberry Pi 接地引脚 (#6)
Raspberry Pi Spy 的这张图显示了 Raspberry Pi Zero W(以及其他型号)的引脚布局。

(版权所有 © 2021 Matt Hawkins)
安装 DHT 传感器软件
在继续之前,请确保您已在 Raspberry Pi Zero W 上安装了操作系统,并且可以远程或通过键盘连接到它。如果不是,请参阅我关于定制 Raspberry Pi 的不同操作系统镜像的文章。我使用的是Raspberry Pi OS Lite,于 2021 年 5 月 7 日发布,作为 Raspberry Pi Zero W 的镜像。
将操作系统安装到 SD 卡上并从该卡启动 Raspberry Pi 后,只需安装其他几个软件包即可与 DHT22 交互。
首先,使用 apt-get
安装 Python Preferred Installer Program (pip),然后使用 pip 安装 Adafruit DHT 传感器 Python 库以与 DHT22 传感器交互。
# Install pip3
sudo apt-get install python3-pip
# Install the Adafruit DHT sensor library
sudo pip3 install Adafruit_DHT
使用 Python 获取传感器数据
安装 DHT 库后,您可以连接到传感器并检索温度和湿度数据。
创建一个文件,其中包含
#!/usr/bin/env python3
import sys
import argparse
import time
# This imports the Adafruit DHT software installed via pip
import Adafruit_DHT
# Initialize the DHT22 sensor
SENSOR = Adafruit_DHT.DHT22
# GPIO4 on the Raspberry Pi
SENSOR_PIN = 4
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("-f", "--fahrenheit", help="output temperature in Fahrenheit", action="https://open-source.net.cn/store_true")
return parser.parse_args()
def celsius_to_fahrenheit(degrees_celsius):
return (degrees_celsius * 9/5) + 32
def main():
args = parse_args()
while True:
try:
# Gather the humidity and temperature
# data from the sensor; GPIO Pin 4
humidity, temperature = Adafruit_DHT.read_retry(SENSOR, SENSOR_PIN)
except RuntimeError as e:
# GPIO access may require sudo permissions
# Other RuntimeError exceptions may occur, but
# are common. Just try again.
print(f"RuntimeError: {e}")
print("GPIO Access may need sudo permissions.")
time.sleep(2.0)
continue
if args.fahrenheit:
print("Temp: {0:0.1f}*F, Humidity: {1:0.1f}%".format(celsius_to_fahrenheit(temperature), humidity))
else:
print("Temp:{0:0.1f}*C, Humidity: {1:0.1f}%".format(temperature, humidity))
time.sleep(2.0)
if __name__ == "__main__":
main()
这里重要的是初始化传感器并设置要在 Raspberry Pi 上使用的正确 GPIO 引脚
# Initialize the DHT22 sensor
SENSOR = Adafruit_DHT.DHT22
# GPIO4 on the Raspberry Pi
SENSOR_PIN = 4
另一个重要的部分是使用为传感器和引脚设置的上述变量从传感器读取数据
# This connects to the sensor "SENSOR"
# Using the Raspberry Pi GPIO Pin 4, "SENSOR_PIN"
humidity, temperature = Adafruit_DHT.read_retry(SENSOR, SENSOR_PIN)
最后,运行脚本!你应该得到类似这样的结果

84 度和 50% 湿度。哎呀!这里又热又潮湿! (Chris Collins, CC BY-SA 4.0)
成功!
从这里开始
我有三个 DHT22 传感器和三个连接到我的 WiFi 的 Raspberry Pi Zero W。我已经将它们安装到一些小型项目盒中,将传感器热熔胶粘在外面,并将它们设置在我的客厅、办公室和卧室中。通过这种设置,我可以随时通过 SSH 进入 Raspberry Pi 并运行此脚本来收集传感器数据。
但为什么要停在那里呢?每次手动 SSH 进入它们既乏味又工作量太大。我可以做得更好!
在以后的文章中,我将解释如何设置此脚本以使用 systemd 服务在启动时自动运行,设置一个 Web 服务器来显示数据,并检测此脚本以导出可被 Prometheus(监控系统和时间序列数据库)读取的格式的数据。我在工作中使用 Prometheus 来收集有关 OpenShift/Kubernetes 集群的数据、绘制趋势以及根据数据创建警报。为什么不完全过分地使用家庭的温度和湿度数据做同样的事情呢?这样,我可以获得基线数据,然后了解全屋风扇的改变程度!
#公民科学!
2 条评论