开源空气质量监测器OAQ:从传感器融合到AQI计算的DIY实践 1. 项目概述为什么我们需要一个开源的空气质量监测器空气污染这个看不见的“沉默杀手”每年影响着全球数百万人的健康。最令人不安的是许多身处污染环境中的人对自己呼吸的空气质量一无所知。传统的专业监测站虽然数据精准但数量稀少、成本高昂根本无法形成高密度的监测网络。世界卫生组织曾建议为了准确测量颗粒物每100米至少应有一个传感器。但现实情况是这个数字大约是每100米0.02个存在百倍的缺口。这意味着我们绝大多数人日常生活的微环境——办公室、卧室、通勤路上、公园里——其空气质量数据实际上是空白。正是这种数据鸿沟催生了像Project OAQOpen Air Quality Sampler这样的开源项目。它的核心目标非常明确将空气质量监测的能力“民主化”。不是要替代专业的实验室设备而是为普通人、创客、社区组织提供一个低成本、可定制、易于复制的工具让大家能够亲手测量并了解自己身边的空气。当每个人都能便捷地获取本地化的污染数据时从意识到行动的改变才会真正发生。OAQ的设计哲学深深植根于实用主义和可及性。它不是一个追求极限参数的高精尖仪器而是一个“够用就好”的务实方案。整套方案的目标成本控制在25美元以内所有组件均采用通孔封装只需一把电烙铁就能完成组装核心固件和外壳3D文件全部开源。你可以把它看作是一个环境数据的“瑞士军刀”——便携、多功能、由你掌控。无论是想监测家里的甲醛和二氧化碳浓度还是想记录上下班沿途的PM2.5变化甚至为你的智能家居系统增加一个环境感知触发器OAQ都提供了一个可靠的起点。2. 核心设计思路与方案选型2.1 需求定义从用户场景倒推硬件设计在动手画第一根线之前明确需求比选择任何一个传感器都重要。OAQ项目首先梳理了以下几个核心目标这些目标直接决定了后续每一个技术选型极致的成本控制25美元这是实现“民主化”的前提。过高的成本会将绝大多数感兴趣的人挡在门外。这意味着我们需要在传感器、主控、结构件等每一个环节进行权衡。极低的制作门槛无需SMD焊接表面贴装器件虽然小巧但需要热风枪、焊膏等工具对新手极不友好。坚持使用通孔元件仅凭一把普通电烙铁就能完成所有焊接极大地扩展了潜在的用户群体。全球可获取的组件避免使用那些只能在特定地区或通过特定渠道才能买到的“冷门”芯片或传感器。优先选择在主流电子商城如Adafruit、SparkFun、淘宝、LCSC都能找到的通用型号。内置充电与长续航18650电池便携设备必须摆脱电线的束缚。18650锂电池能量密度高、成本低廉、易于获取甚至可以从旧笔记本电池中拆取是DIY项目的理想选择。同时集成充电管理电路实现USB充电。可定制的3D打印外壳硬件是骨架外壳是皮肤。提供开源的可3D打印外壳文件允许用户根据自己拥有的传感器型号、安装位置或个人审美进行修改和再创作。简单且社区驱动的固件固件不应该是一个黑盒子。它需要结构清晰、注释完整并且预留足够的接口让其他开发者能够轻松地添加新传感器或功能。手机App进行数据交互设备本身可以独立工作但通过蓝牙低功耗与手机App连接能够提供更直观的数据可视化、历史记录查询和数据导出功能而无需复杂的网络配置。传感器融合与智能提醒单一传感器的数据可能存在误差或局限。通过融合多个传感器的读数如温湿度补偿颗粒物传感器可以提高数据的可靠性。此外设备能根据污染等级通过蜂鸣器发出不同强度的警报实现从“监测”到“预警”的跨越。智能家居集成潜力如Home Assistant通过开放数据接口或标准协议让监测数据不仅能被查看还能触发其他设备动作例如在PM2.5超标时自动打开空气净化器。2.2 主控与核心架构选择面对以上需求主控芯片的选择至关重要。它需要足够便宜、功耗低、性能足以处理多个传感器数据、并且具备蓝牙功能以实现与手机通信。为什么是ESP32经过综合评估ESP32系列芯片几乎是这个项目的唯一最优解。首先其成本极具竞争力一片ESP32开发板的价格可以低至3-4美元。其次它集成了双核处理器、Wi-Fi和蓝牙其中蓝牙低功耗正是我们手机连接所需要的。再者ESP32拥有庞大的Arduino社区支持意味着有海量的库和示例代码可供参考极大降低了固件开发难度。最后其深度睡眠模式下的超低功耗特性非常适合电池供电的便携设备。注意虽然ESP8266更便宜且也有Arduino支持但它缺乏蓝牙功能无法实现与手机的直接离线通信。如果选择ESP8266则必须依赖Wi-Fi联网上传数据这增加了使用的复杂性和场景限制例如在户外移动中。因此为了满足“手机App离线连接”这一核心需求ESP32是更合适的选择。系统架构简述 OAQ采用了一个典型的“传感器-主控-人机交互”分层架构。ESP32作为大脑通过I2C、UART等接口轮询或接收各个传感器的数据。处理后的数据一方面通过I2C驱动一个小型OLED屏幕进行实时显示另一方面存储在内部缓冲区并通过BLE广播等待手机App连接读取。一个独立的蜂鸣器驱动电路负责提供声音警报。整个系统由一颗18650锂电池供电通过一个集成充放电管理芯片的电路板进行安全充电和电压稳压。3. 传感器选型与融合策略解析传感器是项目的眼睛和鼻子选型直接决定了数据的价值和设备的成本。OAQ没有追求单一的高端传感器而是采用了一种务实且灵活的“传感器融合”策略。3.1 基础环境参数温湿度传感器选择DHT22的原因 测量颗粒物和气体浓度必须考虑环境温湿度的影响。例如高湿度可能导致光学颗粒物传感器将水雾误判为颗粒影响读数准确性。因此获取精确的温湿度数据用于后期补偿算法至关重要。DHT22或AM2302是一个经过时间检验的选择。它价格适中约3-5美元精度足以满足民用需求温度±0.5°C湿度±2%RH并且提供了简单的单总线数字接口仅需一个GPIO引脚即可读取节省了主控的宝贵资源。3.2 关键气体指标二氧化碳与VOC探测选择MQ-135的考量 室内空气质量中二氧化碳浓度是衡量通风状况的重要指标而总挥发性有机物则是衡量装修污染、家具释放等化学污染的关键。MQ-135是一种半导体式气敏传感器对二氧化碳、苯、酒精、烟雾等多种气体都有响应。选择它最主要的原因是成本极低约1-2美元和电路简单。它本质上是一个可变电阻通过一个简单的分压电路接入ESP32的ADC引脚即可读取。实操心得MQ系列传感器的使用要点MQ传感器需要预热通常5-30分钟才能稳定且读数受环境温湿度影响大。在实际代码中不能直接将其ADC读数当作精确的ppm浓度。标准的做法是在洁净空气户外中获取一个基准值R0。根据传感器数据手册中的电阻-浓度曲线公式将实时读取的传感器电阻Rs与R0的比值换算成目标气体的近似浓度。引入DHT22读取的温湿度数据进行补偿修正。虽然精度无法媲美数千元的NDIR红外CO2传感器但对于判断“通风不足”、“污染显著升高”这类趋势性场景MQ-135已经完全够用。3.3 核心挑战颗粒物传感器的“兼容性”设计这是OAQ设计中最具巧思的部分。颗粒物传感器是成本大头从几美元到上百美元的型号性能差异巨大且供应情况不稳定。面临的现实问题型号繁多市场上有PMS5003攀藤、SDS011诺方、SPS30盛思锐、ZH03哲闻等多个主流型号。接口不一主要是UART串口但协议、数据帧格式、引脚定义各不相同。成本与精度权衡廉价的SDS011和PMS5003能满足大部分民用需求而高端的SPS30精度更高、寿命更长但价格也贵数倍。OAQ的解决方案硬件兼容 软件适配与其绑定某一个传感器不如设计一个能兼容多种型号的通用方案。OAQ的PCB设计了一个标准的传感器接口插座统一提供5V、GND和一个UART TX/RX引脚对。关键在于这个UART接口连接到了ESP32的任意一个硬件串口如Serial2。固件层面的融合策略 固件中会预置或允许用户选择当前使用的传感器型号。根据选择调用不同的解码函数来解析从对应串口接收到的原始数据帧最终统一换算成PM1.0、PM2.5、PM10的质量浓度值μg/m³。// 伪代码示例传感器数据解析路由 PMData readPMSensor(SensorType type) { PMData result; switch(type) { case PMS5003: result decodePMS5003(serial2.readBuffer()); // 解析攀藤协议 break; case SDS011: result decodeSDS011(serial2.readBuffer()); // 解析诺方协议 break; case SPS30: result decodeSPS30(serial2.readBuffer()); // 解析盛思锐I2C/UART协议 break; default: result {0,0,0}; } // 此处可加入基于温湿度的数据补偿算法 compensateWithTH(result, temperature, humidity); return result; }这种设计带来了巨大灵活性用户可以根据预算和精度要求自由选择传感器。今天可以先用便宜的SDS011搭建原型明天升级到SPS30也无需改动主板只需更新固件配置即可。这真正体现了开源硬件的“可演进”优势。4. 从原理到实践AQI的计算方法与实现4.1 AQI到底是什么空气质量指数是一个将多种污染物的复杂浓度数据转化为一个单一、易懂的数字分级指标的系统。它的核心目的是服务公众健康让人们快速理解当前空气污染的健康风险等级。例如AQI 150意味着“对所有人开始产生健康影响”而AQI 50则代表“空气质量优良”。需要明确的是AQI是一个“指数”而非某种污染物的直接浓度。它是通过一套分段线性公式将每种污染物的实测浓度映射到一个0-500或更高的指数子集上最后取所有污染物子指数中的最大值作为最终的AQI值。4.2 AQI的计算公式拆解全球不同国家和地区有不同的AQI计算标准如中国的HJ 633-2012美国的EPA标准。OAQ项目采用了国际上较为通用的分段线性插值法其核心公式如下对于某种污染物 [ I_p \frac{I_{high} - I_{low}}{BP_{high} - BP_{low}} \times (C_p - BP_{low}) I_{low} ]其中( I_p )该污染物的空气质量分指数。( C_p )该污染物的实测浓度值。( BP_{high} ), ( BP_{low} )在AQI分级表中与 ( C_p ) 所处浓度区间对应的浓度限值高值和低值。( I_{high} ), ( I_{low} )在AQI分级表中与上述浓度区间对应的指数限值高值和低值。让我们用一个实例来演练 假设OAQ测得PM2.5的浓度 ( C_p 42 \mu g/m^3 )。参考某AQI分级表例如美国EPA标准PM2.5的24小时平均浓度限值区间如下表所示AQI指数范围空气质量等级PM2.5浓度范围 (μg/m³)0 - 50优0.0 - 12.051 - 100良12.1 - 35.4101 - 150轻度污染35.5 - 55.4151 - 200中度污染55.5 - 150.4201 - 300重度污染150.5 - 250.4301 - 500严重污染250.5 - 500.442 μg/m³ 落在35.5-55.4区间内对应的AQI指数区间是101-150。因此( I_{high} 150 ), ( I_{low} 101 )( BP_{high} 55.4 ), ( BP_{low} 35.5 )( C_p 42 )代入公式 [ I_p \frac{150 - 101}{55.4 - 35.5} \times (42 - 35.5) 101 ] [ I_p \frac{49}{19.9} \times 6.5 101 \approx 2.462 \times 6.5 101 \approx 16.0 101 117 ]所以PM2.5的分指数 ( I_p ) 约为117。4.3 在固件中实现AQI计算在OAQ的Arduino固件中我们需要为每种支持的污染物PM2.5, PM10, CO2等实现一个计算函数。以下是一个简化的代码框架// 定义AQI分级表结构体 typedef struct { float concLow; // 浓度下限 float concHigh; // 浓度上限 int indexLow; // 指数下限 int indexHigh; // 指数上限 } AQI_Breakpoint; // PM2.5的AQI分级表 (示例请根据采用的标准替换) AQI_Breakpoint pm25Table[] { {0.0, 12.0, 0, 50}, {12.1, 35.4, 51, 100}, {35.5, 55.4, 101, 150}, {55.5, 150.4, 151, 200}, {150.5, 250.4, 201, 300}, {250.5, 500.4, 301, 500} }; int calculateAQI(float concentration, AQI_Breakpoint* table, int tableSize) { for (int i 0; i tableSize; i) { if (concentration table[i].concLow concentration table[i].concHigh) { // 应用分段线性公式 return (int)((float)(table[i].indexHigh - table[i].indexLow) / (table[i].concHigh - table[i].concLow) * (concentration - table[i].concLow) table[i].indexLow); } } // 如果浓度超出最高范围返回最大值如500 return 500; } // 在主循环中调用 void loop() { float pm25 getPM25Concentration(); // 从传感器读取 int pm25AQI calculateAQI(pm25, pm25Table, 6); float pm10 getPM10Concentration(); int pm10AQI calculateAQI(pm10, pm10Table, 6); // 需要定义pm10Table // 最终AQI取所有分指数中的最大值 int finalAQI max(pm25AQI, pm10AQI); // ... 更新显示和触发警报 }关键注意事项标准一致性务必确定你的AQI计算遵循哪一种标准中国、美国、印度等并使用对应的浓度限值表。不同标准结果差异可能很大。平均时间AQI通常是基于24小时或1小时的平均浓度计算。对于实时显示的设备更常见的是计算1小时滑动平均或实时浓度对应的“即时AQI”但这可能与官方发布的24小时平均AQI有出入需要向用户说明。CO2的AQI很多标准AQI不包含CO2。OAQ可能参考了室内空气质量指南如1000ppm以上认为通风不良将其浓度映射到一个自定义的指数范围再与其他污染物指数取最大值。5. 硬件实现从面包板到定制PCB5.1 原型验证在面包板上“搭积木”任何硬件项目的第一步都应该是面包板验证。这个阶段的目标不是美观而是快速验证“逻辑可行性”所有传感器能否被主控正确驱动供电是否充足数据通信是否正常我的面包板搭建顺序电源核心首先搭建18650电池座、充放电管理芯片如TP4056和稳压模块将电池电压降至3.3V和5V。用万用表确认各电压输出正常。主控最小系统插入ESP32开发板连接电源。上传一个简单的Blink程序确保核心功能正常。逐个添加传感器遵循“加电一个调试一个”的原则。先接DHT22写代码读取温湿度再接MQ-135读取ADC值最后接颗粒物传感器如PMS5003通过串口调试助手查看原始数据帧是否正常。集成外设连接OLED屏幕I2C测试显示连接蜂鸣器通过一个三极管驱动测试发声。踩坑记录电源噪声问题在面包板阶段当我同时启用Wi-Fi、蓝牙并驱动多个传感器时偶尔会出现ESP32重启或传感器读数跳变的情况。这通常是瞬间电流过大导致电源电压跌落造成的。面包板的连接电阻和分布电感比PCB大得多在高频或大电流下问题更明显。解决方案是在ESP32的3.3V输入引脚和GND之间以及5V电源入口处就近焊接一个100μF的电解电容和一个0.1μF的陶瓷电容用于缓冲和滤波。这个经验直接应用到了后续的PCB设计中。5.2 PCB设计在约束中寻求最优解验证通过后就可以开始设计印刷电路板了。OAQ的PCB设计遵循了“紧凑、易焊、模块化”的原则。核心约束与设计决策尺寸最小化52mm x 30mm小的PCB能降低打样成本也更易于放入小巧的外壳。通过使用双面布局和合理的走线将所有必要元件压缩在这个尺寸内。坚持通孔元件如前所述为了制作友好所有电阻、电容、接口都选用通孔封装。这略微增大了面积但价值巨大。清晰的接口分区PCB布局上将电源区电池接口、充电芯片、稳压电路、主控区ESP32及外围电路、传感器接口区分别标出UART、I2C、ADC引脚明确分开便于理解和焊接。传感器接口标准化设计了一个标准的4针5V GND TX RX通孔插座作为颗粒物传感器接口。无论用户使用哪种型号只需按照其引脚定义制作一条杜邦线转接线即可接入。充分的测试点和丝印在关键信号点如串口、I2C、ADC添加了测试点方便调试。丝印层清晰标注了每个元件的位置、极性和接口功能这对焊接和日后排错至关重要。PCB打样与焊接建议打样目前国内5-10块双面板的打样成本极低通常30-50元人民币即可。建议选择有铅喷锡工艺焊接更容易。焊接顺序先焊高度最低的元件如电阻、电容、IC插座再焊较高的元件如排针、接口、电池座。焊接ESP32模组时温度不要过高建议350°C左右先固定对角两个引脚再快速焊接其余引脚避免长时间加热损坏内部芯片。6. 结构设计打造一个“像充电宝”的监测器6.1 工业设计理念低调与实用OAQ的外形设计灵感来源于充电宝这是一个深思熟虑的选择。一个好的消费产品设计尤其是涉及环境监测这种可能带有“焦虑感”的产品应该努力降低用户的“心理负担”和“社交压力”。为什么是充电宝造型认知亲和充电宝是现代人日常携带、再熟悉不过的物品。采用这个造型设备在背包里、桌面上都不会显得突兀避免了传统检测仪那种“工业仪器”的疏离感。功能暗示它内置电池需要充电外形暗示了其“可移动、自供电”的特性。空间利用充电宝常见的扁平长方体造型内部空间规整非常适合分层布局主板、电池和传感器。进气设计可以在外壳侧面设计隐蔽的栅格或缝隙作为进气口既保证空气流通又不破坏整体造型。6.2 使用Fusion 360进行3D设计使用参数化建模软件如Fusion 360可以让你在虚拟空间中精确地组装所有电子元件进行干涉检查这是成功3D打印的关键。我的设计流程精确建模首先根据PCB厂商提供的Gerber文件或尺寸图精确建立PCB的3D模型。同样为18650电池、OLED屏幕、各个传感器建立或下载准确的3D模型。虚拟装配将所有3D模型导入一个装配体按照设想的布局摆放。核心原则是主板在下电池平铺传感器尤其是颗粒物传感器的风扇进气口朝向侧面栅格屏幕朝向正面。设计外壳根据装配体的大小设计一个包裹它的外壳。外壳分为底盖和面盖两部分通过卡扣或螺丝固定。需要特别注意壁厚通常打印厚度设为1.2mm-2mm以保证强度。公差PCB和外壳之间需要留出0.2mm-0.3mm的间隙避免装不进去。卡扣的配合部分也需要预留弹性空间。按钮设计这是难点。需要在PCB上的微动开关正上方设计一个外壳上的“按钮柱”。按钮柱与外壳本体通过一个薄壁的“活铰链”连接这样按下时有弹性反馈。需要多次打印测试来调整按钮柱的长度和活铰链的厚度以达到最佳手感。进气与出气风道确保颗粒物传感器风扇前方有足够的进气空间后方有排气通道避免气流短路导致测量不准。可以在传感器周围设计一些导流肋。6.3 3D打印与迭代设计完成后导出STL文件进行3D打印。PLA材料是最常见的选择价格便宜打印成功率高。打印与后处理建议层高0.2mm层高可以在打印速度和表面光洁度之间取得良好平衡。填充率15%-20%的填充率足以提供足够的强度同时节省材料和时间。支撑对于悬空结构如按钮下方的空隙、内部卡扣需要生成支撑。支撑面通常比较粗糙需要仔细拆除并用砂纸打磨。迭代是常态不要指望一次成功。我的第一个版本按钮按不动第二个版本屏幕装歪第三个版本传感器卡太紧……前后打印了不下七八个版本才得到满意的结果。每次修改后可以只打印修改的部分如仅打印面盖来验证节省时间和耗材。7. 固件开发与功能实现7.1 固件架构设计一个健壮的固件应该模块清晰、易于维护和扩展。OAQ的固件大致分为以下几个模块传感器驱动层为每种传感器编写独立的.h和.cpp文件如DHT22.cpp,PMSx003.cpp。这些文件只负责与硬件通信和读取原始数据。数据模型层定义统一的数据结构来存放所有传感器读数例如一个SensorData结构体包含temp,humi,pm25,co2等字段。业务逻辑层这是核心包含传感器管理器周期性地调用各个驱动函数读取数据。数据处理单元对原始数据进行滤波如滑动平均、单位换算、AQI计算。状态机管理设备的不同状态如启动、测量、睡眠、连接。人机交互层负责OLED显示刷新、按钮扫描短按切换显示页面长按开关蜂鸣器、蜂鸣器控制根据AQI值改变鸣响频率。通信层实现BLE服务将SensorData结构体中的数据按照自定义的特征值格式广播出去供手机App读取。7.2 低功耗与电源管理对于电池设备功耗决定续航。ESP32的深度睡眠模式是省电利器。我的功耗优化策略测量周期化不是持续测量而是每隔一段时间如5分钟唤醒一次。唤醒后快速启动传感器、读取数据、计算AQI、更新显示和BLE广播然后迅速返回深度睡眠。外设电源控制在PCB上使用MOS管为功耗较高的颗粒物传感器风扇和屏幕背光单独供电。在ESP32进入深度睡眠前通过GPIO关闭这些MOS管彻底切断它们的电源。Wi-Fi的取舍本项目只使用BLE因为Wi-Fi在连接和传输时功耗巨大。如果需要远程上传数据更优的策略是设备平时深度睡眠仅通过BLE与手机交互由手机App负责在连接时将历史数据通过手机网络上传到云端。实测续航在采用18650电池容量约2000-3000mAh设置10分钟测量一次的周期下设备可以轻松续航数周甚至一个月。7.3 BLE通信协议设计为了让手机App能理解数据需要定义一个简单的BLE服务。创建服务定义一个唯一的UUID作为主服务例如0xFFF0。定义特征值在该服务下创建多个特征值用于传输不同类型的数据特征1读/通知用于传输实时数据包。可以设计一个包含温度、湿度、PM2.5、PM10、CO2、AQI等字段的二进制结构体一次性发送。特征2写用于接收手机App的指令如修改测量间隔、开关蜂鸣器、重启设备等。特征3读用于传输设备信息如固件版本、电池电压。数据序列化将SensorData结构体转换为字节数组通过BLE发送。在手机App端按照同样的格式解析。8. 手机App与数据可视化一个简单的手机App可以极大提升用户体验。对于OAQApp的核心功能是数据接收、实时显示、历史记录和简单分析。开发框架选择对于这类IoT项目使用跨平台框架如Flutter或React Native是高效的选择。它们可以同时生成iOS和Android应用且对BLE的支持已经很好。App核心功能点设备扫描与连接列出附近的OAQ设备点击连接。仪表盘以数字和仪表盘形式实时显示所有传感器数据和AQI。历史图表App在本地存储接收到的数据并可以绘制出过去几小时或几天的变化曲线特别是PM2.5和AQI的趋势图。数据导出允许用户将历史数据导出为CSV或TXT文件方便在电脑上用Excel等进行进一步分析。设备设置提供界面让用户修改设备端的参数通过BLE写入特征值实现。警报推送当设备通过BLE传输的AQI值超过用户设定的阈值时App可以发送手机本地通知。9. 常见问题与故障排查在组装和使用OAQ的过程中你可能会遇到以下问题。这里提供一个快速排查指南问题现象可能原因排查步骤与解决方案设备无法开机1. 电池电量耗尽。2. 电源开关损坏或未打开。3. PCB上电源电路焊接问题如稳压芯片、二极管反接。1. 连接USB充电器查看充电指示灯是否亮起。2. 用万用表测量电池电压应高于3.0V测量稳压芯片输出应为3.3V。3. 检查电源开关通断是否正常。OLED屏幕不显示1. 屏幕供电或I2C线路接触不良。2. I2C地址错误。3. 屏幕本身损坏。1. 检查屏幕与PCB连接的4根线VCC, GND, SCL, SDA是否虚焊。2. 使用I2C扫描程序Arduino有示例检查设备地址常见地址是0x3C或0x3D。3. 更换一个已知好的屏幕测试。传感器读数全为01. 传感器未正确供电。2. 通信接口UART/I2C错误。3. 固件中传感器型号选择错误。1. 测量传感器VCC引脚是否有5V或3.3V电压。2. 用逻辑分析仪或另一个USB转串口工具监听传感器TX引脚看是否有数据输出。3. 确认固件中#define SENSOR_TYPE的型号与你实际使用的相符。PM2.5读数异常高或为01. 传感器进气口被堵塞或遮挡。2. 高湿度环境导致误判。3. 传感器风扇不转。1. 检查外壳进气栅格是否通畅传感器激光孔是否清洁。2. 观察湿度读数尝试在干燥环境下对比测试。高质量的传感器固件应包含湿度补偿算法。3. 听声音或观察传感器内部确认风扇是否在通电后启动。BLE无法连接1. 手机蓝牙未打开或权限未授予。2. ESP32的BLE库初始化失败。3. 设备不在广播状态。1. 重启手机蓝牙确认App有定位或蓝牙权限。2. 检查串口日志查看ESP32启动时BLE初始化是否报错。3. 使用通用的BLE扫描App如nRF Connect查看是否能搜索到名为“OAQ-XXX”的设备。蜂鸣器不响或常响1. 驱动三极管或MOS管焊接错误。2. 控制蜂鸣器的GPIO引脚配置错误。3. 蜂鸣器本身损坏。1. 检查蜂鸣器驱动电路确认NPN三极管的基极通过限流电阻连接GPIO集电极接蜂鸣器至VCC发射极接地。2. 在代码中手动设置该GPIO为高电平测试蜂鸣器是否响。3. 用万用表通断档直接测试蜂鸣器两端应有轻微“嗒”声和阻值。最后一点心得开源硬件项目的乐趣和挑战在于你面对的不是一个完美的黑箱商品而是一个可以无限调试、修改和理解的系统。遇到问题从电源开始用万用表逐步测量善用串口打印调试信息将问题拆解为最小的单元进行测试。每一次成功的排错都是对系统理解的一次加深。OAQ提供了一个可靠的起点但它的最终形态取决于你如何用它去观察、记录和改善你周围的那一方空气。