4、常用传感器介绍:温湿度传感器SHT30、光照传感器BH1750、CO2传感器MH-Z19B、PM2.5传感器PMS5003

做室内环境监测,传感器选型是第一步。说实话,市面上传感器五花八门,但真正适合做产品、稳定性好的就那么几款。今天我把四个最常用的传感器掰开揉碎了讲,都是我在项目里反复验证过的型号。

4.1 温湿度传感器 SHT30

SHT30 是 Sensirion 家的经典款。我最早接触它是在一个智能家居项目里,当时客户要求温湿度精度必须达到 ±0.3°C,试了好几个国产方案都不行,最后换了 SHT30 一次通过。

核心参数:

参数数值
温度精度±0.3°C(典型值)
湿度精度±2% RH
工作电压2.4V - 5.5V
接口I2C(地址 0x44 或 0x45)
采样速率最高 10Hz

为什么我推荐它?因为它的长期稳定性好。有些传感器用半年就开始漂移,SHT30 我实测过两年,偏差还在标称范围内。

关键点:SHT30 的 I2C 地址可以通过 ADDR 引脚配置。接地是 0x44,接 VDD 是 0x45。如果你一个 I2C 总线上挂多个传感器,这个功能很实用。

驱动代码片段(Arduino):

#include <Wire.h>
#include "SHT30.h"

SHT30 sht30;

void setup() {
  Wire.begin();
  sht30.begin();  // 默认地址 0x44
}

void loop() {
  if (sht30.get() == 0) {
    float temp = sht30.getTemperature();
    float hum = sht30.getHumidity();
    Serial.print("温度: "); Serial.print(temp);
    Serial.print("°C, 湿度: "); Serial.print(hum); Serial.println("%");
  }
  delay(2000);
}

我的经验:SHT30 对 PCB 布局比较敏感。传感器下方不要走大电流线路,否则自热会影响精度。我曾经因为这个踩过坑,温度读数一直偏高 0.5°C,后来把传感器挪到板边就解决了。

4.2 光照传感器 BH1750

BH1750 是 ROHM 公司的数字光照传感器。说白了,它就是一颗专门测 lux 值的芯片。你想想看,模拟光照传感器还要自己算照度,BH1750 直接输出数字量,省心多了。

核心参数:

参数数值
测量范围1 - 65535 lux
分辨率1 lux(高分辨率模式)
工作电压2.4V - 3.6V
接口I2C(地址 0x23 或 0x5C)

我个人习惯把 BH1750 放在窗户附近,用来做智能窗帘的触发源。光照低于 50 lux 自动关窗帘,高于 500 lux 自动开,效果很好。

注意:BH1750 的 ADDR 引脚电平决定 I2C 地址。低电平是 0x23,高电平是 0x5C。如果你用 0x23 扫描不到设备,试试 0x5C。

驱动代码片段:

#include <Wire.h>
#include <BH1750.h>

BH1750 lightMeter;

void setup() {
  Wire.begin();
  lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE);
}

void loop() {
  float lux = lightMeter.readLightLevel();
  Serial.print("光照: "); Serial.print(lux); Serial.println(" lux");
  delay(1000);
}

避坑指南:BH1750 有个测量模式的选择。连续高分辨率模式精度最高,但功耗也大。如果是电池供电,建议用一次测量模式,测完就休眠。我曾经在一个低功耗项目里忘了切换模式,电池三天就耗光了。

4.3 CO2 传感器 MH-Z19B

MH-Z19B 是红外 CO2 传感器。嗯,这里要注意,它用的是非色散红外(NDIR)原理,不是电化学的。所以寿命长,一般能用 5 年以上。

核心参数:

参数数值
测量范围400 - 5000 ppm
精度±50 ppm + 读数的 5%
工作电压4.5V - 5.5V
接口UART(默认 9600 bps)或 PWM

为什么 CO2 这么重要?室内 CO2 浓度超过 1000 ppm 时,人就会感到昏昏沉沉。我办公室就装了一个,超过 1200 ppm 自动开窗通风,效果立竿见影。

关键点:MH-Z19B 上电后需要预热 3 分钟才能输出稳定数据。如果你刚上电就读,数值会偏低。我建议在代码里加一个启动延时。

驱动代码片段(UART 模式):

#include <SoftwareSerial.h>

SoftwareSerial co2Serial(10, 11); // RX, TX

byte cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};

void setup() {
  Serial.begin(9600);
  co2Serial.begin(9600);
  delay(3000); // 等待预热
}

void loop() {
  co2Serial.write(cmd, 9);
  delay(100);
  
  if (co2Serial.available() >= 9) {
    byte response[9];
    co2Serial.readBytes(response, 9);
    int co2 = response[2] * 256 + response[3];
    Serial.print("CO2: "); Serial.print(co2); Serial.println(" ppm");
  }
  delay(5000);
}

注意:MH-Z19B 的工作电压是 5V,不能直接用 3.3V 供电。但它的 UART 电平是 3.3V,可以直接接 ESP32 或 STM32。我见过有人用 5V 单片机直接连,结果烧了传感器。

4.4 PM2.5 传感器 PMS5003

PMS5003 是攀藤科技的产品,激光散射原理。说实话,在百元级 PM2.5 传感器里,它的性价比是最高的。我做过对比测试,和万元级参考仪器的偏差在 ±10% 以内。

核心参数:

参数数值
测量范围0.3 - 10 μm
PM2.5 精度±10% @ 100-500 μg/m³
工作电压5V
接口UART(默认 9600 bps)
数据输出PM1.0、PM2.5、PM10 浓度

你想想看,室内 PM2.5 超过 75 μg/m³ 就算轻度污染了。PMS5003 能同时输出三个粒径的数据,做空气质量分析很方便。

关键点:PMS5003 的数据包是 32 字节的。前两个字节是 0x42 0x4D,后面跟着校验和。我建议做一次校验,防止数据错乱。

驱动代码片段:

#include <SoftwareSerial.h>

SoftwareSerial pmsSerial(2, 3); // RX, TX

struct pmsData {
  int pm10;
  int pm25;
  int pm100;
};

void setup() {
  Serial.begin(9600);
  pmsSerial.begin(9600);
}

void loop() {
  if (pmsSerial.available() >= 32) {
    if (pmsSerial.read() == 0x42 && pmsSerial.read() == 0x4D) {
      pmsData data;
      for (int i = 0; i < 28; i++) {
        byte b = pmsSerial.read();
        if (i == 4) data.pm10 = b * 256 + pmsSerial.read();
        if (i == 6) data.pm25 = b * 256 + pmsSerial.read();
        if (i == 8) data.pm100 = b * 256 + pmsSerial.read();
      }
      Serial.print("PM1.0: "); Serial.print(data.pm10);
      Serial.print(" PM2.5: "); Serial.print(data.pm25);
      Serial.print(" PM10: "); Serial.println(data.pm100);
    }
  }
  delay(5000);
}

我的经验:PMS5003 有个内置风扇,工作时有噪音。如果用在卧室,建议加一个 PWM 控制,晚上降低转速。另外,传感器进风口不要对着墙壁,否则气流不畅会导致读数偏高。我曾经把传感器装在墙角,PM2.5 一直显示 200+,后来挪到房间中央就正常了。

4.5 四种传感器对比总结

传感器测量参数接口工作电压典型功耗价格区间
SHT30温度、湿度I2C2.4-5.5V2 μA(休眠)10-15 元
BH1750光照强度I2C2.4-3.6V0.2 mA5-10 元
MH-Z19BCO2 浓度UART/PWM4.5-5.5V20 mA60-80 元
PMS5003PM1.0/2.5/10UART5V100 mA80-120 元

选型的时候,我建议先看接口。SHT30 和 BH1750 都是 I2C,可以共用总线。MH-Z19B 和 PMS5003 是 UART,需要独立的串口。如果单片机串口不够,可以用软件串口模拟。

最后提醒:所有传感器上电后都需要稳定时间。SHT30 和 BH1750 大概 1 秒,MH-Z19B 需要 3 分钟,PMS5003 需要 30 秒。在代码里做好延时处理,否则读到的是无效数据。

好了,这四种传感器就是室内环境监测的四大金刚。下一章我会讲怎么把它们整合到一个系统里,用 LoRa 把数据传出去。到时候你会看到,单个传感器很简单,但组合起来就有意思了。


公众号:蓝海资料掘金营,微信deep3321