十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于ESP32与Blynk的智能温湿度监控系统:从硬件选型到代码实现

基于ESP32与Blynk的智能温湿度监控系统:从硬件选型到代码实现 1. 项目缘起为什么选择ESP32Blynk做温湿度监控最近在折腾家里的智能环境发现市面上的成品温湿度计要么数据不准要么功能单一要么就是数据孤岛没法跟家里的其他设备联动。作为一个喜欢动手的开发者我决定自己做一个。核心需求很简单实时监测家里几个关键点比如书房、卧室、阳台的温湿度数据要能远程查看最好还能设置个超限报警比如湿度太高提醒我开抽湿机。在选型上我几乎没怎么犹豫就锁定了ESP32Blynk这个组合。ESP32这颗芯片现在太火了双核240MHz主频内置Wi-Fi和蓝牙价格还便宜对于这种需要联网上报数据的物联网项目来说简直是“天选之子”。而Blynk平台对于快速搭建物联网应用原型特别友好。它提供了一个现成的手机App和云端服务你不需要从零开始写App和后端只需要在Blynk App里拖拽组件比如仪表盘、图表、按钮来设计界面然后在ESP32的代码里调用简单的API把数据发上去就行。整个过程从硬件接线到在手机上看到实时曲线可能一两个小时就能跑通非常适合个人项目或者快速验证想法。当然也有人会用MQTT自建服务器比如Home Assistant的方案功能更强大、更自主。但对于我这个只想快速实现核心监控功能并且希望家人不熟悉技术也能用手机轻松查看的项目来说Blynk的易用性是决定性的。它把复杂的网络通信、数据存储和UI渲染都封装好了我只需要关心传感器读数和对数据的简单处理逻辑。2. 硬件清单与核心电路解析这个项目的硬件部分非常精简核心就是三样主控、传感器、供电。下面是我实际使用的清单和背后的选型考量。2.1 核心器件选型理由主控ESP32开发板如ESP32 DevKitC V4为什么是ESP32除了上面提到的Wi-Fi/蓝牙和性能它的GPIO数量丰富支持多种通信协议I2C, SPI, UART并且有大量的社区资源和库支持。相比于Arduino Uno它原生具备无线能力相比于ESP8266它的性能更强、内存更大为后续功能扩展比如加个屏幕本地显示留足了余地。具体型号市面上常见的ESP32开发板引脚排列可能略有不同但核心功能一致。我用的就是最普通的ESP32 DevKitC价格大约在20-30元。购买时注意选择带有USB转串口芯片如CH340、CP2102的版本方便用USB线直接烧录程序。传感器DHT22AM2302为什么是DHT22温湿度传感器常见的有DHT11和DHT22。DHT11价格极低但精度和量程一般湿度±5%RH温度±2°C。DHT22价格稍高但精度更高湿度±2%RH温度±0.5°C量程也更宽湿度0-100%RH温度-40~80°C。对于家庭环境监测尤其是需要关注精确湿度变化比如防止书籍、乐器受潮的场景DHT22是更可靠的选择。它采用单总线通信只需要一根数据线接线非常简单。替代方案如果你追求更高的精度和稳定性可以考虑I2C接口的传感器如SHT30、BME280。BME280还能测量大气压。但DHT22在成本、精度和易用性上取得了很好的平衡。其他USB数据线Micro-B或Type-C用于供电和程序烧录。杜邦线母对母若干用于连接。可选10kΩ上拉电阻DHT22的数据线建议接一个上拉电阻到3.3V以确保信号稳定。有些开发板或传感器模块已经内置如果购买的是模块版通常不需要。2.2 电路连接详解接线非常简单但有几个关键点需要注意接错了可能烧毁传感器或无法读取数据。ESP32引脚连接至说明与注意事项3.3VDHT22 VCC (Pin 1)绝对不要接到5VDHT22虽然有些版本标称支持3.3V-5.5V但为了与ESP32的IO电平匹配强烈建议使用3.3V供电。ESP32的IO引脚耐受电压是3.3V接5V有风险。GNDDHT22 GND (Pin 4)共地确保电压参考基准一致。GPIO 4DHT22 DATA (Pin 2)数据引脚。选择GPIO 4是因为它是一个普通的数字IO且远离一些默认有特殊功能的引脚如GPIO 0/2常用于烧录模式。你也可以换成其他任何数字IO如16、17等。3.3V10kΩ电阻一端上拉电阻接法。10kΩ电阻另一端DHT22 DATA (Pin 2)将数据线通过电阻上拉到高电平。如果使用模块通常已集成。DHT22 Pin 3悬空 (NC)不需要连接。注意ESP32开发板的3.3V电源输出能力有限通常约500mA。如果你后续要连接很多外设如多个传感器、执行器需要考虑外部供电。但目前只接一个DHT22USB供电完全足够。实物连接时建议先断电操作。连接好后检查一遍VCC和GND是否接反DATA线是否接触良好。一个常见的坑是杜邦线接触不良导致数据读取失败。3. 软件环境搭建与Blynk项目创建硬件连好了接下来是让ESP32“活”起来的关键软件环境和云端配置。3.1 开发环境准备以Arduino IDE为例虽然可以用ESP-IDF但对于快速上手Arduino IDE的库生态和简单性是无与伦比的。安装Arduino IDE从官网下载并安装最新版1.8.x或2.0均可。添加ESP32开发板支持打开Arduino IDE进入文件 - 首选项。在“附加开发板管理器网址”中填入https://espressif.github.io/arduino-esp32/package_esp32_index.json如果已有其他URL用逗号隔开。点击“确定”。安装ESP32开发板进入工具 - 开发板 - 开发板管理器。搜索“esp32”找到由“Espressif Systems”提供的版本点击安装。这个过程需要下载一些工具链耗时可能较长请保持网络通畅。安装必要的库进入项目 - 加载库 - 管理库。搜索并安装“DHT sensor library”作者是Adafruit。这个库同时支持DHT11和DHT22。搜索并安装“Blynk” 作者是Volodymyr Shymanskyy。这是官方的Blynk库。3.2 创建并配置Blynk项目Blynk 2.0之后流程和之前有些变化。你需要手机App和Web端配合。下载Blynk App在手机应用商店搜索“Blynk IoT”并安装。注册/登录账号。创建新项目在App内点击“New Project”。项目名称起个名字比如“Home Monitor”。设备选择“ESP32 Dev Board”。这一步很重要它决定了后续的代码模板。连接类型选择“Wi-Fi”。点击“Create”。创建成功后你会收到一封包含“Auth Token”的邮件。这个Token是你设备连接Blynk云的唯一凭证相当于密码务必保存好不要泄露。你也可以在App的项目设置里找到它。设计仪表盘在项目页面你会看到一个空白的仪表盘。点击“”号添加组件。添加两个“Labeled Value”组件。分别用来显示温度和湿度。添加一个“Super Chart”组件。可以用来绘制温湿度随时间变化的曲线图。添加一个“Notification”组件。用于在温湿度超限时向手机发送报警。每个组件添加后都需要进行配置。例如点击一个“Labeled Value”组件在设置里PIN选择“Virtual Pin V0”假设我们用V0传温度。这里非常重要虚拟引脚Virtual Pin V0-V127是Blynk App与硬件代码之间数据交换的通道不是物理引脚。LABEL设置为“Temperature”。VALUE格式可以选“### °C”。同理设置另一个“Labeled Value”绑定到虚拟引脚V1用于湿度。设置“Super Chart”添加两个数据源分别绑定到V0和V1并设置好颜色和单位。设置“Notification”组件启用推送通知。至此一个简单的Blynk手机监控界面就设计好了。接下来就是让ESP32运行代码把真实数据填充到这个界面里。4. 核心代码编写与逐行解析环境配好了界面画好了最后也是最核心的一步编写并上传ESP32的代码。下面是我使用的完整代码并附上关键部分的详细解释。// 定义你的Wi-Fi和Blynk凭证 #define BLYNK_TEMPLATE_ID TMPLxxxxxx // 如果使用Blynk 2.0模板可能需要此项 #define BLYNK_TEMPLATE_NAME Device #define BLYNK_AUTH_TOKEN YourAuthTokenHere // 替换成你邮件里收到的Token // 引入必要的库 #include WiFi.h #include WiFiClient.h #include BlynkSimpleEsp32.h // Blynk库 for ESP32 #include DHT.h // DHT传感器库 // 你的Wi-Fi网络信息 char ssid[] YourWiFiSSID; char pass[] YourWiFiPassword; // DHT22传感器配置 #define DHTPIN 4 // 我们连接DHT22数据线的GPIO引脚 #define DHTTYPE DHT22 // 指定传感器类型为DHT22 (AM2302) DHT dht(DHTPIN, DHTTYPE); // 初始化DHT对象 // 定义读取传感器的间隔时间毫秒 // 注意DHT22两次读取之间至少需要2秒的间隔 const unsigned long sensorReadInterval 10000; // 每10秒读一次 unsigned long previousMillis 0; // 用于计时 // 定义报警阈值 float tempHighThreshold 28.0; // 温度高报警阈值(°C) float tempLowThreshold 18.0; // 温度低报警阈值(°C) float humiHighThreshold 70.0; // 湿度高报警阈值(%) float humiLowThreshold 30.0; // 湿度低报警阈值(%) // 报警状态标志防止重复报警 bool tempHighAlertSent false; bool tempLowAlertSent false; bool humiHighAlertSent false; bool humiLowAlertSent false; // Blynk虚拟引脚定义需与App中设置一致 #define VIRTUAL_PIN_TEMP V0 #define VIRTUAL_PIN_HUMI V1 void setup() { // 启动串口调试波特率115200 Serial.begin(115200); // 等待串口连接方便调试 delay(100); Serial.println(Booting Smart Home Temperature Humidity Monitor...); // 初始化DHT传感器 dht.begin(); Serial.println(DHT22 Sensor Initialized.); // 连接Wi-Fi和Blynk Serial.print(Connecting to WiFi: ); Serial.println(ssid); // 方式1使用Blynk.begin()自动连接WiFi和Blynk // Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); // 方式2手动连接WiFi再连接Blynk推荐便于错误处理 WiFi.begin(ssid, pass); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } Serial.println(); Serial.println(WiFi connected!); Serial.print(IP address: ); Serial.println(WiFi.localIP()); // 初始化Blynk连接 Blynk.config(BLYNK_AUTH_TOKEN); // 尝试连接Blynk服务器可设置超时 bool result Blynk.connect(); if(!result) { Serial.println(Blynk connection failed! Check your token and network.); // 这里可以加入失败处理如进入深度睡眠或重启 } else { Serial.println(Connected to Blynk server!); } // 可选向Blynk App发送一条启动通知 Blynk.logEvent(device_start, ESP32温湿度监控器已启动并上线); } void loop() { // 必须保持Blynk的运行 Blynk.run(); // 获取当前时间 unsigned long currentMillis millis(); // 检查是否到达读取传感器的时间间隔 if (currentMillis - previousMillis sensorReadInterval) { // 保存本次读取的时间点 previousMillis currentMillis; // 读取温湿度数据 float humidity dht.readHumidity(); float temperature dht.readTemperature(); // 默认为摄氏度 // 检查读取是否成功返回NaN表示失败 if (isnan(humidity) || isnan(temperature)) { Serial.println(Failed to read from DHT sensor!); // 可以向Blynk发送一个错误值或通知 Blynk.virtualWrite(VIRTUAL_PIN_TEMP, NAN); Blynk.virtualWrite(VIRTUAL_PIN_HUMI, NAN); return; // 跳过本次循环的后续处理 } // 打印到串口监视器用于本地调试 Serial.print(Temperature: ); Serial.print(temperature); Serial.print( °C\t); Serial.print(Humidity: ); Serial.print(humidity); Serial.println( %); // 发送数据到Blynk App的虚拟引脚 Blynk.virtualWrite(VIRTUAL_PIN_TEMP, temperature); Blynk.virtualWrite(VIRTUAL_PIN_HUMI, humidity); // 检查并触发报警逻辑 checkAndSendAlerts(temperature, humidity); } } // 报警检查函数 void checkAndSendAlerts(float temp, float humi) { // 温度高报警 if (temp tempHighThreshold) { if (!tempHighAlertSent) { String msg 警告温度过高当前温度: String(temp, 1) °C; Blynk.logEvent(high_temp_alert, msg); // 发送事件到App的Notification组件 Serial.println(msg); tempHighAlertSent true; } } else { tempHighAlertSent false; // 温度恢复正常重置报警标志 } // 温度低报警 if (temp tempLowThreshold) { if (!tempLowAlertSent) { String msg 警告温度过低当前温度: String(temp, 1) °C; Blynk.logEvent(low_temp_alert, msg); Serial.println(msg); tempLowAlertSent true; } } else { tempLowAlertSent false; } // 湿度高报警 if (humi humiHighThreshold) { if (!humiHighAlertSent) { String msg 警告湿度过高当前湿度: String(humi, 1) %; Blynk.logEvent(high_humi_alert, msg); Serial.println(msg); humiHighAlertSent true; } } else { humiHighAlertSent false; } // 湿度低报警 if (humi humiLowThreshold) { if (!humiLowAlertSent) { String msg 警告湿度过低当前湿度: String(humi, 1) %; Blynk.logEvent(low_humi_alert, msg); Serial.println(msg); humiLowAlertSent true; } } else { humiLowAlertSent false; } }4.1 代码关键点解析与避坑指南凭证替换这是最常出错的地方。务必将代码中的YourAuthTokenHere、YourWiFiSSID和YourWiFiPassword替换成你自己的信息。Token填错会导致无法连接Blynk云。DHT读取间隔sensorReadInterval我设置为10000毫秒10秒。DHT22传感器两次读取之间需要至少2秒的间隔设置太短如1秒会导致读取失败。对于环境监测10秒到1分钟的间隔都是合理的太频繁会增加网络流量和功耗。错误处理dht.readTemperature()和dht.readHumidity()可能会读取失败返回NaN。代码中通过isnan()函数进行了检查这是非常必要的。如果不检查当传感器接触不良或损坏时程序可能会发送错误数据或崩溃。Blynk连接策略我采用了先手动连接WiFi (WiFi.begin)再连接Blynk (Blynk.connect) 的方式。相比于Blynk.begin()这种方式让你能更清晰地看到连接过程并方便添加重连逻辑。在实际部署中网络可能不稳定你需要在loop()中检查WiFi.status()和Blynk.connected()并在断开时尝试重连。虚拟引脚Virtual Pin这是Blynk通信的核心概念。Blynk.virtualWrite(V0, temperature)这行代码意思是将temperature变量的值通过Blynk云发送到手机App中绑定在虚拟引脚V0的那个组件比如我们之前设置的Labeled Value。虚拟引脚是App和硬件之间约定的“通道号”与ESP32的物理引脚编号无关。报警逻辑优化代码中使用了tempHighAlertSent这样的标志位。这是为了防止在阈值上下波动时App在短时间内收到大量重复的报警推送。只有从“正常”状态首次进入“报警”状态时才会触发一次通知。当数据恢复正常后标志位被重置为下一次报警做好准备。Blynk事件EventsBlynk.logEvent(“high_temp_alert”, msg)是Blynk 2.0推荐的通知方式。你需要在App的Notification组件设置里启用对应事件名的通知。这种方式比旧版的Blynk.notify()更灵活可以管理不同级别、不同类型的事件。4.2 上传代码与测试在Arduino IDE中将代码粘贴进去并修改好凭证。工具 - 开发板选择你的ESP32型号如“ESP32 Dev Module”。工具 - 端口选择ESP32连接的COM口Windows或/dev/cu.usbserial-xxxMac。点击上传按钮。首次上传可能需要长按ESP32板子上的“BOOT”按钮进入下载模式具体看板子说明。上传成功后打开串口监视器工具 - 串口监视器波特率115200你将看到ESP32启动、连接WiFi和Blynk的日志。同时打开手机上的Blynk App刷新你的项目仪表盘。如果一切正常几秒钟内你就会看到温度和湿度的数值开始更新图表也开始绘制曲线。5. 部署优化与进阶玩法项目基本跑通了但要想让它真正可靠地长期运行成为智能家居的“基础设施”还需要一些优化和功能扩展。5.1 提升系统稳定性加入Wi-Fi和Blynk重连机制家庭Wi-Fi可能重启网络可能波动。一个健壮的程序必须能处理断线重连。可以在loop()中定期检查连接状态如果断开则尝试重新连接。更高级的做法是使用WiFi.setAutoReconnect(true)和Blynk库内置的断线重连功能需在Blynk.config后设置Blynk.connect()的超时和重试参数。看门狗定时器Watchdog Timer, WDTESP32内置硬件看门狗可以防止程序跑飞。如果主循环因为某种原因卡住看门狗会在超时后重启芯片。使用esp_task_wdt_init()和esp_task_wdt_add()可以启用它。深度睡眠以省电如果你的设备是电池供电那么功耗是关键。ESP32的深度睡眠模式功耗可以低至10μA。你可以让ESP32每10分钟唤醒一次读取传感器数据并发送到Blynk然后立刻再次进入深度睡眠。这需要修改电路让DHT22的电源由ESP32的一个GPIO控制在睡眠时彻底断电。代码上需要使用esp_deep_sleep_start()函数。5.2 功能扩展思路多传感器与数据融合一个ESP32有多个GPIO可以连接多个DHT22监控不同房间。只需为每个传感器定义不同的数据引脚和虚拟引脚即可。你甚至可以在Blynk App里为每个房间创建一个标签页Tab。本地显示增加一个OLED屏幕如0.96寸 SSD1306在断网或不想看手机时可以本地查看实时数据。这需要安装Adafruit_SSD1306和Adafruit_GFX库。历史数据存储与导出Blynk的免费账户对历史数据存储有限制。如果你需要长期记录和分析数据可以考虑使用Blynk付费计划提供更长的数据留存期。同步到其他平台在ESP32代码中除了发送给Blynk还可以通过HTTP POST或MQTT协议将数据同时发送到你自己的服务器如运行InfluxDB Grafana的树莓派或者第三方物联网平台如ThingsBoard、阿里云IoT。联动智能家居这才是智能化的精髓。Blynk App内置了“Webhook”组件和“Eventor”自动化工具。Webhook当温度超过30°C时Blynk云可以向你指定的URL比如IFTTT、Home Assistant的Webhook地址发送一个HTTP请求触发打开空调开关的动作。Eventor可以在App内设置简单的自动化规则例如“如果湿度V1 65%则控制连接在虚拟引脚V2上的开关组件打开”这个V2可以控制一个连接到ESP32的继电器进而控制抽湿机电源。5.3 实际部署的注意事项供电稳定性长期运行建议使用5V/1A以上的手机充电器通过USB供电避免使用电脑USB口可能供电不足或随电脑休眠断电。传感器放置DHT22不要放在阳光直射、空调出风口、加湿器旁边或墙角死角。应放置在能代表房间整体空气流通的位置离地1-1.5米为宜。外壳与安全使用3D打印或现成的塑料盒子为ESP32和传感器做一个简单的外壳既能保护电路也更美观。确保外壳有透气孔让传感器能接触到空气。固件升级OTA当你想更新代码时每次都拆下来用USB线烧录太麻烦。可以首次烧录时就加入OTAOver-The-Air升级功能的代码。这样以后就可以通过Wi-Fi网络直接上传新固件非常方便。Arduino IDE和PlatformIO都支持OTA。这个项目从想法到实现再到稳定运行我花了几个周末的时间。最大的体会是物联网项目的核心挑战往往不在代码本身而在稳定性和可维护性。一开始我的程序没有重连逻辑Wi-Fi一断就“死”了报警逻辑没有防抖湿度在临界值波动时手机被通知刷屏。通过不断迭代加入错误处理、状态标志和重连机制后这个小设备已经在我家稳定运行了半年多成为了我管理室内环境的得力助手。如果你也动手做了一个遇到任何问题不妨多看看串口打印的日志那里面通常藏着答案。
返回列表