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,后面做联动控制就轻松多了。下一章咱们开始动手接线和写代码。