3. 传感器与数据采集基础:常见传感器类型、信号类型、数据格式与采集方式
在边缘网关的实战部署中,传感器是物理世界与数字系统的唯一接口。无论是温湿度监控、压力检测还是光照调节,网关能否准确、实时地获取数据,直接决定了上层应用的可靠性。本章将系统梳理常见传感器的类型与原理、信号类型与电气特性、数据格式与采集方式,并重点讲解边缘网关在接入传感器时的信号调理、数据解析与工程落地要点。理解这些基础,是后续实现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量程。
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秒、5秒)依次读取每个传感器。实现简单,但实时性较差,且总线占用率高。
- 中断模式:传感器或外部事件触发GPIO中断,网关立即响应读取。适合门磁、人体红外等事件型传感器。
- 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时需降低速率并增加上拉电阻。