2、传感器选型与原理:温湿度传感器(DHT22/SHT30)、PM2.5传感器(PMS5003)、CO2传感器(MH-Z19B)、光照传感器(BH1750),选型要点与接口协议

好,咱们进入第二章。传感器选型,说白了就是给项目挑「眼睛」和「鼻子」。

我见过太多人,上来就买最便宜的传感器,结果数据飘得像心电图。也有朋友追求极致精度,花大价钱买了工业级传感器,结果项目预算直接爆炸。

选型这件事,没有绝对的对错。关键看你的应用场景、成本预算、还有开发周期。今天我就把四种最常用的环境传感器掰开揉碎讲清楚。

2.1 温湿度传感器:DHT22 vs SHT30

温湿度是环境监测的基础。我个人的习惯是:室内项目用SHT30,室外或低成本项目用DHT22

DHT22(AM2302)

这玩意儿是经典款。单总线协议,一根数据线搞定通信。精度嘛,±0.5°C、±2%RH,够用。

接口协议:单总线(One-Wire)

时序要求比较严格。我刚开始用的时候,经常遇到数据读不出来。后来发现是拉低时间没控制好。

关键参数:

  • 温度范围:-40°C ~ 80°C
  • 湿度范围:0% ~ 100%RH
  • 采样周期:2秒(注意!不能频繁读取)
  • 通信距离:最长20米(加长线需加电容)

我曾经踩过的坑:

DHT22的读取间隔必须大于2秒。有一次我为了数据刷新快,设了1秒读一次,结果传感器直接罢工,输出全是0。后来查手册才发现,它内部采样需要时间,读太快会触发保护机制。

SHT30

这是瑞士Sensirion家的产品。I2C接口,精度更高(±0.3°C、±2%RH),而且体积小。

接口协议:I2C(地址0x44或0x45)

我个人更偏爱SHT30。为什么?因为它有加热功能。在潮湿环境下,可以定期加热除露,防止结露导致数据失真。

对比项 DHT22 SHT30
接口 单总线 I2C
精度 ±0.5°C / ±2%RH ±0.3°C / ±2%RH
采样周期 2秒 可配置(最快0.5ms)
价格 约5-8元 约10-15元
适用场景 室外、低成本 室内、高精度

选型建议:

如果项目需要快速响应(比如温室大棚),选SHT30。如果只是记录环境变化,DHT22完全够用。我有个项目用了200个DHT22,运行两年没出过问题。

2.2 PM2.5传感器:PMS5003

这是攀藤科技的产品。激光散射原理,能测PM1.0、PM2.5、PM10。

接口协议:UART(串口)

默认波特率9600,数据格式固定。每次读取返回32字节数据包。

我记得第一次用PMS5003时,被它的风扇噪音吓了一跳。后来才知道,风扇是内置的,用来带动气流通过激光腔。噪音大概30dB,晚上安静时能听到。

关键参数:

  • 测量范围:0~500 μg/m³
  • 精度:±10% @ 100~500 μg/m³
  • 响应时间:≤10秒
  • 工作寿命:连续运行≥8000小时

避坑指南:

我曾经把PMS5003直接放在室外,结果下雨天进水,烧了。后来加了防水透气膜才解决。另外,激光头会老化,建议每半年校准一次。

数据解析其实很简单。32字节数据包中,第4、5字节是PM2.5浓度(单位μg/m³)。

// PMS5003数据解析示例
uint8_t buffer[32];
// 假设已经通过串口读取到buffer
uint16_t pm25 = (buffer[4] << 8) | buffer[5];
Serial.print("PM2.5: ");
Serial.print(pm25);
Serial.println(" μg/m³");

2.3 CO2传感器:MH-Z19B

二氧化碳浓度监测,在教室、办公室、温室里特别重要。MH-Z19B是非色散红外(NDIR)原理,寿命长,精度高。

接口协议:UART 或 PWM

我个人习惯用UART模式。波特率9600,发送指令读取数据。

关键参数:

  • 测量范围:400~5000 ppm(可扩展至10000 ppm)
  • 精度:±50 ppm + 读数的5%
  • 响应时间:≤120秒
  • 工作寿命:≥5年

嗯,这里要注意:MH-Z19B有个自动校准功能。它假设每天会接触到400ppm的新鲜空气,然后自动归零。但如果传感器一直放在高浓度环境里,校准就会出问题。

我曾经犯过的错:

在一个密闭的蘑菇种植房里,MH-Z19B自动校准后,读数越来越不准。后来我关闭了自动校准,改为手动校准,每两周通一次新鲜空气做基准。问题解决了。

关闭自动校准的指令:

// 关闭自动校准
uint8_t cmd[9] = {0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86};
// 发送到传感器
Serial.write(cmd, 9);

2.4 光照传感器:BH1750

光照强度测量,BH1750是首选。数字输出,I2C接口,精度高,而且有光谱修正。

接口协议:I2C(地址0x23或0x5C)

为什么选它?因为它能直接输出lux值,不用自己算。而且内置了接近人眼的光谱响应曲线。

参数 BH1750
测量范围 1 ~ 65535 lux
分辨率 1 lux(高分辨率模式)
接口 I2C
工作电压 2.4V ~ 3.6V

我个人觉得BH1750最方便的地方是:不需要校准。出厂前已经校准好了,拿来就用。

不过要注意,它有个测量模式的选择。连续测量还是单次测量?高分辨率还是低分辨率?

经验分享:

在电池供电的项目里,我一般用单次测量模式。测完就休眠,省电。如果是市电供电,用连续高分辨率模式,数据更平滑。

读取示例:

// BH1750读取示例(I2C)
Wire.beginTransmission(0x23);
Wire.write(0x10); // 连续高分辨率模式
Wire.endTransmission();

delay(180); // 等待测量完成

Wire.requestFrom(0x23, 2);
uint16_t raw = (Wire.read() << 8) | Wire.read();
float lux = raw / 1.2; // 高分辨率模式除以1.2
Serial.print("光照强度: ");
Serial.print(lux);
Serial.println(" lux");

2.5 选型要点总结

说了这么多,我总结几条选型原则:

  1. 接口统一:尽量选同一种接口的传感器。比如全用I2C,可以减少接线和代码复杂度。
  2. 精度够用就行:别盲目追求高精度。±0.5°C和±0.3°C,在大多数场景下没区别。
  3. 考虑环境适应性:室外项目要防水、防尘、防结露。
  4. 功耗要算:电池供电的项目,传感器功耗是决定性因素。
  5. 供货稳定:我吃过亏,选了个小众传感器,结果第二批货和第一批参数不一样。尽量选大厂、通用型号。

好了,这一章就到这里。下一章我们讲硬件电路设计,包括电源、信号调理、还有抗干扰设计。到时候见。