1. 项目概述
最近在折腾一个智能家居的小项目,核心需求是想实时监控家里几个关键区域的温湿度变化,比如书房、卧室和阳台。市面上成品的智能温湿度计不少,但要么数据封闭在自家App里,要么可玩性不高,没法把数据拿来做进一步的分析或联动。作为一个喜欢动手的开发者,我决定自己搭建一套,核心要求就三点:数据要能实时上传到云端、要有直观的历史曲线图、并且整套方案要足够稳定和开源。
经过一番选型,我最终敲定了DHT22传感器和Adafruit IO云平台的组合。DHT22是一款性价比很高的数字温湿度传感器,精度和稳定性对于家庭环境监测来说完全够用。而Adafruit IO则是一个对开发者极其友好的物联网平台,它免去了自建服务器的麻烦,提供了从数据接收、存储到可视化的一站式服务,并且有非常完善的Arduino和Python库支持,上手速度飞快。
这个项目非常适合有一定嵌入式或Python基础的爱好者、创客,或者任何想深入了解物联网数据流“端-云”全链路的朋友。无论你是想做一个环境监测站,还是为后续的智能联动(比如温湿度超标自动打开空调或加湿器)打基础,这个实践都能给你提供一个清晰、可靠的起点。接下来,我会从硬件选型、云端配置、代码编写到问题排查,毫无保留地分享整个搭建过程和我踩过的一些坑。
2. 核心硬件选型与电路设计解析
一套物联网系统,硬件是骨架。我的选型思路是在满足需求的前提下,追求高性价比和低复杂度,确保第一次尝试的朋友也能顺利跑通。
2.1 传感器:为什么是DHT22?
在温湿度传感器中,DHT11和DHT22是最常见的两款。我选择了DHT22,主要基于以下几点考量:
- 精度与量程:DHT22的湿度测量精度为±2%RH(量程0-100%),温度精度为±0.5°C(量程-40~80°C)。而DHT11的湿度精度为±5%RH,温度精度为±2°C。对于需要更精确数据的场景,比如花卉培育或精密设备环境监控,DHT22是更稳妥的选择。
- 响应速度与稳定性:DHT22的采样周期为2秒,比DHT11更快一些。在实际使用中,DHT22的读数也相对更稳定,受电路干扰的影响稍小。
- 接口统一:两者都使用单总线(1-Wire)数字信号输出,仅需一个数据引脚,接线和编程方式几乎完全一样。选择DHT22几乎没有增加额外的学习成本。
注意:DHT22的“单总线”协议对时序要求比较严格。这意味着在读取数据时,微控制器需要暂时屏蔽中断,以确保通信时序的准确性。好在Adafruit的DHT库已经帮我们处理了这些底层细节,我们直接调用库函数即可,这是选择成熟开源库的一大好处。
2.2 主控板:Arduino与树莓派的双路径选择
项目提供了两种主控方案:Arduino(ESP8266)和树莓派(Raspberry Pi)。这其实是物联网设备中“单片机”与“微型电脑”两条典型技术路径。
Arduino + ESP8266方案(如Adafruit Feather HUZZAH):
- 优点:极低功耗,成本低廉,体积小巧,非常适合做成电池供电的、需要长期部署的传感器节点。代码直接在Arduino IDE中编写上传,逻辑简单直接。
- 缺点:处理能力有限,如果要同时处理复杂逻辑(如图像识别、多协议转换)会力不从心。通常需要依赖外部云平台(如Adafruit IO)进行数据聚合和复杂计算。
- 适用场景:单纯的传感器数据采集与上报,追求低成本和低功耗的分布式监测点。
树莓派方案:
- 优点:本质上是一台运行Linux的微型电脑,计算能力强,内存和存储空间大。可以直接在设备上运行Python脚本,处理复杂逻辑,甚至本地运行数据库和Web服务器。接口丰富(USB, HDMI, GPIO等),扩展性极强。
- 缺点:功耗较高(通常需要5V/2.5A电源),成本也高于单片机方案,体积相对较大。
- 适用场景:作为家庭物联网网关,同时连接多个传感器和执行器;需要在本地进行初步数据分析和处理的场景;作为学习和开发的原型平台。
我的选择:为了方案的完整性和可复制性,我同时实践了两种路径。一个基于Feather HUZZAH ESP8266的无线传感器节点被放在阳台,另一个基于树莓派4B的网关节点放在书房,同时监控室内环境并作为家庭自动化中心。两种方式的数据最终都汇聚到同一个Adafruit IO账户下进行统一展示。
2.3 电路连接详解与避坑指南
接线看似简单,但却是项目成功的第一步,很多“传感器没读数”的问题都源于此。
Arduino (Feather HUZZAH ESP8266) 接线方案:
| Feather引脚 | 连接至 | 说明 |
|---|---|---|
| 3V | DHT22 Pin 1 (VCC) | 提供3.3V电源。务必确认是3.3V,不是5V!DHT22虽然标称支持3.3V-5.5V,但与3.3V逻辑的ESP8266搭配时,使用3.3V供电可以避免逻辑电平不匹配。 |
| GND | DHT22 Pin 4 (GND) | 共地,形成完整回路。 |
| GPIO 2(或其他数字引脚) | DHT22 Pin 2 (DATA) | 数据信号线。示例代码中使用的是Pin 2。 |
| 10kΩ电阻 | 一端接DATA线,另一端接3V | 上拉电阻。这是关键!单总线协议需要一条上拉电阻将数据线在空闲时保持在高电平。电阻值通常在4.7kΩ到10kΩ之间,10kΩ是常用值。 |
树莓派接线方案:
| 树莓派 GPIO | 连接至 | 说明 |
|---|---|---|
| 3.3V (Pin 1) | DHT22 Pin 1 (VCC) | 提供3.3V电源。树莓派GPIO逻辑电平也是3.3V,完美匹配。 |
| GND (Pin 6) | DHT22 Pin 4 (GND) | 共地。 |
| GPIO 26 (Pin 37) | DHT22 Pin 2 (DATA) | 数据信号线。示例中使用GPIO 26,你可以换成其他可用的GPIO。 |
| 10kΩ电阻 | 一端接DATA线,另一端接3.3V | 上拉电阻,作用同上。 |
实操心得:接线检查清单
- 电源确认:再三确认使用的是3.3V引脚,而非5V。接错可能瞬间损坏DHT22或主控板。
- 上拉电阻:这是新手最容易遗漏的一步。没有上拉电阻,数据线无法稳定地输出高电平,会导致读取失败或数据乱码。如果你用的开发板(如某些ESP32板卡)内部GPIO已带上拉,可能可以省略,但为了稳定性,外部加上总是更保险。
- 接触不良:使用杜邦线连接时,确保插紧。有时线缆内部断裂会导致间歇性故障,可以用万用表通断档检查。
- 引脚复用:检查你选用的数据引脚是否被板载其他功能(如LED、串口)占用,避免冲突。
3. 云端平台:Adafruit IO配置全流程
硬件准备就绪后,我们来搭建数据的“云端大脑”——Adafruit IO。它的核心概念是Feed(数据流)和Dashboard(仪表盘),理解这两个概念就掌握了平台的使用精髓。
3.1 账号准备与AIO Key获取
首先,访问 io.adafruit.com 注册一个免费账户。免费账户对于个人项目和小规模部署完全够用,它有数据点发送频率和存储时长限制,但对我们这个温湿度项目(每5-10秒发送一次)来说绰绰有余。
登录后,点击右上角用户名,进入“My Key”页面。这里你会看到两样最重要的信息:
- Username:你的用户名。
- Active Key:你的API密钥。务必像保管密码一样保管它!所有设备代码都需要用它来向Adafruit IO证明身份。
重要安全提示:你的AIO Key是访问你账户数据的唯一凭证。绝对不要将它直接硬编码在代码中并上传到公开的GitHub仓库。示例代码中的
YOUR_AIO_KEY和YOUR_AIO_USERNAME只是占位符,在实际使用前必须替换成你自己的。更安全的做法是使用环境变量或单独的配置文件来管理这些密钥。
3.2 创建数据流(Feeds)
Feed是Adafruit IO中最基本的数据单元,你可以把它理解为一个专属的、带时间戳的数据通道。我们为温度和湿度分别创建一个Feed。
- 点击顶部导航栏的“Feeds”。
- 点击“New Feed”。
- 在创建页面:
- Name: 输入
temperature。名称最好简洁明了,使用小写字母和数字,避免空格和特殊字符,因为代码里会直接引用这个名称。 - Description(可选): 可以填写“客厅温度传感器”等描述信息。
- 其他设置保持默认,点击“Create”。
- Name: 输入
- 重复上述步骤,再创建一个名为
humidity的Feed。
创建完成后,你会看到两个Feed的列表。点击任何一个Feed,可以看到其详细信息、历史数据(图表)和设置选项。现在它们还是空的,等待我们的设备发送数据。
3.3 构建可视化仪表盘(Dashboard)
Dashboard是用来展示Feed数据的可视化面板,由各种可拖拽的“块”(Block)组成,比如折线图、仪表盘、开关等。
- 点击顶部导航栏的“Dashboards”。
- 点击“New Dashboard”,给它起个名字,比如
Home Environment。 - 进入新建的Dashboard,点击右上角的“Create New Block”。
- 选择“Line Chart”(折线图)。这是展示温湿度随时间变化趋势最直观的方式。
- 在配置页面:
- Connect a Feed:这里是关键。点击“Select existing feed”,然后分别勾选我们刚才创建的
temperature和humidity两个Feed。这样,一个图表就能同时绘制两条曲线。 - Block Title:可以命名为“温湿度变化曲线”。
- History:设置为24 hours。这意味着图表会显示最近24小时的数据。免费账户的数据保留时间有限,这个设置很合理。
- 其他颜色、样式选项可以按喜好调整。
- Connect a Feed:这里是关键。点击“Select existing feed”,然后分别勾选我们刚才创建的
- 点击“Create Block”。
现在,一个空白的折线图块就出现在你的仪表盘上了。一旦设备开始发送数据,图表就会自动更新。你还可以添加其他类型的块,比如“Gauge”(仪表)来显示当前实时数值。
4. Arduino端实现详解与代码深度剖析
我以Feather HUZZAH ESP8266为例,详细讲解Arduino端的代码如何工作,以及如何根据你的实际情况进行修改和优化。
4.1 开发环境与库安装
首先确保你的Arduino IDE已安装好ESP8266开发板支持。然后在“工具” -> “开发板”中选择你的对应板型(如“Adafruit Feather HUZZAH ESP8266”)。
接下来,通过库管理器安装三个必需的库:
- 打开“项目” -> “加载库” -> “管理库...”。
- 搜索“Adafruit IO Arduino”,选择并安装最新版本。这个库包含了连接Adafruit IO的所有核心逻辑。
- 搜索“DHT sensor library”,选择由Adafruit提供的版本并安装。这个库用于驱动DHT系列传感器。
- 搜索“Adafruit Unified Sensor”并安装。这是DHT库的一个依赖库,提供了传感器数据的统一抽象层。
4.2 核心代码解读与定制
安装好库后,在“文件” -> “示例” -> “Adafruit IO Arduino”下找到adafruitio_15_temp_humidity示例并打开。这个示例已经包含了我们所需的大部分代码。我们主要需要修改config.h这个标签页下的配置文件。
// config.h /******************************* WIFI **************************************/ #define IO_USERNAME "your_adafruit_username" // 替换为你的用户名 #define IO_KEY "your_adafruit_active_key" // 替换为你的AIO Key #define WIFI_SSID "your_wifi_ssid" // 替换为你的Wi-Fi名称 #define WIFI_PASS "your_wifi_password" // 替换为你的Wi-Fi密码 // 注释掉你不使用的网络方式 #include "AdafruitIO_WiFi.h" // 使用Wi-Fi则保留 // #include "AdafruitIO_FONA.h" // 使用FONA蜂窝网络则取消注释并配置 // #include "AdafruitIO_Ethernet.h" // 使用以太网则取消注释并配置 AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);关键配置点解析:
IO_USERNAME和IO_KEY:这是连接Adafruit IO的“身份证”,必须准确。WIFI_SSID和WIFI_PASS:确保你的ESP8266能连接到这个2.4GHz的Wi-Fi网络(大部分ESP8266不支持5GHz)。- 网络选择:示例默认使用Wi-Fi。如果你使用其他网络模块(如FONA或以太网扩展板),需要注释掉Wi-Fi行,并取消注释对应的行。
接下来看主程序(adafruitio_15_temp_humidity标签页)的关键部分:
// 定义DHT22数据引脚,默认是2。如果你的接线用了其他引脚(如GPIO4),在这里修改。 #define DATA_PIN 2 // 创建DHT22传感器对象 DHT_Unified dht(DATA_PIN, DHT22); // 创建指向Adafruit IO上Feed的对象指针 AdafruitIO_Feed *temperature = io.feed("temperature"); AdafruitIO_Feed *humidity = io.feed("humidity"); void setup() { Serial.begin(115200); while(!Serial); // 等待串口监视器打开(仅用于调试,实际部署可注释掉) dht.begin(); // 初始化传感器 io.connect(); // 连接Adafruit IO // 等待连接成功 while(io.status() < AIO_CONNECTED) { Serial.print("."); delay(500); } Serial.println(io.statusText()); // 打印连接状态 } void loop() { io.run(); // 必须!维持连接并处理后台消息 sensors_event_t event; // 读取温度 dht.temperature().getEvent(&event); if (isnan(event.temperature)) { Serial.println("读取温度失败!"); } else { float celsius = event.temperature; float fahrenheit = (celsius * 1.8) + 32; Serial.print("温度: "); Serial.print(celsius); Serial.println(" °C"); // 发送数据到云端,这里发送的是华氏度,可根据需要改为celsius temperature->save(fahrenheit); } // 读取湿度 dht.humidity().getEvent(&event); if (isnan(event.relative_humidity)) { Serial.println("读取湿度失败!"); } else { Serial.print("湿度: "); Serial.print(event.relative_humidity); Serial.println(" %"); humidity->save(event.relative_humidity); } delay(5000); // 等待5秒后进入下一次循环 }代码逻辑与优化建议:
io.run()的重要性:这个函数必须在loop()的最开始调用。它负责维持与Adafruit IO服务器的MQTT连接心跳,并处理任何来自云端的下行指令(虽然本例中没有)。如果遗漏,设备会在几分钟后断开连接。- 错误处理:原始示例省略了错误判断。我强烈建议加上
if (isnan(...))的判断。DHT22读取可能偶尔失败,返回NaN(非数字)。不加判断就直接上传,会导致云端收到无效数据点。加上错误处理能让系统更健壮,并在串口输出错误信息便于调试。 - 发送单位:示例代码发送的是华氏温度(
fahrenheit)。国内更常用摄氏度,你可以将temperature->save(fahrenheit);改为temperature->save(celsius);。注意:Adafruit IO本身不关心单位,它只存储数值。单位需要在Dashboard的图表设置里手动标注清楚。 - 发送频率:
delay(5000)设置了5秒的发送间隔。对于温湿度这种变化较慢的物理量,5-10秒的间隔是合理的。过于频繁(如小于2秒)可能会触发Adafruit IO免费账户的速率限制。对于电池供电设备,可以进一步延长间隔(如60秒)以节省电量。
4.3 增加OLED本地显示
为了让设备脱离电脑串口也能独立工作,我加装了一块I2C接口的OLED屏幕(如SSD1306 128x32),用于显示网络状态和实时读数。
硬件连接:OLED屏幕的VCC接3.3V,GND接GND,SCL接ESP8266的SCL引脚(Feather HUZZAH上是GPIO5),SDA接SDA引脚(GPIO4)。
代码修改:你需要安装Adafruit SSD1306和Adafruit GFX库。然后在代码中添加屏幕初始化和显示逻辑。核心是在loop()函数的最后,将温湿度、Wi-Fi SSID、本地IP地址和IO连接状态打印到OLED上。示例中提供的扩展代码正是做了这件事。添加后,设备就成了一个自带显示屏的独立监测站,体验提升巨大。
5. 树莓派Python端实现详解
对于树莓派方案,我们使用Python脚本,这赋予了项目更大的灵活性,比如可以轻松集成其他Python库进行数据分析,或者运行一个简单的Web服务器。
5.1 系统与Python环境准备
首先确保你的树莓派系统是最新的(推荐Raspberry Pi OS Lite或Desktop版本),并通过SSH或直接连接显示器打开终端。
# 更新系统包列表和已安装的包 sudo apt-get update sudo apt-get upgrade -y # 确保使用Python 3和pip3 sudo apt-get install python3-pip -y5.2 安装必要的Python库
树莓派方案使用了不同的库,因为adafruit-blinka(用于在树莓派上模拟CircuitPython的库)在某些时序严格的传感器上支持尚不完善。
# 安装DHT传感器驱动库 sudo pip3 install Adafruit_DHT # 安装Adafruit IO的Python客户端库 sudo pip3 install adafruit-io注意:Adafruit_DHT库是一个纯Python库,通过操作GPIO引脚直接与DHT传感器通信,不依赖特定的硬件抽象层,因此在树莓派上兼容性很好。
5.3 Python脚本解析与运行
从Adafruit的GitHub仓库获取示例代码:
cd ~ git clone https://github.com/adafruit/io-client-python.git cd io-client-python/examples/basics/用文本编辑器(如nano)打开temp_humidity.py文件,进行关键配置:
# 设置你的Adafruit IO凭证 ADAFRUIT_IO_KEY = 'YOUR_AIO_KEY' # 替换为你的Active Key ADAFRUIT_IO_USERNAME = 'YOUR_AIO_USERNAME' # 替换为你的用户名 # 设置DHT22的数据引脚(BCM编号,即GPIO编号) DHT_DATA_PIN = 26 # 设置读取间隔(秒) DHT_READ_TIMEOUT = 5脚本核心逻辑:
- 初始化:使用你的用户名和密钥创建Adafruit IO客户端 (
Client) 对象。 - 获取Feed:
aio.feeds('temperature')会获取或创建名为“temperature”的Feed对象。如果Feed不存在,Adafruit IO会自动创建它,这比Arduino端更灵活。 - 循环读取与发送:
- 使用
Adafruit_DHT.read_retry(sensor, pin)尝试读取传感器。这个函数内部会重试多次(默认15次),提高了单次读取的成功率。 - 将读取到的温湿度值通过
aio.send(feed_key, value)发送到对应的Feed。 - 用
time.sleep(DHT_READ_TIMEOUT)控制发送频率。
- 使用
运行脚本:
python3 temp_humidity.py如果一切正常,你将在终端看到持续的温湿度输出,同时Adafruit IO的Dashboard上图表开始跳动。
5.4 让脚本在后台持续运行
我们不可能一直开着终端窗口。使用systemd服务让脚本在树莓派启动时自动运行,并在崩溃后自动重启。
- 创建一个服务文件:
sudo nano /etc/systemd/system/environment_monitor.service - 输入以下内容(注意修改
ExecStart的路径为你的脚本实际路径):[Unit] Description=Environment Monitor Service (DHT22 to Adafruit IO) After=network.target [Service] Type=simple User=pi WorkingDirectory=/home/pi/io-client-python/examples/basics ExecStart=/usr/bin/python3 /home/pi/io-client-python/examples/basics/temp_humidity.py Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target - 启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable environment_monitor.service sudo systemctl start environment_monitor.service - 检查服务状态:
看到sudo systemctl status environment_monitor.serviceactive (running)就表示成功了。以后树莓派每次开机,这个监测服务都会自动在后台运行。
6. 常见问题排查与实战经验汇总
在实际部署中,你几乎一定会遇到一些问题。下面是我在多个节点部署过程中总结的“排坑指南”。
6.1 连接类问题
问题现象:Arduino串口一直打印“Connecting to Adafruit IO....”或“...”,无法连接成功。
- 检查1:Wi-Fi凭证:这是最常见的原因。仔细检查
config.h中的WIFI_SSID和WIFI_PASS是否正确,注意大小写和特殊字符。 - 检查2:网络环境:确保ESP8266支持的2.4GHz Wi-Fi网络可用,并且信号强度足够。有些企业或校园网可能有额外的认证门户(Captive Portal),ESP8266的简单Wi-Fi客户端可能无法处理。
- 检查3:AIO密钥:确认
IO_USERNAME和IO_KEY正确无误,没有多余的空格。 - 检查4:代码诊断:按照原始指南的建议,修改等待连接循环中的代码,将
Serial.print(".");改为Serial.println(io.statusText());。重新上传后,串口会打印出具体的错误状态,如“Network disconnected”或“Connecting to MQTT...”,这能极大缩小排查范围。 - 检查5:防火墙或网络限制:在某些公司或学校网络,出站MQTT流量(默认端口1883或8883)可能被阻止。尝试将设备连接到手机热点,看是否能正常连接,以此判断是否是网络环境问题。
问题现象:树莓派Python脚本报错,提示认证失败或连接超时。
- 检查凭证:确认Python脚本中的
ADAFRUIT_IO_USERNAME和ADAFRUIT_IO_KEY已正确替换。 - 检查网络:确保树莓派可以正常访问互联网 (
ping 8.8.8.8)。 - 检查库版本:运行
pip3 show adafruit-io查看库版本,过旧的版本可能存在兼容性问题。尝试升级:sudo pip3 install --upgrade adafruit-io。
6.2 数据读取类问题
问题现象:串口/终端打印“读取温度/湿度失败!”或“Failed to read from DHT sensor!”
- 检查1:物理连接:这是首要怀疑对象。按照第2.3节的“接线检查清单”逐一核对,特别是电源电压和上拉电阻。
- 检查2:GPIO引脚:确认代码中定义的
DATA_PIN(Arduino)或DHT_DATA_PIN(Python)与实际接线使用的引脚编号一致。注意树莓派使用的是BCM GPIO编号,而非物理引脚编号。 - 检查3:供电不足:如果使用很长的杜邦线或从USB口取电同时驱动多个外设,可能导致DHT22供电电压不稳。尝试缩短导线,或单独为DHT22提供稳定的3.3V电源。
- 检查4:传感器损坏:DHT22相对脆弱,静电或接错线都可能导致损坏。有条件的话,换一个传感器测试。
- 检查5:时序干扰:对于树莓派,
Adafruit_DHT库在读取时需要精确的微秒级时序,这可能会被系统其他进程打断。如果失败率很高,可以尝试:- 增加
read_retry函数的重试次数和延迟参数。 - 在运行脚本前,暂时关闭一些不必要的后台服务。
- 考虑使用性能更好的传感器,如AHT20/BME280(I2C接口,抗干扰能力更强)。
- 增加
6.3 数据上传与显示类问题
问题现象:设备串口显示读取成功,但Adafruit IO仪表盘上没有数据。
- 检查1:Feed名称:确认代码中
io.feed(“temperature”)里的Feed名称,与你在Adafruit IO网站上创建的Feed名称完全一致,包括大小写。 - 检查2:Adafruit IO Monitor:登录Adafruit IO,点击顶部导航栏的“Monitor”。这是一个实时数据流监视器。查看是否有来自你设备的数据点流入,以及是否有任何错误信息(如“Invalid Key”)。这是诊断数据是否成功到达云端的最直接工具。
- 检查3:发送频率限制:免费版Adafruit IO对数据发送速率有限制。如果
delay时间太短,发送过于频繁,后续的数据点会被丢弃。确保发送间隔在合理范围内(建议大于2秒)。 - 检查4:图表时间范围:检查Dashboard上图表的“时间范围”设置。如果被意外设置为“最后1分钟”,而你的设备是5分钟前发送的数据,图表上就看不到。调整为“最后1小时”或“24小时”。
6.4 稳定性与优化建议
- 增加本地数据缓存:对于网络可能不稳定的环境(如使用移动热点的设备),可以在代码中增加一个简单的数据缓存队列。当网络断开时,将数据暂存在内存或SD卡中;网络恢复后,再将积压的数据批量上传。这可以避免数据丢失。
- 实现断线重连:Arduino的Adafruit IO库本身有较好的重连机制。在Python端,你可以用
try...except包裹aio.send()调用,并在发送失败时等待一段时间后重试,而不是让整个脚本崩溃。 - 降低功耗:对于电池供电的Arduino设备,除了增加发送间隔,还可以让ESP8266在每次发送数据后进入深度睡眠模式 (
ESP.deepSleep()),到时间后由定时器唤醒。这可以将平均电流从几十mA降到几十μA,极大延长续航。 - 数据预处理:在发送前,可以对读取到的数据进行简单的滤波处理,比如计算最近几次读数的平均值,以平滑掉传感器的偶然跳动,使图表曲线更平滑。
这个项目从硬件焊接、代码编写到云端配置,完整地走通了一个物联网应用的原型开发流程。它不仅仅是一个温湿度计,更是一个可扩展的框架。你可以轻松地将DHT22替换成土壤湿度传感器、光照传感器、空气质量传感器,或者将数据用于触发IFTTT、发送报警邮件,甚至与Home Assistant集成,构建更复杂的智能家居自动化场景。动手去实现它,过程中遇到的每一个问题和解法,都会让你对物联网系统的理解更深一层。