ESP32 PM2.5检测实时播报空气质量
本文介绍基于ESP32、PMS5003传感器和TTS语音模块的PM2.5实时检测与中文语音播报系统,通过串口通信、数据校验与滑动滤波提升稳定性,支持本地提醒与Wi-Fi联网监控,构建智能空气质量管理方案。
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也没问题——只要它一张嘴,全家都能听明白。
技术的价值不在复杂,而在实用。让每个人都能听懂空气的语言,才是真正的智能。🌍💬
“听得见的空气”,你准备给它安个家了吗?🏡✨
更多推荐
所有评论(0)