基于 M5Stack CoreS3 和 ENV Pro 模块的环境传感器数据采集系统,实时读取温度、湿度、气压、气体阻值等环境参数。
- 彩色卡片式布局: 温度、湿度、气压、气体数据分别使用独立卡片显示
- 紧凑设计: 所有内容适配 240px 屏幕高度,无溢出
- 圆角设计: 所有界面元素使用圆角矩形,视觉效果柔和
- 图标指示: 每个数据项带有字母图标标识 (T/H/P/G)
- 完整中文显示: 使用 M5Unified 的
efontCN中文字体 - 多字号: 标题(16px)、正文(12px)、注释(10px)
- 清晰易读: 针对小屏幕优化的字号和行距
- 局部刷新: 仅更新数据区域,避免全屏闪烁
- 首次绘制: 启动时绘制完整 UI 框架
- 增量更新: 后续只刷新变化的数值,流畅不卡顿
- 低延迟: 5 秒自动更新,响应迅速
- 启动动画: 带进度条的初始化加载动画
- 实时标记: 绿色圆点标识数据正在实时更新
| 设备 | 型号 | 说明 |
|---|---|---|
| 主控板 | M5Stack CoreS3 (SE版) | ESP32-S3 双核 MCU, 带 LCD 显示屏 |
| 传感器模块 | ENV Pro | 基于 BME688 的环境传感器 |
| 连接线 | Grove I2C 线缆 | 4 针接口 (SDA/SCL/VCC/GND) |
ENV Pro 模块通过 Grove I2C 接口 连接到 M5Stack CoreS3:
ENV Pro (Grove) → M5Stack CoreS3 Port.A (I2C)
┌─────────┐ ┌──────────┐
│ VCC │ ────────→│ 5V │
│ GND │ ────────→│ GND │
│ SDA │ ────────→│ GPIO2 │
│ SCL │ ────────→│ GPIO1 │
└─────────┘ └──────────┘
- BME688 默认地址: 0x76 或 0x77
- 程序会自动尝试两个地址
- 可通过串口查看 I2C 扫描结果
项目已在 platformio.ini 中配置好依赖:
- M5Unified (v0.1.14+) - M5Stack 官方统一库
- Adafruit BME680 Library (v2.0.3+) - BME688 驱动
- Adafruit Unified Sensor (v1.1.14+) - 传感器抽象层
# 如果是新项目,已经在 VS Code 中打开了
cd e:\development\BME688在 VS Code 中:
- 点击底部状态栏的
✓(PlatformIO: Build) 图标 - 或按快捷键:
Ctrl+Alt+B
命令行方式:
pio run连接 M5Stack CoreS3 到电脑:
- 点击底部状态栏的
→(PlatformIO: Upload) 图标 - 或按快捷键:
Ctrl+Alt+U
命令行方式:
pio run --target upload- 点击底部状态栏的
🔌(PlatformIO: Serial Monitor) 图标 - 或按快捷键:
Ctrl+Alt+S
命令行方式:
pio device monitor┌──────────────────────────────────┐
│ 🌿 环境监测站 │ ← 顶部标题 (35px)
├──────────────────────────────────┤
│ ┌──────────────────────────────┐ │
│ │ [T] 温度 │ │ ← 温度卡片 (45px)
│ │ 27.6 °C │ │ 深蓝色背景
│ └──────────────────────────────┘ │
│ ┌──────────────────────────────┐ │
│ │ [H] 湿度 │ │ ← 湿度卡片 (45px)
│ │ 45.2 % │ │ 深绿色背景
│ └──────────────────────────────┘ │
│ ┌─────────────┐ ┌──────────────┐ │
│ │ [P] 气压 │ │ [G] 气体 │ │ ← 气压/气体 (45px)
│ │ 964.5 hPa │ │ 42.2 kΩ │ │ 并排显示
│ └─────────────┘ └──────────────┘ │
│ 海拔: 12.3m ● │ ← 底部信息 (10px)
└──────────────────────────────────┘
总高度: 230px (适配 240px 屏幕)
- 温度: 精度 ±1°C, 范围 -40~85°C
- 湿度: 精度 ±3%RH, 范围 0~100%
- 气压: 精度 ±1 hPa, 范围 300~1100 hPa
- 气体阻值: 用于检测空气质量 (VOC)
- 海拔高度: 根据气压计算 (需校准海平面气压)
| 按钮 | 功能 |
|---|---|
| BtnA | 手动刷新传感器数据 |
| BtnB | 扫描 I2C 总线设备 |
| BtnC | 重新初始化传感器 |
- 每 5 秒 自动读取并显示最新数据
- 数据同时输出到串口和 LCD 屏幕
症状: 串口显示 "BME688 初始化失败"
解决方案:
- 检查 Grove 线缆是否插紧
- 确认 ENV Pro 模块 LED 是否亮起
- 查看 I2C 扫描结果 (按 BtnB):
发现 I2C 设备于地址 0x76 ← 正常 - 尝试重新上电 (拔插 USB 线)
可能原因: 依赖库未安装
解决方案:
# 清理并重新下载依赖
pio lib install
pio run --target clean
pio run症状: Failed to connect to ESP32
解决方案:
- 按住 M5Stack 的 Reset 按钮
- 点击上传,等待 "Connecting..." 出现
- 松开 Reset 按钮
或者修改 platformio.ini 添加:
upload_port = COM3 ; 替换为实际 COM 口原因: BME688 需要预热
说明:
- 首次通电后,气体传感器需要 5-10 分钟 预热
- 温湿度数据约 1-2 分钟 后稳定
- 这是正常现象,耐心等待即可
Bosch Sensortec Environmental Cluster 2.0 是官方提供的气体传感器算法库,可计算:
- IAQ (室内空气质量指数, 0-500)
- CO₂ 等效浓度 (ppm)
- VOC 等效浓度 (ppm)
- 气体精度等级 (0-3)
取消注释并添加:
lib_deps =
m5stack/M5Unified @ ^0.1.14
boschsensortec/BSEC2-Library ; 添加这行
build_flags =
-D CORE_DEBUG_LEVEL=0
-D USE_BSEC2 ; 添加这行替换 Adafruit_BME680 为 BSEC2 API (参考代码末尾注释)
BSEC2 支持保存传感器状态到 NVS/SD 卡,下次启动快速恢复,跳过预热期。
- BSEC2 库使用 Bosch 专有许可,仅限个人学习使用
- 商业应用需联系 Bosch 获取授权
- 库文件较大 (~200KB),编译时间更长
为了便于理解与二次开发,这里补充 BSEC2 在本项目中的核心概念与运行特性。
结论先行: IAQ 数值是“越低越好,越高越差”。
| IAQ 范围 | 描述 |
|---|---|
| 0–50 | 良好 (算法把典型干净空气校准到 ~50 左右) |
| 51–100 | 一般/轻微污染 |
| 101–150 | 轻度污染 |
| 151–200 | 中度污染 |
| 201–300 | 重度污染 |
| 301–500 | 严重污染 |
IAQ 是根据气体阻值 (VOC 变化) 的长期模式自学习得到的“相对指数”,不是国家环境标准中的 PM2.5/AQI,也不是 CO₂ 的真实浓度。算法需要经历不同空气场景(干净 VS 略有污染)才能收敛。
| 精度 | 含义 | 行为建议 |
|---|---|---|
| 0 | 预热/基线学习中 | 不做阈值判断,等待或制造空气对比 |
| 1 | 初步稳定,看到一些波动 | 可以开始观察趋势,仍不做严肃告警 |
| 2 | 接近稳定 | 阈值判断可启用(如 >120 提醒通风) |
| 3 | 高可靠度 | 长期趋势分析/自动控制依据 |
达到精度 3 可能需要数小时甚至更久,取决于空气变化幅度。持续单调环境会拖慢提升。
这两者都是“等效估算值”,并非传感器直接测量的化学浓度:
- CO2eq: 基于 VOC pattern 推测的“等效 CO₂”。不能替代 NDIR CO₂ 传感器用于法规/精准控制。
- VOCeq: 呼吸/挥发性有机物的相对水平,用于趋势分析与通风提示。
- 项目默认改为 LP 模式 (BSEC_SAMPLE_RATE_LP),比 ULP 模式更快收集数据,缩短校准时间。
- 高频调用
envSensor.run()是必须的,库内部自行决定是否有新输出。
本项目在 IAQ 精度达到 3 后每隔 >=5 分钟保存一次 BSEC 状态(State Blob) 到 NVS,下次启动自动加载:
- 短时断电 (几分钟~几小时): 能快速回到精度 2/3。
- 长时断电或跨房间搬移: 旧基线可能失效,精度可能回落到 1/2,必要时手动清除状态重新学习。
建议将来增加“长按 BtnC 清除状态”与保存时间戳判断逻辑(>48h 重新训练)。
- 启动后保持连续运行 (不要频繁重启)。
- 制造空气对比: 开窗 → 关窗并在附近呼气或短暂放酒精棉 → 再开窗。
- 避免完全密闭无变化环境。
- 等达到精度 3 后再断电重启观察是否能快速恢复。(验证状态保存。)
在 BSEC 精度 <2 时,为获得更快的相对空气变化反馈,实现了一个“简易 VOC 指数”:
公式: Index = (BaselineGasRes - CurrentGasRes) / BaselineGasRes * 100% (阻值下降代表 VOC 上升)
分类(当前默认):
| Index | 级别 |
|---|---|
| <2 | 优 |
| 2–10 | 正常 |
| 10–25 | 偏差 |
| 25–50 | 差 |
| >50 | 严重 |
实现要点:
- 基线在启动后约 2 分钟锁定一次 (可调)。
- 后续维护一个滑动窗口最小值用于观察波动。
- 当 IAQ 精度 ≥2 自动切回显示官方 IAQ 指数。
可改进方向:
- 用 EMA (指数移动平均) 动态更新基线减少长期漂移。
- 添加趋势箭头 (最近 5 分钟变化)。
- 定期(如 12h)在精度仍 <2 时重抓基线。
海拔计算公式使用标准海平面气压 1013.25 hPa。若处于不同气象条件或已知实际海拔:
- 记录当前压力
P与真实海拔H。 - 反算海平面气压:
P0 = P / (1 - H/44330)^5.255。 - 更新
gSeaLevelPressure = P0后海拔显示更准确。
| 现象 | 可能原因 | 解决 |
|---|---|---|
| IAQ 长期 50 精度 0 | 环境变化太少 | 制造空气对比,等待数小时 |
| CO2eq 始终 500 | 算法占位值 | 提升 IAQ 精度,或使用真实 CO₂ 传感器 |
| 气压极小导致海拔几万米 | 单位误判 (将 hPa 当 Pa 再除) | 加单位自适应逻辑 (已实现) |
| 频繁“读取失败” | run() 调用频率低/时序警告 (bsecStatus=100) | 高频调用 run(), 避免只在刷新周期调用 |
| 精度回落 | 长时间断电或换环境 | 重训练或清除状态 |
| 条件 | 动作 |
|---|---|
| IAQ > 120 且持续 5 分钟 | 屏幕黄色闪烁 / 串口提醒 |
| IAQ > 150 或 简易VOC指数 > 25 | 红色闪烁 + 蜂鸣器 |
| IAQ 精度 == 3 & 每 6h | 自动保存状态 |
| Gas 阻值突降(>30%) | 记录 VOC 峰值事件到日志 |
- 趋势图: 环形缓冲记录最近 60 次数据绘制折线。
- 数据持久化: SD 卡 CSV / SPIFFS 日志 (timestamp,temp,hum,press,gasRes,iaq,co2eq,vocEq,simpleVOC)。
- 远程上传: MQTT/HTTP 到云平台,仪表盘展示 IAQ 曲线。
- 低功耗: ULP 模式+深度睡眠定时唤醒采样。
- AI Studio: 训练定制气味分类/目标气体回归配置。
- 基线管理: 保存简易VOC基线与时间戳,长按按钮清除。
- 保存历史数据到 SD 卡 (CSV 格式)
- 绘制温湿度曲线图
- 导出数据到 Excel 分析
- 连接 WiFi AP
- 上传数据到云平台 (ThingSpeak / MQTT)
- 远程实时监控
- 温度/湿度超阈值蜂鸣器报警
- 空气质量差时屏幕红色闪烁
- 推送通知到手机
- 深度睡眠 + 定时唤醒
- 电池供电优化
- 延长续航时间
- 添加光照传感器 (Light Unit)
- CO₂ 传感器 (ENVIII Unit)
- 实现完整环境监测站
╔══════════════════════════════════════════╗
║ M5Stack CoreS3 + ENV Pro (BME688) ║
║ 环境传感器监测系统 ║
╚══════════════════════════════════════════╝
=== I2C 设备扫描 ===
发现 I2C 设备于地址 0x76
扫描完成, 共发现 1 个设备
==================
✓ BME688 初始化成功 (地址: 0x76)
传感器配置完成:
- 温度过采样: 8x
- 湿度过采样: 2x
- 气压过采样: 4x
- IIR 滤波器: 3
- 气体加热器: 320°C / 150ms
╔════════════════════════════════════╗
║ BME688 环境传感器数据 ║
╠════════════════════════════════════╣
║ 温度: 23.45 °C ║
║ 湿度: 56.78 % ║
║ 气压: 1013.25 hPa ║
║ 气体阻值: 45.67 kΩ ║
║ 海拔高度: 12.34 m ║
╠════════════════════════════════════╣
║ 读取耗时: 87 ms ║
╚════════════════════════════════════╝
本项目代码使用 MIT License 开源。
第三方库许可:
- M5Unified: MIT License
- Adafruit BME680: BSD License
- BSEC2 (可选): Bosch Software License Agreement
遇到问题或有改进建议?欢迎:
- 提交 Issue
- 发起 Pull Request
- 分享你的项目案例
Happy Making! 🎉