小智音箱空气质量指数播报结合传感器联动

你有没有过这样的经历:家里刚做完饭,厨房烟味还没散,孩子就开始咳嗽了——可你看了一眼空气检测仪,PM2.5明明“正常”?😅
问题出在哪?很多设备只测颗粒物,却忽略了TVOC(挥发性有机物)这种看不见的“隐形杀手”。而等你打开手机APP查看数据时,污染早已持续了好几分钟。

这正是我们今天要解决的问题。💡
不如让家里的 小智音箱 当你的“空气管家”——不用看屏幕,它会主动告诉你:“当前TVOC偏高,建议开启抽油烟机。”是不是瞬间安心了不少?


咱们这套系统的核心思路其实很简单:
用 PMS5003 测灰尘,用 SGP40 捕捉异味气体,再让 ESP32主控板 把这些数据揉在一起分析,最后通过局域网“喊话”给小智音箱,让它张嘴播报。整个过程在本地完成, 不依赖云端、无延迟、还保护隐私 。

听起来像黑科技?其实拆开来看,每一步都清晰可控,而且成本不高,DIY起来也超有成就感!👏


先说说那两个关键的小元件—— PMS5003 和 SGP40 ,它们就像是空气质量监测界的“左膀右臂”。

  • PMS5003 是个激光颗粒物传感器,靠风扇吸气+激光散射来数空气中漂浮的微粒。它能精准告诉你 PM2.5 是 12 还是 89 μg/m³,特别适合监控做饭、扫地带来的扬尘。
  • SGP40 则是个“嗅觉敏锐”的气体传感器,基于金属氧化物材料对 TVOC 做响应。但它有个小脾气:湿度一变,读数就飘。所以得配上一个 SHT30 温湿度传感器 ,做实时补偿,才能让它稳定输出可靠的 IAQ(综合空气质量指数)。

两者配合,就像眼睛和鼻子一起工作:一个看到烟雾弥漫,一个闻到焦糊味道,双管齐下,误判率大大降低。🧠👃👀

下面这段代码就是 ESP32 如何从 PMS5003 读取 PM2.5 数据的典型操作:

#include <HardwareSerial.h>
HardwareSerial sensorSerial(1);

void setup() {
  Serial.begin(115200);
  sensorSerial.begin(9600, SERIAL_8N1, 16, 17); // RX=16, TX=17
}

void loop() {
  if (sensorSerial.available() >= 32) {
    uint8_t data[32];
    sensorSerial.readBytes(data, 32);

    if (data[0] == 0x42 && data[1] == 0x4D) {
      int pm25 = (data[6] << 8) | data[7];
      Serial.printf("PM2.5: %d μg/m³\n", pm25);

      if (pm25 > 35) {
        triggerAirQualityAlert(pm25, "PM2.5");
      }
    }
  }
}

别被串口协议吓到,其实就是等着传感器发来一包 32 字节的数据,校验帧头 0x42 0x4D ,然后把第6、7字节拼成 PM2.5 数值。简单直接,稳定性也不错,跑几天都没啥问题。

至于 SGP40,它是走 I²C 总线的,接线更省事。但它的原始输出是个“Raw Value”,不能直接当浓度看。你需要引入 Sensirion 官方提供的 VOC Algorithm(可以在 GitHub 找到),结合温湿度算出真正的 IAQ 指数。这个过程稍微复杂点,但一旦调通,准确率提升非常明显!


接下来重头戏来了:怎么让小智音箱“开口说话”?🗣️

很多人以为语音播报必须联网走云服务,其实不然。小智音箱支持局域网内的 HTTP 接口调用,只要你在内网里发个 POST 请求,它就能立刻播放你指定的文字内容。

比如这条请求:

POST http://xiaozhi.local/api/v1/tts
Content-Type: application/json

{"text": "当前空气质量为轻度污染,请注意开窗通风。"}

发送后不到一秒,音箱就会用清晰的普通话念出来,全程无需经过互联网,也不用唤醒词或账号登录。对于注重隐私的家庭来说,简直是刚需!🔐

实现起来也很轻松,用 ESP32 自带的 HTTPClient 库就能搞定:

#include <WiFiClient.h>
#include <HTTPClient.h>

const char* xiaozhi_ip = "192.168.31.100";

void speak(const String& message) {
  if (WiFi.status() != WL_CONNECTED) return;

  HTTPClient http;
  http.begin("http://" + String(xiaozhi_ip) + "/api/v1/tts");
  http.addHeader("Content-Type", "application/json");

  String json = "{\"text\":\"" + message + "\"}";
  int httpResponseCode = http.POST(json);

  if (httpResponseCode > 0) {
    Serial.printf("TTS播报成功: %s\n", message.c_str());
  } else {
    Serial.printf("TTS请求失败, 错误码: %d\n", httpResponseCode);
  }

  http.end();
}

你看,封装成一个 speak() 函数后,后面只需要写 speak("TVOC超标,请关闭香薰机") 就行了,开发体验非常友好。而且你可以自由控制语速、音量,甚至设置夜间静音模式,避免半夜突然来一句“甲醛浓度升高”,吓醒全家 😅。


真正让系统聪明起来的,其实是那个小小的决策逻辑—— 多传感器融合判断 。

你想啊,打扫房间时扬起一阵灰,PM2.5 瞬间飙到 90,但空气其实没啥毒气;反过来,点个蜡烛可能 PM 很低,TVOC 却悄悄爬升。如果只看单一指标,很容易“大惊小怪”或者“视而不见”。

所以我们设计了一个分级策略,参考国标 AQI 标准,把 PM2.5 和 TVOC 各自划分为四个等级:

等级 PM2.5 范围 TVOC (IAQ) 范围
优 <35 <25
良 35–75 25–50
轻度污染 75–115 50–75
中度及以上 >115 >75

最终结果取两者中最差的那个——也就是“短板效应”。代码实现也很直观:

enum AirQualityLevel {
  EXCELLENT,
  GOOD,
  LIGHT_POLLUTION,
  MODERATE_ABOVE
};

AirQualityLevel getAqiLevel(int pm25, int iaqIndex) {
  AirQualityLevel pmLevel, tvocLevel;

  if (pm25 < 35) pmLevel = EXCELLENT;
  else if (pm25 < 75) pmLevel = GOOD;
  else if (pm25 < 115) pmLevel = LIGHT_POLLUTION;
  else pmLevel = MODERATE_ABOVE;

  if (iaqIndex < 25) tvocLevel = EXCELLENT;
  else if (iaqIndex < 50) tvocLevel = GOOD;
  else if (iaqIndex < 75) tvocLevel = LIGHT_POLLUTION;
  else tvocLevel = MODERATE_ABOVE;

  return (pmLevel > tvocLevel) ? pmLevel : tvocLevel;
}

这样一来,系统就能智能区分“短暂扬尘”和“真实污染”,不会动不动就报警,用户体验自然就好多了。

顺便提一句,我还在里面加了个滑动平均滤波,防止某个异常数据点导致误触发。毕竟传感器偶尔也会“打喷嚏”嘛~🤧


整个系统的架构可以用一句话概括:
感知 → 分析 → 表达

硬件连接大概是这样:

[ PMS5003 ] → 
             \
              → [ ESP32主控 ] → WiFi → [ 小智音箱 ]
             /                        ↘
[ SGP40 + SHT30 ]                         → [ MQTT Broker(可选)]
                                          ↘
                                            → [ 手机APP / 云端后台 ]

所有核心处理都在 ESP32 上完成,每隔 30 秒采集一次数据,做补偿计算,评级,然后决定要不要“喊一声”。整个流程闭环运行,即使断网也能照常工作。

我还特意做了几个贴心设计:
- 🛌 夜间模式:晚上 10 点到早上 7 点自动关闭语音提醒;
- 🔧 OTA 升级:后续可以远程更新播报文案或调整阈值;
- 💡 扩展接口:预留 GPIO 引脚,未来接个继电器就能联动净化器自动开机;
- 🔐 隐私优先:所有数据可在本地闭环处理,完全不上云。

实际部署时建议把设备放在客厅中央或卧室床头柜,远离灶台、加湿器这些干扰源。电源最好用 5V/2A 的适配器,保证 PMS5003 的风扇稳定运转,不然会影响采样准确性。


说实话,这套方案最打动我的地方,不是技术多先进,而是它真的解决了几个“人”的问题:

  • 👵 对老人和孩子来说,看不懂数字没关系,听懂一句话就够了;
  • 🙈 我们常常忽略空气变化,直到喉咙不舒服才反应过来,而现在是系统提前预警;
  • 🤫 不用掏出手机翻APP,信息主动送达,这才是智能家居该有的样子。

想象一下:宝宝正在熟睡,空气净化器默默启动的同时,音箱轻轻说一句:“已检测到空气质量下降,正在自动净化。”——那一刻你会觉得,科技终于有了温度。❤️


未来当然还能走得更远:
- 加个 CO₂ 传感器,提醒书房通风;
- 接入 Home Assistant,实现全屋自动化;
- 用机器学习预测趋势,比如“未来两小时TVOC将持续上升”;
- 多房间部署,形成空气地图,哪个角落脏了都知道。

但归根结底,好的智能设备不该让人去适应它,而是悄无声息地融入生活,像呼吸一样自然。

而这套“边缘感知 + 本地决策 + 语音反馈”的设计思路,或许正是下一代家庭健康监测产品的雏形。🌱

“最好的技术,是让你感觉不到它的存在。”
—— 但它一直在守护你。

更多推荐