3、传感器选型与原理:温湿度、CO₂、PM2.5、光照

好,咱们进入正题。这一章聊传感器选型,说白了就是给空气站挑「眼睛」和「鼻子」。选对了,数据靠谱;选错了,后面全是坑。我这些年踩过的雷不少,今天把经验掰开揉碎讲给你听。

3.1 温湿度传感器:SHT30

温湿度是农业环境的基础参数。你想想看,大棚里温度差个两度,作物长势可能就天差地别。SHT30 是我个人非常喜欢的一款数字温湿度传感器。

工作原理

SHT30 内部集成了一个电容式湿度传感元件和一个带隙温度传感元件。湿度测量靠的是高分子薄膜吸湿后电容变化,温度测量则利用 PN 结正向压降与温度的线性关系。芯片内部有 ADC 和校准逻辑,直接输出数字信号,用 I²C 接口读取就行。

关键参数:

  • 温度精度:±0.3°C(典型值)
  • 湿度精度:±2% RH(典型值)
  • 工作电压:2.4V ~ 5.5V
  • 接口:I²C(地址 0x44 或 0x45)

选型依据

为什么选 SHT30 而不是更便宜的 DHT11?我刚开始做项目时也图便宜用过 DHT11,结果发现湿度数据跳得厉害,根本没法用。SHT30 贵不了几块钱,但稳定性好太多。农业场景下,温湿度变化缓慢,SHT30 的精度完全够用,而且它支持周期性采集模式,功耗很低。

我的经验:SHT30 的 I²C 地址可以通过 ADDR 引脚配置。如果总线上挂多个传感器,记得错开地址。我曾经因为两个 SHT30 地址冲突,排查了半天才发现是硬件焊错了。

3.2 CO₂ 传感器:MH-Z19B

CO₂ 浓度直接影响植物光合作用效率。大棚里 CO₂ 浓度低了,作物就「饿肚子」。MH-Z19B 是非色散红外(NDIR)原理的传感器,测 CO₂ 很准。

工作原理

NDIR 的原理其实不复杂。红外光源发出特定波长的光,穿过气室后被探测器接收。CO₂ 分子会吸收 4.26μm 波长的红外光,吸收程度与浓度成正比。传感器内部有参考通道和测量通道,通过比较两个通道的信号强度,就能算出 CO₂ 浓度。

// MH-Z19B 读取 CO₂ 浓度示例(UART 模式)
uint8_t cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
uint8_t resp[9];

// 发送读取命令
uart_send(cmd, 9);
delay(10);
// 接收响应
uart_receive(resp, 9);

// 校验和检查
if (resp[0] == 0xFF && resp[1] == 0x86) {
    uint16_t co2 = (resp[2] << 8) | resp[3];
    printf("CO₂: %d ppm\n", co2);
}

选型依据

MH-Z19B 支持 UART 和 PWM 两种输出方式,我习惯用 UART,数据直接读,方便。它的量程是 400~5000ppm,农业场景绰绰有余。注意一点:它需要预热,刚上电前几分钟数据不准。我一般会在代码里加个延时,等传感器稳定后再开始采集。

避坑指南:MH-Z19B 对气流敏感。如果传感器放在密闭空间里,CO₂ 浓度可能测不准。我曾在温室里把传感器装在一个小盒子里,结果读数一直偏高——因为盒子内部空气不流通。后来在盒子上开了通风孔,问题就解决了。

3.3 PM2.5 传感器:PMS5003

PM2.5 是衡量空气质量的重要指标。农业场景下,扬尘、花粉、霉菌孢子都可能影响作物健康。PMS5003 是激光散射原理的传感器,测颗粒物很靠谱。

工作原理

激光散射法,说白了就是让空气穿过一个激光束。颗粒物经过时会把光散射到各个方向,传感器用光电探测器接收散射光信号。信号强弱和颗粒物浓度成正比。PMS5003 内部有算法,能区分 PM1.0、PM2.5、PM10 的浓度。

关键参数:

  • 量程:0~1000 μg/m³
  • 分辨率:1 μg/m³
  • 工作电压:5V
  • 接口:UART(默认 9600bps)

选型依据

PMS5003 的优点是精度高、响应快。但它有个缺点:功耗大(约 80mA)。如果做电池供电的产品,需要做间歇采集。我一般让它每 5 分钟工作 30 秒,这样平均功耗能降到 8mA 左右。

我的经验:PMS5003 的风扇是易损件。连续运行半年以上,风扇噪音会变大,数据也可能漂移。建议在产品设计时预留风扇更换接口,或者定期校准。我曾经有个项目,客户反馈数据不准,结果拆开一看,风扇被灰尘堵死了。

3.4 光照传感器:BH1750

光照强度直接影响植物光合作用速率。BH1750 是数字光照传感器,测的是可见光强度,单位是 lux。

工作原理

BH1750 内部有一个光电二极管,把光信号转成电流信号。电流信号经过 ADC 转换成数字值,再通过 I²C 接口输出。它有两个 I²C 地址可选(0x23 或 0x5C),支持连续测量和单次测量模式。

// BH1750 初始化示例(连续高分辨率模式)
void bh1750_init() {
    uint8_t cmd = 0x10;  // 连续高分辨率模式
    i2c_write(0x23, &cmd, 1);
    delay(180);  // 等待测量完成
}

// 读取光照强度
uint16_t bh1750_read() {
    uint8_t buf[2];
    i2c_read(0x23, buf, 2);
    uint16_t lux = (buf[0] << 8) | buf[1];
    return lux / 1.2;  // 根据手册换算
}

选型依据

BH1750 的测量范围是 1~65535 lux,农业大棚里完全够用。它的光谱响应接近人眼,测的是「人眼感受到的亮度」,而不是全光谱辐射。如果你需要测光合有效辐射(PAR),那得用专门的量子传感器。但一般农业监测,BH1750 足够了。

注意:BH1750 对红外光不敏感。如果你用 LED 补光灯,要注意 LED 的光谱成分。有些 LED 的红外成分多,BH1750 测出来可能偏低。我遇到过客户用红外补光灯,BH1750 读数只有实际照度的一半。后来换了带红外补偿的传感器才解决。

3.5 传感器选型总结

好了,四个传感器都聊完了。我整理了一张表,方便你对比:

传感器 测量参数 接口 精度 功耗 价格(参考)
SHT30 温度、湿度 I²C ±0.3°C / ±2% RH 低(~2μA 待机) ~10 元
MH-Z19B CO₂ 浓度 UART / PWM ±50 ppm 中(~20mA) ~80 元
PMS5003 PM1.0/2.5/10 UART ±10 μg/m³ 高(~80mA) ~60 元
BH1750 光照强度 I²C ±1 lux 低(~0.2mA) ~5 元

选型时记住一句话:够用就好,别盲目追求高精度。农业场景下,温湿度 ±0.5°C、CO₂ ±50ppm、PM2.5 ±10μg/m³、光照 ±10% 的精度已经能做出很好的产品了。省下来的钱,用在结构设计和防护上,比堆传感器参数更实在。

下一章,咱们聊传感器接口电路设计。到时候我会讲讲怎么把这些传感器接到单片机上,以及怎么处理信号干扰的问题。嗯,那部分内容更硬核,做好准备。