2、核心传感器选型与原理
好,咱们进入正题。这一章我带你看看空气质量监测里最核心的几个传感器。说白了,你选对了传感器,项目就成功了一半。我在做工业级净化器项目时,踩过不少传感器的坑,今天把这些经验都抖出来。
2.1 粉尘传感器:PMS5003 工作原理
先聊粉尘传感器。我个人习惯用 PMS5003,这玩意儿是攀藤科技的经典款。为什么选它?因为性价比高,数据稳定,而且用的人多,遇到问题好找资料。
工作原理其实不复杂:它内部有个激光二极管,发出激光照射到空气中的颗粒物。颗粒物会把光散射掉,然后一个光电探测器接收散射光信号。信号强弱跟颗粒物浓度成正比。
嗯,这里要注意:PMS5003 能测两种数据——PM1.0、PM2.5、PM10 的浓度,还有 0.3μm、0.5μm、1.0μm 等不同粒径的颗粒物数量。我一般只看 PM2.5,因为这是空气质量的核心指标。
关键参数:
- 测量范围:0~500 μg/m³
- 精度:±10% @ 100~500 μg/m³
- 输出方式:UART 串口(默认 9600 波特率)
- 工作电压:5V(注意!不是 3.3V)
我曾经犯过的错:第一次用 PMS5003 时,直接接了 3.3V 供电,结果数据全是 0。查了半天才发现,这货需要 5V 供电,但数据引脚是 3.3V 电平。所以记得用 5V 供电,数据线直接连 ESP32 的 3.3V 引脚就行。
通信方式很简单:UART。ESP32 发一个读取命令,传感器就回一串 32 字节的数据包。你想想看,解析起来其实挺容易的——前两个字节是包头 0x42 0x4D,后面跟着各种数据。
// PMS5003 数据解析示例(Arduino 框架)
uint8_t buffer[32];
if (Serial2.available() >= 32) {
Serial2.readBytes(buffer, 32);
if (buffer[0] == 0x42 && buffer[1] == 0x4D) {
uint16_t pm25 = (buffer[5] << 8) | buffer[6];
Serial.printf("PM2.5: %d μg/m³\n", pm25);
}
}
2.2 温湿度传感器:DHT22 原理
温湿度传感器,我推荐 DHT22。为什么不是 DHT11?因为 DHT11 精度太差了,温度 ±2°C,湿度 ±5%,做项目根本不够用。DHT22 的温度精度 ±0.5°C,湿度 ±2%,这才像话。
工作原理:DHT22 内部有个电容式湿度传感器和一个 NTC 热敏电阻。湿度靠电容变化来测——空气中的水分子会影响介电常数,电容值就变了。温度靠热敏电阻的阻值变化来算。
通信方式比较特殊:单总线协议。说白了就是一根数据线,既当输入又当输出。ESP32 先拉低总线 18ms 启动通信,然后传感器回传 40 位数据。这 40 位里,前 16 位是湿度,中间 16 位是温度,最后 8 位是校验和。
我的经验:DHT22 的采样间隔至少 2 秒。你如果读得太快,它会罢工。我在一个项目里没注意这个,结果数据每隔几秒就跳成 0。后来加了 delay(2000) 才搞定。
// DHT22 读取示例(使用 DHT 库)
#include <DHT.h>
DHT dht(4, DHT22); // GPIO4
void setup() {
Serial.begin(115200);
dht.begin();
}
void loop() {
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (!isnan(temp) && !isnan(hum)) {
Serial.printf("温度: %.1f°C, 湿度: %.1f%%\n", temp, hum);
}
delay(2000); // 必须等 2 秒
}
2.3 气体传感器:MQ-135 原理
MQ-135 是用来测空气质量综合指标的,比如氨气、苯、烟雾这些。它是个模拟传感器,输出的是电压值,不是具体浓度。
工作原理:内部有个二氧化锡(SnO₂)气敏材料。在清洁空气中,它的电阻比较高。遇到污染气体时,电阻会下降。你想想看,电阻变了,输出电压就变了。ESP32 通过 ADC 读取这个电压,就能判断空气污染程度。
不过要注意:MQ-135 需要预热。刚上电时,数据会漂移。我建议预热 5 分钟再开始读数。另外,它功耗比较大,加热电流约 150mA,别用 ESP32 的 3.3V 直接供电,得用 5V。
MQ-135 的典型应用:
- 读取 ADC 值(0~4095,对应 0~3.3V)
- 根据电压值判断空气质量等级
- 配合校准曲线可以估算 CO₂ 浓度(但精度有限)
// MQ-135 读取示例
int mq135Pin = 34; // ADC 引脚
void setup() {
Serial.begin(115200);
analogReadResolution(12); // 12 位精度
}
void loop() {
int adcValue = analogRead(mq135Pin);
float voltage = adcValue * (3.3 / 4095.0);
Serial.printf("ADC: %d, 电压: %.2fV\n", adcValue, voltage);
delay(1000);
}
我曾经踩过的坑:MQ-135 对酒精也很敏感。有一次我在实验室喷了酒精消毒,结果数据直接爆表。所以如果你在厨房或实验室用,记得区分污染源。
2.4 I2C 与 UART 通信协议回顾
好,最后咱们快速回顾一下两种通信协议。你想想看,传感器跟 ESP32 怎么说话?主要就靠 I2C 和 UART。
UART(串口)
UART 就是一根发送线(TX)、一根接收线(RX)。数据按字节一个一个发,波特率要一致。PMS5003 用的就是 UART,波特率 9600。
- 优点:简单,硬件支持广泛
- 缺点:只能点对点,不能挂多个设备
- ESP32 有 3 个 UART,够用了
I2C(IIC)
I2C 用两根线:SCL(时钟)和 SDA(数据)。可以挂多个设备,每个设备有唯一地址。DHT22 其实不是 I2C,但很多温湿度传感器(比如 BME280)是 I2C 的。
- 优点:两根线挂一堆设备
- 缺点:速度比 UART 慢,距离短
- 地址冲突要注意:两个传感器用同一个地址就麻烦了
我的建议:如果传感器数量少(1~2 个),用 UART 更省事。如果传感器多(3 个以上),用 I2C 能省 GPIO 引脚。我在一个项目里挂了 5 个 I2C 传感器,只用两根线,爽得很。
好了,这一章的核心内容就这些。你掌握了 PMS5003、DHT22、MQ-135 的原理和用法,再搞懂 I2C 和 UART,后面做联动控制就轻松多了。下一章咱们开始动手接线和写代码。