Skip to content

Latest commit

 

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

M5Stack CoreS3 + ENV Pro (BME688) 环境监测项目

基于 M5Stack CoreS3ENV 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    │
└─────────┘          └──────────┘

I2C 地址

  • BME688 默认地址: 0x760x77
  • 程序会自动尝试两个地址
  • 可通过串口查看 I2C 扫描结果

🛠️ 开发环境

必需工具

依赖库 (自动安装)

项目已在 platformio.ini 中配置好依赖:

  • M5Unified (v0.1.14+) - M5Stack 官方统一库
  • Adafruit BME680 Library (v2.0.3+) - BME688 驱动
  • Adafruit Unified Sensor (v1.1.14+) - 传感器抽象层

🚀 快速开始

1. 克隆/打开项目

# 如果是新项目,已经在 VS Code 中打开了
cd e:\development\BME688

2. 编译项目

在 VS Code 中:

  • 点击底部状态栏的 (PlatformIO: Build) 图标
  • 或按快捷键: Ctrl+Alt+B

命令行方式:

pio run

3. 上传固件

连接 M5Stack CoreS3 到电脑:

  • 点击底部状态栏的 (PlatformIO: Upload) 图标
  • 或按快捷键: Ctrl+Alt+U

命令行方式:

pio run --target upload

4. 查看串口输出

  • 点击底部状态栏的 🔌 (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 屏幕

🔧 故障排查

问题 1: 传感器初始化失败

症状: 串口显示 "BME688 初始化失败"

解决方案:

  1. 检查 Grove 线缆是否插紧
  2. 确认 ENV Pro 模块 LED 是否亮起
  3. 查看 I2C 扫描结果 (按 BtnB):
    发现 I2C 设备于地址 0x76  ← 正常
    
  4. 尝试重新上电 (拔插 USB 线)

问题 2: 编译错误

可能原因: 依赖库未安装

解决方案:

# 清理并重新下载依赖
pio lib install
pio run --target clean
pio run

问题 3: 上传失败

症状: Failed to connect to ESP32

解决方案:

  1. 按住 M5Stack 的 Reset 按钮
  2. 点击上传,等待 "Connecting..." 出现
  3. 松开 Reset 按钮

或者修改 platformio.ini 添加:

upload_port = COM3  ; 替换为实际 COM 口

问题 4: 数据不稳定

原因: BME688 需要预热

说明:

  • 首次通电后,气体传感器需要 5-10 分钟 预热
  • 温湿度数据约 1-2 分钟 后稳定
  • 这是正常现象,耐心等待即可

🌟 高级功能: BSEC2 气体算法

什么是 BSEC2?

Bosch Sensortec Environmental Cluster 2.0 是官方提供的气体传感器算法库,可计算:

  • IAQ (室内空气质量指数, 0-500)
  • CO₂ 等效浓度 (ppm)
  • VOC 等效浓度 (ppm)
  • 气体精度等级 (0-3)

启用 BSEC2

步骤 1: 修改 platformio.ini

取消注释并添加:

lib_deps = 
    m5stack/M5Unified @ ^0.1.14
    boschsensortec/BSEC2-Library  ; 添加这行
build_flags = 
    -D CORE_DEBUG_LEVEL=0
    -D USE_BSEC2  ; 添加这行

步骤 2: 修改 main.cpp

替换 Adafruit_BME680 为 BSEC2 API (参考代码末尾注释)

步骤 3: 配置状态保存 (可选)

BSEC2 支持保存传感器状态到 NVS/SD 卡,下次启动快速恢复,跳过预热期。

⚠️ 注意事项

  • BSEC2 库使用 Bosch 专有许可,仅限个人学习使用
  • 商业应用需联系 Bosch 获取授权
  • 库文件较大 (~200KB),编译时间更长

� BSEC2 算法与指标深入说明

为了便于理解与二次开发,这里补充 BSEC2 在本项目中的核心概念与运行特性。

IAQ (Indoor Air Quality) 指数

结论先行: IAQ 数值是“越低越好,越高越差”。

IAQ 范围 描述
0–50 良好 (算法把典型干净空气校准到 ~50 左右)
51–100 一般/轻微污染
101–150 轻度污染
151–200 中度污染
201–300 重度污染
301–500 严重污染

IAQ 是根据气体阻值 (VOC 变化) 的长期模式自学习得到的“相对指数”,不是国家环境标准中的 PM2.5/AQI,也不是 CO₂ 的真实浓度。算法需要经历不同空气场景(干净 VS 略有污染)才能收敛。

IAQ 精度字段 (accuracy 0–3)

精度 含义 行为建议
0 预热/基线学习中 不做阈值判断,等待或制造空气对比
1 初步稳定,看到一些波动 可以开始观察趋势,仍不做严肃告警
2 接近稳定 阈值判断可启用(如 >120 提醒通风)
3 高可靠度 长期趋势分析/自动控制依据

达到精度 3 可能需要数小时甚至更久,取决于空气变化幅度。持续单调环境会拖慢提升。

CO2eq / VOCeq

这两者都是“等效估算值”,并非传感器直接测量的化学浓度:

  • 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 重新训练)。

快速提升 IAQ 精度技巧

  1. 启动后保持连续运行 (不要频繁重启)。
  2. 制造空气对比: 开窗 → 关窗并在附近呼气或短暂放酒精棉 → 再开窗。
  3. 避免完全密闭无变化环境。
  4. 等达到精度 3 后再断电重启观察是否能快速恢复。(验证状态保存。)

简易 VOC 指数 (项目自定义)

在 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。若处于不同气象条件或已知实际海拔:

  1. 记录当前压力 P 与真实海拔 H
  2. 反算海平面气压: P0 = P / (1 - H/44330)^5.255
  3. 更新 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 峰值事件到日志

后续扩展路线

  1. 趋势图: 环形缓冲记录最近 60 次数据绘制折线。
  2. 数据持久化: SD 卡 CSV / SPIFFS 日志 (timestamp,temp,hum,press,gasRes,iaq,co2eq,vocEq,simpleVOC)。
  3. 远程上传: MQTT/HTTP 到云平台,仪表盘展示 IAQ 曲线。
  4. 低功耗: ULP 模式+深度睡眠定时唤醒采样。
  5. AI Studio: 训练定制气味分类/目标气体回归配置。
  6. 基线管理: 保存简易VOC基线与时间戳,长按按钮清除。

�📈 下一步扩展

1. 数据记录与可视化

  • 保存历史数据到 SD 卡 (CSV 格式)
  • 绘制温湿度曲线图
  • 导出数据到 Excel 分析

2. WiFi 联网上传

  • 连接 WiFi AP
  • 上传数据到云平台 (ThingSpeak / MQTT)
  • 远程实时监控

3. 告警功能

  • 温度/湿度超阈值蜂鸣器报警
  • 空气质量差时屏幕红色闪烁
  • 推送通知到手机

4. 低功耗模式

  • 深度睡眠 + 定时唤醒
  • 电池供电优化
  • 延长续航时间

5. 多传感器融合

  • 添加光照传感器 (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! 🎉

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages