2、环境监测基础:常见环境参数、传感器选型与数据采集原理

在进入 TinyML 模型设计与端侧部署之前,必须先建立对“被测量对象”的清晰认知。环境监测并非简单地把传感器接到开发板上读取数值,而是涉及物理量到电信号、电信号到数字量、数字量到工程单位的三级转换链路。本章将围绕温度、湿度、空气质量、光照四类最常见参数,讲解其物理意义、传感器工作原理、选型关键指标以及数据采集链路中的噪声与误差控制,为后续 ONNX 模型的输入特征工程和端侧推理奠定基础。

环境监测数据采集与传感器选型链路 物理量层 温度(℃/K) 湿度(%RH) PM2.5/CO₂(μg/m³) 光照(lux) 感知 传感器层 NTC/DS18B20 DHT22/SHT30 SGP30/PMS5003 BH1750/TSL2561 电信号 信号调理层 放大/滤波 ADC采样 I²C/SPI/UART 校准/补偿 数字量 边缘计算 MCU/MPU TinyML ONNX Runtime 推理输出 选型核心维度 精度与分辨率 测量范围/误差带 ADC位数/分辨率 长期漂移特性 功耗与接口 工作电流/待机电流 I²C/SPI/模拟输出 供电电压范围 响应时间 T90/T63 响应 采样间隔要求 动态跟踪能力 环境鲁棒性 温漂/湿敏特性 抗污染/防护等级 寿命与更换周期

2.1 核心原理:从物理量到数字量的三级转换

环境监测的本质是将自然界中的物理或化学量转换为计算机可处理的数字信号。以温度为例,其转换链路为:温度变化引起传感器材料电阻或PN结电压变化,该模拟电信号经过放大和模数转换(ADC)后变为离散数字值,最后通过标定公式换算为摄氏度或开尔文。这条链路中的每一级都会引入误差,理解误差来源是后续数据预处理和模型训练的关键。

对于湿度测量,常见电容式湿度传感器利用高分子薄膜的介电常数随相对湿度变化的特性。当环境湿度改变时,薄膜吸收或释放水分子,导致电容值变化,通过RC振荡电路或电容-频率转换电路将电容变化转化为可测量的频率或数字信号。值得注意的是,湿度传感器对温度敏感,因此大多数数字湿度传感器(如SHT30)内部集成了温度补偿机制,在读取湿度数据时需同时读取温度值进行修正。

空气质量监测则更为复杂,涉及颗粒物(PM2.5/PM10)和气体(CO₂、VOC、CO等)两类对象。颗粒物传感器通常采用激光散射原理:激光照射空气中的颗粒物,产生与粒径和浓度相关的散射光,光电二极管将散射光强度转换为电信号,再通过Mie散射理论反演出颗粒物质量浓度。气体传感器则多采用金属氧化物半导体(MOX)原理,气体分子在加热的金属氧化物表面发生氧化还原反应,改变材料电导率,通过测量电导率变化推算气体浓度。

光照强度测量相对简单,光敏二极管或光敏电阻将光通量转换为电流或电阻值。数字光照传感器(如BH1750)内部集成光电二极管、积分放大器和ADC,直接输出以lux为单位的照度值,其光谱响应特性经过校正,接近人眼视觉函数。

关键认知:传感器输出的原始值并非物理量本身,而是与物理量存在特定函数关系的电信号。TinyML 模型训练时使用的输入特征,应当是基于传感器原始值经过标定和归一化后的工程单位数值,而非未经处理的ADC裸值。这要求我们在数据采集阶段就建立完整的标定流程。

2.2 传感器选型:关键指标与对比分析

传感器选型需要综合考量精度、量程、功耗、接口、尺寸、成本和长期稳定性。下表对比了四类环境参数的主流传感器方案,帮助开发者根据项目约束做出合理选择。

参数类型 传感器型号 测量范围 精度/分辨率 接口 功耗 典型应用场景
温度 DS18B20 -55~125℃ ±0.5℃ / 0.0625℃ 1-Wire ~1mA 工业环境、冷链监测
温度+湿度 SHT30 -40~125℃ / 0~100%RH ±0.3℃ / ±2%RH I²C ~0.2mA(平均) 室内环境、暖通控制
温度+湿度 DHT22 -40~80℃ / 0~100%RH ±0.5℃ / ±2%RH 单总线 ~1.5mA 低成本消费类产品
空气质量(颗粒物) PMS5003 0.3~1.0μm 粒子数 ±10%读数 UART/I²C ~20mA(含风扇) 空气净化器、室外站
空气质量(气体) SGP30 400~60000ppm CO₂eq ±15%读数 I²C ~48mA(加热) 室内空气质量监测
光照 BH1750 1~65535 lux ±20%读数 I²C ~0.12mA 智能照明、农业补光

选型时需注意几个容易被忽视的维度。第一,响应时间:对于需要实时反馈的应用(如自动通风系统),应选择T90响应时间小于10秒的传感器;而对于长期趋势监测,响应时间要求可放宽。第二,长期漂移:MOX气体传感器在运行数百小时后基线会漂移,需要定期校准或使用自动基线校正算法。第三,供电稳定性:模拟输出传感器对电源纹波敏感,建议使用LDO单独供电,避免与电机、继电器等感性负载共用电源。

2.3 数据采集原理与工程实践

数据采集不仅是周期性读取传感器数值,更涉及采样策略、抗干扰处理和时序控制。在 TinyML 场景下,采集到的数据质量直接决定模型推理的准确性。

2.3.1 采样策略设计

采样频率的确定需遵循奈奎斯特采样定理,同时考虑环境参数的动态特性。温度变化通常较慢(时间常数可达分钟级),1Hz采样已足够;而空气质量中的VOC浓度可能因人为活动在数十秒内快速变化,建议采用0.2~1Hz采样率。对于光照,室内场景受开关灯影响可在毫秒级变化,但TinyML应用通常关注平均照度而非瞬时值,因此可采用1Hz采样后做滑动平均。

采样方式上,推荐采用“定时批量读取+滑动窗口”模式。例如每5秒读取一次所有传感器数据,保留最近60个样本作为滑动窗口,计算均值、方差、最大值、最小值等统计特征作为模型输入。这种方式既能平滑噪声,又能保留环境变化的动态信息。

2.3.2 抗干扰与滤波处理

传感器信号在传输和采集过程中会引入多种噪声:电源纹波、电磁干扰(EMI)、量化噪声、传感器自身的热噪声等。工程实践中常采用以下措施:

  • 硬件滤波:在ADC输入端增加RC低通滤波器,截止频率设为采样频率的1/10~1/5,有效抑制高频干扰。
  • 软件滤波:对连续N次采样值排序后取中位数(中值滤波),或使用一阶低通滤波算法 y[n] = α·x[n] + (1-α)·y[n-1],α取值0.1~0.3。
  • 异常值剔除:采用3σ准则或Hampel滤波器,识别并替换超出正常范围的突变值。
  • 时序对齐:不同传感器响应时间不同,在融合多传感器数据时需进行时间戳对齐,避免因响应延迟导致特征错位。
// 一阶低通滤波示例(C语言实现)
float lowpass_filter(float input, float prev_output, float alpha) {
    return alpha * input + (1.0f - alpha) * prev_output;
}
// 调用示例:alpha=0.2,采样间隔100ms
float filtered_temp = lowpass_filter(raw_temp, last_temp, 0.2f);

2.3.3 标定与校准流程

传感器出厂时虽有一定精度保证,但在实际应用中仍需进行现场校准。校准流程包括:零点校准(将传感器置于已知标准环境中,记录输出偏移量)、满量程校准(将传感器置于量程上限标准环境中,调整增益)、多点标定(在量程内选取3~5个标准点,建立插值或拟合曲线)。对于TinyML项目,建议将标定参数(偏移量和增益系数)存储在MCU的Flash中,在数据预处理阶段应用。

经验提示:在部署环境监测模型时,不要直接使用传感器厂商提供的典型标定曲线。由于传感器个体差异和老化效应,实际标定曲线可能与典型值偏差5%~15%。建议在设备出厂前进行逐台标定,并将标定参数写入设备配置区。

2.4 案例拆解:室内空气质量监测节点的传感器选型与数据采集

下面通过一个完整的案例,展示从需求分析到数据采集的工程实践过程。

项目背景:某办公园区需要在30个会议室部署空气质量监测节点,用于联动新风系统自动调节通风量。要求监测温度、湿度、CO₂浓度和PM2.5,数据通过Wi-Fi上传至边缘网关,并在本地MCU上运行TinyML模型进行异常检测(如会议室人数突增导致CO₂快速上升)。

初始现象与约束:会议室面积约40~80㎡,人员密度3~10人,空调开启时温度波动范围22~28℃,相对湿度40%~70%。供电采用PoE(以太网供电),节点功耗预算小于2.5W。成本预算单节点不超过300元人民币。

关键输入数据与选型分析:

  1. 温度/湿度:选用SHT30,精度±0.3℃/±2%RH,I²C接口,平均功耗0.2mA,满足精度和功耗要求。
  2. CO₂:选用SGP30(eCO₂),量程400~60000ppm,精度±15%读数,I²C接口。虽然精度不如NDIR传感器(如SenseAir S8),但成本仅为后者的1/3,且功耗更低。
  3. PM2.5:选用PMS5003,激光散射原理,UART接口,功耗20mA(含风扇)。该传感器在30㎡会议室中可有效监测颗粒物浓度变化。
  4. 主控:ESP32-S3,内置Wi-Fi/BLE,支持I²C和UART,具备足够算力运行轻量级TinyML模型。

数据采集与处理流程:

// 伪代码:数据采集与特征提取
void data_acquisition_task() {
    while(1) {
        // 1. 读取SHT30温湿度
        sht30_read(&temp, &humidity);
        // 2. 读取SGP30 eCO₂(需预热30秒)
        sgp30_read(&eco2, &tvoc);
        // 3. 读取PMS5003 PM2.5(连续读取3次取平均)
        pms5003_read(&pm25, 3);
        // 4. 应用标定系数
        temp_cal = temp * temp_gain + temp_offset;
        // 5. 滑动窗口更新(窗口大小60,采样间隔5s)
        update_window(temp_cal, humidity, eco2, pm25);
        // 6. 每60秒计算一次统计特征
        if (++sample_count >= 12) {
            compute_features(&features);  // 均值、方差、变化率等
            run_tinyml_inference(features); // 调用ONNX模型
            sample_count = 0;
        }
        vTaskDelay(5000 / portTICK_PERIOD_MS);
    }
}

结果对比与复盘:部署后运行30天,与专业级参考设备(Vaisala GMW90系列)对比,温度平均偏差0.4℃,湿度偏差3.2%RH,CO₂偏差在±80ppm以内,PM2.5偏差在±15μg/m³以内。TinyML异常检测模型成功识别出12次会议室人数突增事件,其中10次为真实事件,2次为误报(因清洁人员使用化学试剂导致VOC突升)。

风险与代价:SGP30在长期运行后基线漂移约5%,需每3个月进行一次零点校准。PMS5003的风扇寿命约3年,需纳入维护计划。误报事件提示我们,单一气体传感器难以区分不同来源的VOC,后续可考虑增加MOS气体传感器阵列或引入更多上下文特征。

常见误区提醒:不要将传感器数据直接作为模型输入而不做任何预处理。原始ADC值或未经滤波的读数会导致模型过拟合噪声,降低泛化能力。同时,不同传感器的采样时间戳必须对齐,否则模型会学到虚假的时间相关性。

2.5 总结复盘:环境监测数据采集的要点清单

本章内容可归纳为以下核心要点,作为后续TinyML模型开发的参考基线:

  • 物理量认知:理解温度、湿度、空气质量、光照的物理本质和测量原理,明确传感器输出与物理量之间的转换关系。
  • 选型匹配:根据项目精度、功耗、成本、接口约束选择合适传感器,优先选用数字接口(I²C/SPI/UART)传感器以减少模拟信号干扰。
  • 采样策略:根据环境参数动态特性确定采样频率,采用滑动窗口和统计特征提取增强数据表达能力。
  • 信号处理:结合硬件滤波和软件滤波抑制噪声,实施异常值剔除和时序对齐。
  • 标定校准:建立零点、满量程和多点标定流程,将标定参数持久化存储。
  • 数据记录:在采集阶段同步记录时间戳、传感器状态(如预热状态、错误标志),为后续模型调试提供完整上下文。

环境监测数据的质量决定了TinyML模型的上限。在下一阶段,我们将基于本章采集的数据,探讨如何构建适合端侧部署的ONNX模型架构,以及如何将训练好的模型转换为可在MCU上高效运行的格式。