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 | 温度、湿度 | I2C | 2.4-5.5V | 2 μA(休眠) | 10-15 元 |
| BH1750 | 光照强度 | I2C | 2.4-3.6V | 0.2 mA | 5-10 元 |
| MH-Z19B | CO2 浓度 | UART/PWM | 4.5-5.5V | 20 mA | 60-80 元 |
| PMS5003 | PM1.0/2.5/10 | UART | 5V | 100 mA | 80-120 元 |
选型的时候,我建议先看接口。SHT30 和 BH1750 都是 I2C,可以共用总线。MH-Z19B 和 PMS5003 是 UART,需要独立的串口。如果单片机串口不够,可以用软件串口模拟。
最后提醒:所有传感器上电后都需要稳定时间。SHT30 和 BH1750 大概 1 秒,MH-Z19B 需要 3 分钟,PMS5003 需要 30 秒。在代码里做好延时处理,否则读到的是无效数据。
好了,这四种传感器就是室内环境监测的四大金刚。下一章我会讲怎么把它们整合到一个系统里,用 LoRa 把数据传出去。到时候你会看到,单个传感器很简单,但组合起来就有意思了。
公众号:蓝海资料掘金营,微信deep3321