ESP32 PM2.5检测实时播报空气质量

在城市雾霾频发的今天,你有没有过这样的经历:站在窗前,看着灰蒙蒙的天空,心里嘀咕——“这空气到底能不能开窗?” 🌫️ 而手机上的天气App只告诉你一个模糊的“轻度污染”,却没人告诉你 现在呼吸的是什么等级的空气

如果有个小设备,不仅能精准测出PM2.5浓度,还能用中文语音直接告诉你:“当前PM2.5为87微克每立方米,建议关闭门窗。”是不是瞬间安心了不少?👂💡

这就是我们今天要聊的项目: 基于ESP32 + PMS5003 + 语音模块的空气质量实时播报系统 。它不靠手机弹窗,而是像一位贴心管家,主动“开口”提醒你呼吸健康。


咱们先说核心思路:
不是简单地把传感器数据扔到屏幕上,而是让机器“会说话”。整个系统就像一个小型AI助手,从感知环境、判断风险,到张嘴提醒,一气呵成。

主角当然是 ESP32 —— 这块价格不到20元的小芯片,集成了Wi-Fi和蓝牙,双核CPU跑起来比很多老款单片机还猛。更关键的是,它有 三个UART串口 ,这意味着它可以一边跟PM2.5传感器聊天,一边指挥语音模块说话,还能空出一个口子接OLED或GPS(未来扩展用)。

而我们的“鼻子”,是来自攀藤科技的 PMS5003激光颗粒物传感器 。别看它巴掌大,原理可不简单:内部有个小风扇把空气吸进去,用激光照射悬浮颗粒,再通过散射光强度反推颗粒数量和质量。这种 激光散射法 比常见的红外传感器(比如GP2Y10)精度高得多,误差控制在±10%以内,适合长期稳定运行。

它的输出也很友好——标准UART协议,9600波特率,每秒发一包24字节的数据,包含PM1.0、PM2.5、PM10三个关键指标。只要你能读串口,就能拿到干净的数据。

来看一段实际解析代码:

uint8_t buffer[32];
int index = 0;

void parsePMSData(uint8_t data) {
  buffer[index++] = data;

  // 检查帧头是否为 0x42 0x4D
  if (index == 1 && buffer[0] != 0x42) index = 0;
  if (index == 2 && buffer[1] != 0x4D) index = 0;

  if (index >= 24) {
    // 校验和验证:前22字节之和应等于最后两个字节
    uint16_t sum = 0;
    for (int i = 0; i < 22; i++) {
      sum += buffer[i];
    }
    uint16_t receivedSum = (buffer[22] << 8) | buffer[23];

    if (sum == receivedSum) {
      uint16_t pm25 = (buffer[10] << 8) | buffer[11];  // 提取PM2.5值
      handleAirQuality(pm25);  // 处理并播报
    }
    index = 0;  // 重置缓冲区
  }
}

这段代码虽然短,但藏着几个工程经验:
- 必须校验帧头 0x42 0x4D ,防止乱码干扰;
- 一定要做校验和验证 ,否则偶尔传错一个字节,可能把35μg/m³误判成350;
- 缓冲区满了就清零,避免内存泄漏。

⚠️ 小贴士:PMS5003刚上电时前30秒数据不稳定,建议加个延时或跳过初始几帧。


接下来才是最有趣的环节—— 让设备开口说话 !🎙️

我们选的是 SYN6288 或兼容模块(如JDY-31),这类TTS(Text-to-Speech)芯片支持UTF-8中文输入,一句话发过去,立刻朗读出来,效果堪比录音。

怎么控制呢?很简单,构造一个带协议头的数据包就行:

HardwareSerial ttsSerial(2);  // 使用Serial2连接语音模块
#define TTS_RX 18
#define TTS_TX 19

void speak(const char* text) {
  size_t len = strlen(text);
  uint8_t cmd[100] = {0};
  cmd[0] = 0xFD;                    // 包头
  cmd[1] = 0x00;                    // 长度高字节
  cmd[2] = len + 2;                 // 数据长度(文本+模式+语速)
  cmd[3] = 0x01;                    // UTF-8编码
  cmd[4] = 0x02;                    // 语速中等(0~7)
  memcpy(&cmd[5], text, len);       // 填入文本

  ttsSerial.write(cmd, 5 + len);
  delay(100);  // 给模块处理时间
}

然后就可以这样调用:

char buffer[64];
snprintf(buffer, sizeof(buffer), "当前PM2点5浓度为%d微克每立方米。", pm25);

if (pm25 <= 35) {
  strcat(buffer, "空气质量优,适宜开窗通风。");
} else if (pm25 <= 75) {
  strcat(buffer, "空气质量良,敏感人群减少外出。");
} else if (pm25 <= 115) {
  strcat(buffer, "轻度污染,建议关闭门窗。");
} else {
  strcat(buffer, "重度污染,请开启净化器并避免外出。");
}

speak(buffer);
delay(5000);  // 防止频繁播报惹人烦 😅

想象一下,清晨起床,设备自动播报:“昨晚睡眠期间空气质量良好,PM2.5平均值为28。”——这种体验,是不是比刷手机高级多了?


当然,光会说话还不够聪明。真实环境中,传感器偶尔会跳变,比如突然飙到200,下一秒又回到50。这时候就得上点“智慧”了。

我推荐加个 滑动平均滤波器 ,平滑瞬时波动:

#define FILTER_SIZE 5
uint16_t filterBuf[FILTER_SIZE] = {0};
int bufIndex = 0;

uint16_t applyFilter(uint16_t raw) {
  filterBuf[bufIndex] = raw;
  bufIndex = (bufIndex + 1) % FILTER_SIZE;

  uint32_t sum = 0;
  for (int i = 0; i < FILTER_SIZE; i++) {
    sum += filterBuf[i];
  }
  return sum / FILTER_SIZE;
}

五次采样取平均,既能保留趋势变化,又能过滤掉毛刺。你会发现,数据曲线变得丝般顺滑 📈。


硬件连接其实非常简洁:

+------------------+       UART       +------------------+
|                  |<---------------->|                  |
|     ESP32        |                  |   PMS5003传感器   |
|  (主控MCU)       |                  | (PM2.5检测)       |
|                  |       UART       |                  |
|                  |<---------------->|   语音模块       |
|                  |                  | (SYN6288/JDY-31) |
|                  |       Wi-Fi      |                  |
|                  |<===============>|  云平台/Blynk App|
+------------------+                  +------------------+

供电方面,PMS5003工作电流可达100mA,ESP32约80mA,合计接近200mA。建议使用5V/2A电源适配器,或者搭配TP4056锂电池充电模块,做成便携式设备。

如果你还想进一步节能,完全可以启用ESP32的 深度睡眠模式 :每30秒唤醒一次,采集数据→播报→上传→继续睡觉。在这种模式下,一块2000mAh电池可以撑好几天!


顺便提一句,别忘了Wi-Fi联网能力。通过Blynk、ThingsBoard或MQTT服务器,你可以把数据同步到手机App或Home Assistant面板,实现远程查看历史曲线。哪怕人在公司,也能知道家里娃房间的空气质量如何。

而且后续升级空间很大:
- 加个SHT30温湿度传感器,变成综合环境站;
- 接MH-Z19B二氧化碳检测,预防室内“闷氧”;
- 再连个继电器,自动开关空气净化器,真正实现闭环控制。


最后想说的是,这个项目看似简单,但它体现了现代物联网设备的核心逻辑: 感知 → 分析 → 反馈 → 联动

它不只是一个“检测仪”,更像是一个有温度的健康伙伴。老人听不懂图表没关系,孩子不会操作App也没问题——只要它一张嘴,全家都能听明白。

技术的价值不在复杂,而在实用。让每个人都能听懂空气的语言,才是真正的智能。🌍💬

“听得见的空气”,你准备给它安个家了吗?🏡✨

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐