1. 项目概述:为什么我们需要一个开源的空气质量监测器?
空气污染,这个看不见的“沉默杀手”,每年影响着全球数百万人的健康。最令人不安的是,许多身处污染环境中的人,对自己呼吸的空气质量一无所知。传统的专业监测站虽然数据精准,但数量稀少、成本高昂,根本无法形成高密度的监测网络。世界卫生组织曾建议,为了准确测量颗粒物,每100米至少应有一个传感器。但现实情况是,这个数字大约是每100米0.02个,存在百倍的缺口。这意味着,我们绝大多数人日常生活的微环境——办公室、卧室、通勤路上、公园里——其空气质量数据实际上是空白。
正是这种数据鸿沟,催生了像Project OAQ(Open 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.0 |
| 51 - 100 | 良 | 12.1 - 35.4 |
| 101 - 150 | 轻度污染 | 35.5 - 55.4 |
| 151 - 200 | 中度污染 | 55.5 - 150.4 |
| 201 - 300 | 重度污染 | 150.5 - 250.4 |
| 301 - 500 | 严重污染 | 250.5 - 500.4 |
42 μ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. 硬件实现:从面包板到定制PCB
5.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可以极大提升用户体验。对于OAQ,App的核心功能是数据接收、实时显示、历史记录和简单分析。
开发框架选择:对于这类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. 更换一个已知好的屏幕测试。 |
| 传感器读数全为0 | 1. 传感器未正确供电。 2. 通信接口(UART/I2C)错误。 3. 固件中传感器型号选择错误。 | 1. 测量传感器VCC引脚是否有5V或3.3V电压。 2. 用逻辑分析仪或另一个USB转串口工具监听传感器TX引脚,看是否有数据输出。 3. 确认固件中 #define SENSOR_TYPE的型号与你实际使用的相符。 |
| PM2.5读数异常高或为0 | 1. 传感器进气口被堵塞或遮挡。 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提供了一个可靠的起点,但它的最终形态,取决于你如何用它去观察、记录和改善你周围的那一方空气。