3. 传感器与数据采集基础

在边缘网关的实战部署中,传感器是物理世界与数字系统的唯一接口。无论是温湿度监控、压力检测还是光照调节,网关能否准确、实时地获取数据,直接决定了上层应用的可靠性。本章将系统梳理常见传感器的类型与原理、信号类型与电气特性、数据格式与采集方式,并重点讲解边缘网关在接入传感器时的信号调理、数据解析与工程落地要点。理解这些基础,是后续实现MQTT数据上云与联动控制的前提。

边缘网关传感器数据采集链路 传感器域(物理量→电信号) 温湿度传感器 SHT30 / DHT22 / 模拟型 压力传感器 MPX5700 / 4-20mA变送器 光照传感器 BH1750 / 光敏电阻 其他信号源 开关量 / 脉冲 / 4-20mA 信号类型(模拟/数字/总线) 模拟信号 0-10V / 4-20mA / 电阻分压 数字电平信号 GPIO高低电平 / 开关量 数字总线信号 I²C / SPI / UART / RS-485 脉冲/频率信号 流量计 / 编码器输出 边缘网关(采集/解析/转发) 信号调理与ADC采样 分压/滤波/放大 → 12-16bit ADC 协议解析与数据格式化 Modbus RTU / I²C / 原始数据转换 边缘计算与缓存 滤波/阈值判断/断网缓存 MQTT发布 JSON格式化 → Broker 物理连接 采集 图:传感器 → 信号类型 → 边缘网关采集解析 → MQTT 上行链路

3.1 常见传感器类型与工作原理

3.1.1 温湿度传感器

温湿度是环境监测中最基础的物理量。在边缘网关场景中,常用的温湿度传感器分为三类:数字总线型(如SHT30、AHT20,通过I²C接口输出校准后的数字量)、单总线型(如DHT22,通过自定义单总线协议输出40bit数据)、模拟型(如HIH-5030,输出电压随相对湿度变化)。数字型传感器内部集成了ADC和校准逻辑,网关直接读取寄存器即可获得温度(单位℃)和相对湿度(单位%RH)。模拟型则需要网关的ADC通道配合电压-物理量换算公式。

3.1.2 压力传感器

压力传感器在工业现场常以变送器形式出现,输出4-20mA电流环或0-10V电压信号。例如MPX5700系列输出0.2-4.7V的模拟电压,对应0-700kPa压力。而工业压力变送器(如扩散硅式)通常内置放大电路,输出4-20mA,其优势在于电流信号不易受线缆电阻影响,适合远距离传输。网关采集时需在回路中串联250Ω精密电阻,将电流转换为1-5V电压后送入ADC。

3.1.3 光照传感器

光照传感器分为光敏电阻型、光电二极管型和数字照度计型。BH1750是典型的数字照度传感器,通过I²C接口直接输出勒克斯(lux)值,量程1-65535 lux。光敏电阻则需配合固定电阻组成分压电路,网关通过ADC读取电压后,利用对数关系近似计算照度。在农业大棚或智能家居场景中,光照数据通常用于联动补光灯或窗帘电机。

3.1.4 其他常见传感器

除上述三类外,边缘网关还常接入:气体传感器(MQ系列,输出模拟电压与气体浓度相关)、人体红外传感器(PIR,输出数字电平)、流量计(输出脉冲频率信号)、土壤湿度传感器(电容式或电阻式,输出模拟量)。这些传感器的信号类型和采集方式差异较大,网关需要具备多类型接口。

传感器类型 典型型号 输出信号 接口方式 数据格式
温湿度 SHT30 数字(I²C) I²C 16bit温度 + 16bit湿度
温湿度 DHT22 数字(单总线) GPIO 40bit(湿度16+温度16+校验8)
压力 MPX5700 模拟电压 0.2-4.7V ADC 电压值 → 线性换算kPa
压力变送器 扩散硅式 4-20mA ADC+250Ω电阻 电流值 → 线性换算MPa
光照 BH1750 数字(I²C) I²C 16bit照度值(lux)
光照 光敏电阻 模拟分压 ADC 电压 → 对数换算lux

3.2 信号类型与电气特性

3.2.1 模拟信号

模拟信号是连续变化的电压或电流,常见范围包括0-3.3V、0-5V、0-10V和4-20mA。边缘网关的ADC分辨率通常为12bit(如ESP32)或16bit(如高精度采集模块)。以12bit ADC、0-3.3V量程为例,理论分辨率为3.3V/4096 ≈ 0.8mV。若传感器输出0-5V,则需通过分压电阻或运算放大器将信号调理到ADC允许范围内。4-20mA信号需并联250Ω电阻转换为1-5V,再经分压至ADC量程。

风险提示:模拟信号易受电磁干扰和线缆压降影响。在工业现场,模拟信号线应使用屏蔽双绞线,且与电源线、继电器线保持至少20cm间距。若传输距离超过10米,优先选用4-20mA电流环而非电压信号。

3.2.2 数字电平信号

数字电平信号只有高电平和低电平两种状态,用于表示开关量(如门磁、人体红外、液位开关)。网关的GPIO需配置为输入模式,并注意电平匹配。例如3.3V逻辑的网关接入5V输出的传感器时,需使用电平转换芯片或分压电路,否则可能损坏GPIO。数字信号还需考虑上拉/下拉电阻,防止悬空时电平抖动。

3.2.3 数字总线信号

数字总线信号是当前主流传感器的主要输出方式,包括:

  • I²C:两线制(SCL+SDA),地址寻址,速率100kbps-400kbps,适合短距离板级通信。多个传感器可挂载在同一总线上,通过地址区分。
  • SPI:四线制(SCLK+MOSI+MISO+CS),全双工高速通信,适合高采样率传感器(如加速度计)。
  • UART:异步串行,点对点通信,常用于GPS模块、激光雷达等。
  • RS-485:差分信号,支持多点组网,最远1200米,工业现场广泛使用。网关需外接RS-485收发器(如MAX3485)。

3.2.4 脉冲/频率信号

流量计、转速传感器等输出脉冲信号,其频率与物理量成正比。网关可使用GPIO外部中断或定时器捕获模式测量脉冲频率。例如涡轮流量计输出每升N个脉冲,网关通过计数脉冲数即可换算累计流量。采集时需注意脉冲信号的电气电平(TTL或NPN开集电极)和最大频率,避免漏计数。

3.3 数据格式与采集方式

3.3.1 原始数据格式

不同传感器输出的数据格式差异显著。数字传感器通常输出二进制补码或BCD码,例如SHT30的温度数据为16bit无符号整数,需乘以0.01得到实际温度(℃)。模拟传感器则输出电压或电流值,需结合传感器手册中的传递函数进行线性或非线性换算。以MPX5700为例,其输出电压Vout与压力P的关系为:

P (kPa) = (Vout - 0.2) × (700 - 0) / (4.7 - 0.2)

对于4-20mA变送器,换算公式为:

物理量 = (I_loop - 4) × (量程上限 - 量程下限) / (20 - 4) + 量程下限

3.3.2 数据采集方式

边缘网关采集传感器数据主要有三种模式:

  1. 轮询模式:网关按固定周期(如1秒、5秒)依次读取每个传感器。实现简单,但实时性较差,且总线占用率高。
  2. 中断模式:传感器或外部事件触发GPIO中断,网关立即响应读取。适合门磁、人体红外等事件型传感器。
  3. DMA模式:对于高速连续采样(如振动传感器),使用DMA将ADC数据直接搬运到内存,减少CPU占用。

3.3.3 数据解析与单位标准化

网关采集到原始数据后,必须进行解析和单位标准化,才能通过MQTT上传。建议在网关内部建立统一的数据模型,例如将所有物理量统一为浮点数,并附带单位、时间戳和传感器ID。以下是一个典型的JSON数据格式:

{
  "device_id": "gw-001",
  "timestamp": 1712345678,
  "sensors": [
    {"type": "temperature", "value": 25.6, "unit": "℃"},
    {"type": "humidity", "value": 58.2, "unit": "%RH"},
    {"type": "pressure", "value": 101.3, "unit": "kPa"}
  ]
}
经验建议:在网关固件中,建议将传感器驱动封装为独立模块,统一提供 read() 接口,返回标准化的结构体。这样上层MQTT逻辑无需关心底层传感器差异,便于后续扩展新传感器。

3.4 实战场景:多传感器接入边缘网关

3.4.1 场景背景与目标

某智慧农业大棚需要部署边缘网关,采集温湿度、光照、土壤湿度和CO₂浓度,并通过MQTT上报至云平台。大棚面积约500㎡,传感器分布在三个不同区域,网关与最远传感器距离约30米。要求数据刷新周期不超过5秒,且断电恢复后能自动重连。

3.4.2 硬件选型与连接

网关选用ESP32-S3开发板(内置Wi-Fi和蓝牙,支持ADC、I²C、UART)。传感器选型如下:

  • 温湿度:3个SHT30,通过I²C总线挂载,地址分别设为0x44、0x45、0x46(通过ADDR引脚配置)。
  • 光照:3个BH1750,同样挂载在I²C总线上,地址0x23。
  • 土壤湿度:3个电容式传感器,输出0-3V模拟电压,接入ESP32的ADC1通道(GPIO36-39)。
  • CO₂浓度:1个MH-Z19B红外传感器,通过UART输出,波特率9600。

3.4.3 采集逻辑实现

网关每2秒执行一次采集任务:

void collect_sensor_data() {
    // 1. 读取I²C总线上的温湿度和光照
    for (int i = 0; i < 3; i++) {
        temp[i] = sht30_read_temperature(i);
        humi[i] = sht30_read_humidity(i);
        lux[i] = bh1750_read_lux(i);
    }
    // 2. 读取ADC通道的土壤湿度
    for (int i = 0; i < 3; i++) {
        uint16_t adc_val = adc1_get_raw(ADC1_CHANNEL_0 + i);
        soil_humi[i] = (adc_val / 4095.0) * 100.0;  // 映射为0-100%
    }
    // 3. 读取UART的CO₂浓度
    co2 = mhz19_read_co2();
    // 4. 组装JSON并发布MQTT
    publish_mqtt();
}

3.4.4 结果与复盘

部署后实测数据刷新周期为2.1秒,满足5秒要求。I²C总线上挂载6个设备,通信速率设为100kbps,未出现总线冲突。土壤湿度传感器因线缆长度不同,存在约5%的电压降偏差,通过在网关端做两点校准(干土和饱和水)解决了该问题。复盘经验:模拟信号线应尽量短,且避免与电源线平行走线;I²C总线超过20cm时需降低速率并增加上拉电阻。

3.5 常见误区与总结

误区一:忽略ADC参考电压精度。ESP32的ADC参考电压存在芯片间差异(约±10%),若需高精度测量,应使用外部精密参考电压(如TL431)或进行多点校准。
误区二:I²C总线过长导致信号失真。I²C设计用于板级通信,超过30cm时波形畸变严重。若需远距离传输,应改用RS-485或CAN总线。
误区三:4-20mA信号直接接入ADC。必须并联250Ω或500Ω电阻将电流转换为电压,且注意电阻精度(推荐0.1%精度)对测量结果的影响。
总结要点:传感器数据采集的核心在于“信号类型匹配”和“数据解析正确”。边缘网关应具备多类型接口(ADC、I²C、UART、RS-485),并在固件层做好信号调理、滤波和单位标准化。建议在项目初期建立传感器数据字典,明确每个通道的物理量、量程、换算公式和单位,避免后期维护混乱。