基于ESP32与太阳能供电的户外PM2.5监测站DIY全攻略

发布时间:2026/6/5 6:35:14

基于ESP32与太阳能供电的户外PM2.5监测站DIY全攻略 1. 项目概述与核心价值最近在捣鼓一个挺有意思的小玩意儿一个完全靠太阳能供电能挂在窗外实时监测PM2.5和PM10浓度并且数据能直接推送到手机上的空气质量监测器。起因是看到一些关于冬季特定地区因供暖、逆温等导致颗粒物浓度飙升的讨论觉得如果能有一个成本低廉、部署简单、完全自给自足的工具让更多人能直观地看到身边的空气质量变化或许能激发大家对环境问题的关注和行动。这个项目的核心就是利用Arduino生态的易用性和ESP32强大的Wi-Fi连接能力结合专业的Honeywell激光颗粒物传感器打造一个“部署即忘”的物联网监测节点。整个系统由一块小型太阳能板充电通过低功耗定时器控制每两小时唤醒一次进行采样和上报最大限度延长续航实现真正的户外长期无人值守运行。最终数据通过Blynk这款极其友好的物联网平台以图表形式呈现在你的手机上。无论你是电子爱好者想亲手做一个实用的环境监测工具还是社区工作者、学校老师希望开展环境数据收集项目这个方案都提供了一个清晰、可复现的路径。它不仅仅是一个DIY作品更是一个理解物联网系统从传感、供电、通信到数据可视化全链条的绝佳实践案例。2. 硬件选型与设计思路解析一套稳定可靠的硬件是项目成功的基石。这里的选型逻辑紧紧围绕着“户外、低功耗、联网、精准”这几个核心需求展开。2.1 主控与传感器ESP32与Honeywell HPMA115S0主控芯片选择ESP32几乎是必然的。对于物联网项目ESP32提供了双核处理器、丰富的GPIO、蓝牙和最重要的——集成的Wi-Fi模块。这意味着我们无需额外添加Wi-Fi芯片大大简化了电路设计和编程复杂度。市面上有众多ESP32开发板本项目选用Adafruit的ESP32 Feather主要是看中其板型小巧、引脚布局清晰并且自带锂电池充电电路虽然本项目用外置充电模块但此设计为未来优化预留了空间。传感器的选择是精度和成本的平衡。市场上常见的颗粒物传感器主要有两类基于红外LED的如GP2Y1010AU0F和基于激光散射的如PMS5003系列、Honeywell HPMA系列。红外方案成本极低但精度和稳定性尤其是对PM2.5的区分能力远不如激光方案。对于希望获得可靠参考数据的项目激光传感器是更负责的选择。本项目采用的Honeywell HPMA115S0是一款性能优秀的激光颗粒物传感器。它通过激光照射空气中的颗粒并用光电探测器接收散射光通过算法计算出不同粒径如PM2.5, PM10的浓度。其输出为UART串行数据协议公开便于微控制器读取。相比一些更常见的型号Honeywell的这款传感器在长期稳定性和抗干扰方面口碑较好。需要注意的是它需要5V供电但逻辑电平是3.3V与ESP32完美兼容。注意在采购传感器时务必确认型号。HPMA115S0与常见的PMS5003引脚定义和通信协议不同代码不能直接混用。原项目描述中提到了“PMS5003”这可能是一个笔误或泛指根据其提供的链接和库文件实际使用的是Honeywell传感器。2.2 供电系统设计太阳能与低功耗管理户外长期运行的核心挑战是供电。我们的设计目标是白天太阳能充电全天候为系统供能并通过低功耗策略让设备“大部分时间在睡觉”。能量收集与存储采用一块5V/2.5W的封装式太阳能板。选择封装式环氧树脂或玻璃层压而非裸板是为了更好的户外耐候性。太阳能板的输出电压需要高于电池电压才能充电5V输出对于后续的充电电路是合适的。储能单元是一节常见的18650锂离子电池其容量大通常2000mAh以上、价格低廉、易于获取。充电管理TP4056模块是单节锂电池充电的“明星”产品价格仅需几元。它将太阳能板输出的5V电压转换为适合锂电池的充电曲线恒流、恒压。选择带保护板的版本至关重要这可以防止电池过充、过放、短路安全系数大增。电压升降与主供电系统中有两个电压需求传感器需要5V而ESP32和定时器需要3.3V。这里用了一个巧妙的设计使用PowerBoost 1000这类升压模块。它的输入是锂电池电压2.8V-4.2V输出稳定的5V。这个5V直接供给传感器。同时ESP32 Feather开发板本身有从5V降压到3.3V的电路因此可以从PowerBoost的5V输出取电。PowerBoost模块的另一个关键特性是有一个“使能”引脚拉低该引脚可以关闭5V输出从而切断传感器和ESP32的电源实现零功耗待机。低功耗定时唤醒这是实现超长续航的灵魂。Adafruit TPL5111是一款低功耗定时器芯片。它自身消耗的电流极低约几百纳安由一个独立的电源本例中直接接电池持续供电。它像一个严格的“闹钟”每隔设定的时间本例为2小时就输出一个短暂的脉冲信号。这个脉冲信号同时连接到PowerBoost的“使能”引脚和ESP32的某个GPIO配置为唤醒引脚。脉冲到来时PowerBoost使能输出5V整个系统上电ESP32也被脉冲从深度睡眠中唤醒开始工作。2.3 结构设计与外围配件外壳选用了一个大型的贝壳或容器状物品这并非只为美观。其流线型结构有助于引导气流自然通过传感器进气口避免雨水直灌同时为内部电路提供物理保护。这种“就地取材”的思路降低了成本也增添了独特性。在连接上除了必要的杜邦线建议使用热熔胶或硅胶对电线与电路板的连接点进行加固防止因风吹晃动导致接触不良。太阳能板需要一个万向节或可调角度的支架固定在壳体外以便根据安装朝向调整角度最大化光照接收。3. 电路连接与焊接实操要点理解了设计思路后动手连接就是按图索骥。为了更清晰下面将连接步骤分解并配上关键注意事项。3.1 电源链路连接这是整个系统稳定运行的基础务必优先并仔细完成。电池与充电模块将18650电池的正负极分别接入TP4056模块标有“B”和“B-”的焊盘。务必注意极性反接会损坏模块和电池。太阳能板与充电模块将太阳能板的正负极导线接入TP4056模块标有“IN”和“IN-”的焊盘。充电模块与电池输出TP4056模块的“OUT”和“OUT-”即是电池的电源输出端。将“OUT”连接到一个小型拨动开关的一端开关的另一端引出线作为整个系统的总正极。将“OUT-”直接作为整个系统的总负极。这个开关用于在需要长期维护或运输时彻底断开电池。总电源与升压模块将上一步得到的系统总正极连接到PowerBoost 1000的“VBAT”引脚总负极连接到“GND”。升压模块输出分配PowerBoost的“5V”输出引脚将同时供给两个地方一是Honeywell传感器的“VCC”引脚二是ESP32 Feather开发板的“USB”或“VIN”引脚注意查看开发板手册确认其可接受5V输入。PowerBoost的“GND”需要与传感器和ESP32的“GND”连接在一起共地是必须的。3.2 信号与控制链路连接传感器通信Honeywell HPMA115S0通过UART通信。将其“TX”引脚连接到ESP32的某个RX引脚例如GPIO16将其“RX”引脚连接到ESP32的某个TX引脚例如GPIO17。传感器的“GND”接系统GND。低功耗定时控制TPL5111定时器的“VCC”和“GND”直接连接到系统总正极和总负极即开关之后确保它一直有电。TPL5111的“Done”引脚连接到ESP32的一个GPIO例如GPIO13并配置为上拉输入。TPL5111的“DRV”引脚连接到PowerBoost 1000的“EN”使能引脚。关键连接还需要将TPL5111的“DRV”引脚同时连接到ESP32的“EN”引脚。这样定时器发出的唤醒脉冲既能开启升压模块也能让ESP32解除复位状态开始运行。3.3 焊接与加固工艺对于需要长期户外工作的设备可靠的物理连接比面包板上的临时插接重要得多。建议焊接所有电源线特别是电池、太阳能板连接处和关键信号线建议使用焊锡焊接并使用热缩管绝缘。应力消除在电线连接到电路板焊盘或排针的位置点上一小滴热熔胶让胶体包裹住焊点和一小段导线。这可以防止导线因频繁弯折而从焊点处断裂。绝缘处理确保所有裸露的焊点和导线都有绝缘保护防止在壳体内因移动而发生短路。可以使用电工胶带、热缩管或绝缘漆。功能测试在装入外壳前先进行分段测试。例如先单独测试TP4056能否给电池充电再测试PowerBoost能否正常输出5V最后再连接主控和传感器进行整体功能测试。4. 软件编程与Blynk平台配置硬件搭建完成后就需要赋予它“灵魂”。软件部分主要包括Arduino固件编程和Blynk云端的应用配置。4.1 Arduino开发环境与库准备首先确保你的Arduino IDE已安装ESP32开发板支持。可以通过“文件”-“首选项”-“附加开发板管理器网址”中添加ESP32的板支持网址然后在“工具”-“开发板”-“开发板管理器”中搜索安装。本项目需要两个关键的库Blynk库用于物联网通信。在Arduino IDE的库管理中搜索“Blynk”并安装。Honeywell HPMA115S0库可选但推荐虽然原项目作者因为低功耗问题选择了直接解析串口数据但使用官方或社区维护的库可以简化开发。你可以在GitHub上搜索“HPMA115S0”相关的Arduino库。如果使用库务必查看其示例代码了解初始化、读取数据的函数调用方式。4.2 固件代码逻辑剖析即使用库理解代码的核心逻辑也至关重要。以下是程序运行的主流程附上关键代码片段和解释。// 1. 定义引脚和变量 #define BLYNK_PRINT Serial #define TPL_DONE_PIN 13 // 连接TPL5111 Done引脚 #define WAKE_PIN 14 // 连接TPL5111 DRV引脚同时接ESP32 EN #define SENSOR_RX 16 #define SENSOR_TX 17 char auth[] “你的Blynk设备授权码”; char ssid[] “你的Wi-Fi名称”; char pass[] “你的Wi-Fi密码”; // 2. 初始化串口和Blynk void setup() { Serial.begin(115200); Serial1.begin(9600, SERIAL_8N1, SENSOR_RX, SENSOR_TX); // 初始化与传感器通信的串口1 pinMode(TPL_DONE_PIN, INPUT_PULLUP); pinMode(WAKE_PIN, INPUT_PULLUP); // 连接Wi-Fi和Blynk Blynk.begin(auth, ssid, pass); // 注意Blynk.begin可能会阻塞在户外网络不稳定时需考虑超时机制 } // 3. 主循环读取数据并上报 void loop() { Blynk.run(); // 维持Blynk连接心跳 if (readParticleData()) { // 自定义函数从串口1读取并解析传感器数据 float pm25 getPM25(); // 获取PM2.5值 float pm10 getPM10(); // 获取PM10值 int batteryLevel readBatteryLevel(); // 从模拟引脚读取电池电压并换算 // 将数据发送到Blynk虚拟引脚 Blynk.virtualWrite(V5, pm25); Blynk.virtualWrite(V6, pm10); Blynk.virtualWrite(V4, batteryLevel); // 数据发送完毕通知定时器进入睡眠 delay(100); // 确保数据发送完成 pinMode(TPL_DONE_PIN, OUTPUT); digitalWrite(TPL_DONE_PIN, LOW); // 向TPL5111发送完成信号 delay(200); // 此后TPL5111会切断电源ESP32断电。下次唤醒由定时器触发。 } else { // 读取数据失败可能也进入睡眠或者重试几次 // 为了省电建议直接进入睡眠流程 pinMode(TPL_DONE_PIN, OUTPUT); digitalWrite(TPL_DONE_PIN, LOW); delay(200); // ESP32断电 } } // 4. 电池电压读取示例 int readBatteryLevel() { // 假设电池电压通过分压电阻连接到ESP32的A13引脚ADC // ESP32的ADC参考电压通常为3.3V但需校准 int adcValue analogRead(A13); float voltage adcValue * (3.3 / 4095.0) * 2.0; // 假设分压比为1:1 // 将电压转换为百分比假设电池满电4.2V欠压3.0V int percentage map(voltage * 100, 300, 420, 0, 100); percentage constrain(percentage, 0, 100); return percentage; }关键逻辑解释唤醒与睡眠设备由TPL5111定时唤醒上电程序从setup()开始执行。完成数据读取和上报后通过拉低TPL_DONE_PIN通知定时器“任务完成”定时器随即切断DRV信号导致PowerBoost失能系统整体断电。这比ESP32自身的深度睡眠更彻底功耗几乎为零。数据解析readParticleData()函数需要根据Honeywell传感器的UART协议编写。协议通常是固定的数据头、长度、数据帧、校验和。你需要从Serial1中读取字节匹配数据头验证长度和校验和然后从数据帧中提取出PM2.5和PM10的数值。校验和错误的数据应丢弃。Blynk通信Blynk.virtualWrite是核心函数它将数据推送到Blynk云服务器对应的虚拟引脚上。手机App通过订阅这些虚拟引脚来接收数据。4.3 Blynk手机应用配置Blynk的强大之处在于其极简的移动端配置。创建项目在手机Blynk App中点击“New Project”。输入项目名选择硬件型号为“ESP32 Dev Board”连接方式为“Wi-Fi”。创建后你会收到一封包含Auth Token的邮件这个令牌需要填入上面代码的auth变量中。添加控件从控件箱中拖拽一个“SuperChart”到画布。点击刚添加的图表进行配置。在“DATA STREAMS”中你需要添加三个数据流V4类型选“Virtual Pin”数据流名称设为“Battery”单位是“%”。V5类型选“Virtual Pin”数据流名称设为“PM2.5”单位是“µg/m³”。V6类型选“Virtual Pin”数据流名称设为“PM10”单位是“µg/m³”。将这三个数据流都关联到同一个图表上你可以设置不同的颜色和图例。还可以设置图表的时间范围如1小时、24小时、1周。运行与测试将编译好的固件烧录到ESP32给设备上电。确保手机和ESP32在同一个Wi-Fi网络下。在Blynk App中点击播放按钮如果一切正常你很快就能在图表上看到来自设备的数据点。5. 组装、部署与校准当硬件和软件都准备就绪后最后的组装和部署环节决定了设备的最终可靠性和数据质量。5.1 内部组装与固定布局规划在将电路放入外壳前先规划好位置。传感器Honeywell的进气口和出气口必须畅通不能有遮挡最好对准外壳设计的通风口。太阳能板的导线需要引出壳外。电路板固定不建议让所有电路板在壳内“自由活动”。可以使用尼龙柱、螺丝或强度足够的双面胶如3M VHB胶带将主要的电路板ESP32、PowerBoost、TP4056、TPL5111固定在壳底或侧壁防止运输或风振导致脱落或短路。传感器安装用高质量的双面泡棉胶或硅胶将Honeywell传感器牢牢粘在壳内对准通风口的位置。确保其安装牢固因为振动可能影响激光元件的精度。导线整理用扎带或胶带将导线捆扎整齐避免杂乱。留出适当的余量防止拉扯。5.2 外壳密封与防水处理户外设备必须考虑防水防尘。出线孔密封太阳能板导线穿过外壳的地方是防水薄弱点。可以使用防水电缆接头PG接头或简单的办法在孔洞处打上充足的硅酮密封胶将导线包裹在胶体中待其固化后形成弹性密封。外壳接缝如果使用的贝壳或容器由两半扣合而成在接缝处涂抹一圈密封胶能有效防止水汽侵入。传感器透气与防水这是一个矛盾点。传感器需要空气流通但又不能进水。可以尝试在外壳通风口内侧粘贴一小块聚四氟乙烯防水透气膜。这种膜能阻挡液态水但允许空气分子通过是户外电子设备的常用材料。5.3 部署选址与安装太阳能因素选择一天中日照时间最长、遮挡最少的位置。朝南的墙面、阳台外侧、花园的立柱都是好选择。确保太阳能板的角度可以调整到大致面向正午太阳的方向。Wi-Fi信号使用手机在预设安装点测试Wi-Fi信号强度。确保信号良好通常-70dBm以上更稳定。如果信号弱可以考虑使用Wi-Fi中继器或者调整ESP32的天线方向如果外置。空气流通设备不应安装在死角或通风极差的地方。应代表该区域的一般空气状况避免靠近明显的污染源如厨房排气口或洁净源如空气净化器出口。安装固定使用牢固的挂钩、扎带或支架将设备固定防止被风吹落。同时考虑日后取下充电或维护的便利性。5.4 传感器读数校准进阶激光传感器本身出厂已校准但其读数可能受环境温湿度影响且不同厂商、不同原理的设备之间存在系统误差。对于追求更高数据可比性的用户可以考虑校准对比校准将你的DIY设备与一个已知准确度的商用监测仪如某品牌空气净化器的检测值或环保部门公布的监测站数据放在同一环境下一段时间至少24小时覆盖不同浓度时段。数据收集同时记录两个设备的读数。线性回归在电子表格中以商用设备读数为X轴DIY设备读数为Y轴绘制散点图并添加趋势线。得到公式Y aX b。软件修正在你的Arduino代码中在发送数据给Blynk之前将原始读数代入公式进行修正correctedValue a * rawValue b。这样得到的数值会更接近参考设备的水平。重要提示校准需要谨慎操作错误的校准公式会导致数据更不准确。对于一般性观测和趋势分析使用传感器原始数据通常已足够。6. 常见问题排查与优化建议在实际制作和运行中你可能会遇到一些问题。下面是一些常见故障的排查思路和解决方案。问题现象可能原因排查步骤与解决方案设备完全不上电1. 电池电量耗尽。2. 总电源开关未打开。3. 电源连线断路或虚焊。4. PowerBoost模块损坏。1. 用万用表测量电池电压应高于3.0V。连接太阳能板充电一段时间再试。2. 检查拨动开关是否在“ON”位置。3. 从电池开始逐段测量电压找到断路点并重新连接。4. 断开负载测量PowerBoost的5V输出若无输出则更换模块。设备上电但ESP32不启动1. PowerBoost输出电流不足。2. ESP32使能引脚未正确拉高。3. 固件问题如死循环。1. 确保PowerBoost 1000能提供1A电流。尝试单独给ESP32通过USB供电测试。2. 检查TPL5111的DRV引脚是否同时接到了PowerBoost EN和ESP32 EN。3. 尝试烧录一个最简单的Blink程序排除复杂代码导致崩溃的可能。Wi-Fi无法连接1. Wi-Fi名称或密码错误。2. 信号太弱。3. ESP32的Wi-Fi模块损坏或固件问题。1. 在代码中仔细核对SSID和密码注意大小写和特殊字符。2. 在部署点用手机测试信号强度考虑增加Wi-Fi中继。3. 尝试用其他Wi-Fi示例代码测试ESP32的Wi-Fi功能是否正常。Blynk App收不到数据1. Auth Token错误。2. 设备未成功连接互联网。3. 虚拟引脚号不匹配。4. Blynk服务器连接问题罕见。1. 检查代码中的auth是否与App项目创建时收到的一致。2. 在代码中添加串口打印确认ESP32已获取IP地址并尝试连接Blynk服务器。3. 检查代码中Blynk.virtualWrite使用的引脚号V4, V5, V6是否与App中控件绑定的虚拟引脚号完全一致。4. 检查路由器防火墙设置或尝试更换网络环境。传感器读数始终为0或异常1. 传感器供电不足非5V。2. UART接线错误TX/RX接反。3. 串口波特率设置错误。4. 传感器进气口被堵塞。5. 代码中数据解析逻辑错误。1. 用万用表测量传感器VCC引脚确保为稳定的5V。2. 交换连接ESP32和传感器之间的TX/RX线再试。3. Honeywell HPMA115S0通常使用9600波特率确认代码中Serial1.begin(9600, ...)设置正确。4. 检查并清理传感器进气口。5. 使用串口监视器直接打印从传感器接收到的原始字节对照数据手册检查协议格式和校验和。设备无法进入睡眠/耗电快1. TPL5111定时器未正确配置或损坏。2. “Done”信号未成功发送。3. 其他电路存在漏电。1. 测量TPL5111的DRV引脚看是否按设定间隔输出高电平脉冲。检查其定时电阻设置是否正确。2. 在代码中确保在发送完数据后有足够的延迟再拉低DONE引脚并保持低电平一段时间如200ms。3. 断开PowerBoost的输出测量电池端的待机电流应极低微安级。若偏高逐一排查各模块。太阳能充电无效1. 太阳能板朝向/遮挡问题。2. TP4056模块接线错误或损坏。3. 电池老化无法充入电。1. 在晴天正午测量太阳能板输出端电压应明显高于5V。2. 检查太阳能板正负极是否接反到TP4056的IN端。TP4056充电时会有指示灯。3. 更换一节已知良好的18650电池测试。优化建议数据本地缓存当前设计是“读取-上传-睡眠”。如果遇到网络临时中断数据会丢失。可以增加一个SPI Flash或EEPROM芯片在网络不可用时将数据暂存下次唤醒时尝试重传。多传感器集成ESP32引脚资源丰富可以轻松集成温湿度传感器如DHT22、SHT30、大气压传感器BMP280等构建一个综合环境监测站。离线警报可以在代码中加入逻辑当PM2.5浓度超过某个阈值时即使未到定时唤醒时间也主动唤醒并通过Blynk App发送通知警报。降低唤醒频率在空气质量稳定的季节或时段可以通过修改TPL5111的定时电阻将采样间隔从2小时延长到4小时或6小时进一步节省电能。外壳美化与标识对3D打印或手工制作的外壳进行打磨、上色并贴上简单的标识或二维码链接到数据说明页面让设备看起来更专业也便于向他人展示。这个项目从构思到实现涉及了硬件集成、低功耗设计、物联网通信和数据处理等多个层面。最让我有成就感的部分是看到它挂在窗外静静地吸收阳光定时“醒来”汇报数据真正成为一个自主运行的环境感知节点。过程中最大的教训是一定要在组装入壳前进行充分的分模块测试特别是低功耗睡眠-唤醒循环一旦封壳再调试就非常麻烦。希望这份详细的指南能帮助你成功打造属于自己的空气质量监测站用数据更清晰地感知我们所处的环境。

相关新闻