这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【分享开发笔记,赚取电动螺丝刀】BME688传感器分享

共1条 1/1 1 跳转至页

【分享开发笔记,赚取电动螺丝刀】BME688传感器分享

工程师
2026-09-29 16:09:01     打赏

image.png

Unit ENV-Pro 传感器是一款高集成度的环境检测单元,内置 BME688 传感器方案,支持测量 VOC 等挥发性有机化合物、CO₂ 当量、室内空气质量 ( IAQ )、温湿度和大气压等多种环境参数。传感器采用 I2C 通信接口 ( 0x77 ),适用于天气站、室内环境监测和空气质量检测等应用场景。


手头有这个传感器好久了。I2C接口,通过I2C总线,能直接读取到温度、湿度、气压和空气的电阻值,四个数据。但是看官方文档,通过这个传感器还能获得空气质量、CO2浓度、VOC(挥发有机化合物)浓度等信息。最近有空,就好好把玩一下这个传感器。这个传感器核心元件为:BME688。这个传感器的核心是金属氧化物(MOX)类型,必须把敏感层加热到200–400°C,VOC 分子才会在敏感层表面发生氧化还原反应,改变电阻值。也就是说这个传感器内有个极其微小的地方是被加热到了320℃的高温下进行工作的。但是整个传感器又不会发热,还能正常测量环境温湿度,超神奇的。

仔细学习了一下官方的例子,慢慢理清了这个传感器工作的流程。传感器通过I2C读取,能够读取到:温度、湿度、气压、空气电阻值,四个参数。博世的官方提供了训练好了的模型,通过静态链接库的方式提供给用户,但是没有提供这个模型的训练方法,所以无法自己训练模型库,只能直接调用官方的模型库。将原始的(温度、湿度、气压、空气电阻值)以3秒一次的频率传给模型进行推理,当模型收集到足够多的数据时,就能推算出当前空气的IAQ(空气质量),CO2(二氧化碳浓度,PPM),bVOC(有机物浓度PPM)。

image.png

‘’

这里我使用K10开发板来作为MCU,用来读取这个传感器。下载博世提供的两个库文件:

https://github.com/boschsensortec/Bosch-BSEC2-Library

https://github.com/boschsensortec/Bosch-BME68x-Library

库文件中,已经封装了AI模型推理的流程,这里只需要调用接口即可。首先初始化传感器:

void initSensor() {
    showStatusPage("Unit ENV-Pro", "Initializing sensor...");

    if (!envSensor.begin(BME68X_I2C_ADDR_HIGH, Wire)) {
        checkBsecStatus(envSensor);
        if (hasFatalStatus(envSensor)) return;
    }

    bsecSensor sensorList[] = {
        BSEC_OUTPUT_IAQ,
        BSEC_OUTPUT_RAW_TEMPERATURE,
        BSEC_OUTPUT_RAW_PRESSURE,
        BSEC_OUTPUT_RAW_HUMIDITY,
        BSEC_OUTPUT_RAW_GAS,
        BSEC_OUTPUT_BREATH_VOC_EQUIVALENT,
        BSEC_OUTPUT_CO2_EQUIVALENT,
        BSEC_OUTPUT_STABILIZATION_STATUS,
        BSEC_OUTPUT_RUN_IN_STATUS,
    };

    if (!envSensor.updateSubscription(sensorList, ARRAY_LEN(sensorList),
                                      BSEC_SAMPLE_RATE_LP)) {
        checkBsecStatus(envSensor);
        if (hasFatalStatus(envSensor)) return;
    }

    envSensor.attachCallback(newDataCallback);
    sensorReady = true;
    showStatusPage("Unit ENV-Pro", "Waiting for sensor data...");
}

然后循环调用接口,通过回调函数就可以获得推理的结果了。

// ============================================================
// BSEC 数据回调
// ============================================================
void newDataCallback(const bme68xData data, const bsecOutputs outputs,
                     Bsec2 bsec) {
    (void)data;
    (void)bsec;

    if (outputs.nOutputs == 0) return;

    values.timestampMs = outputs.output[0].time_stamp / INT64_C(1000000);

    for (uint8_t i = 0; i < outputs.nOutputs; ++i) {
        const bsecData& output = outputs.output[i];

        switch (output.sensor_id) {
            case BSEC_OUTPUT_IAQ:
                values.iaq      = String(output.signal, 2);
                values.accuracy = String(output.accuracy) + " / 3";
                break;
            case BSEC_OUTPUT_RAW_TEMPERATURE:
                values.temperature = String(output.signal, 2) + " C";
                break;
            case BSEC_OUTPUT_RAW_PRESSURE:
                values.pressure = String(output.signal, 2) + " Pa";
                break;
            case BSEC_OUTPUT_RAW_HUMIDITY:
                values.humidity = String(output.signal, 2) + " %";
                break;
            case BSEC_OUTPUT_RAW_GAS:
                values.gas = String(output.signal, 0) + " Ohm";
                break;
            case BSEC_OUTPUT_BREATH_VOC_EQUIVALENT:
                values.voc = String(output.signal, 2) + " ppm";
                break;
            case BSEC_OUTPUT_CO2_EQUIVALENT:
                values.co2 = String(output.signal, 1) + " ppm";
                break;
            case BSEC_OUTPUT_STABILIZATION_STATUS:
                values.stabilized = output.signal > 0.0f ? "Ready" : "Warming up";
                break;
            case BSEC_OUTPUT_RUN_IN_STATUS:
                values.runIn = output.signal > 0.0f ? "Complete" : "Running";
                break;
            default:
                break;
        }
    }

    drawDashboard();
}

然后将结果展示在屏幕上:

f2c41e28365fffc2a3fe7595c38796b6.jpg

屏幕右上方是原始数据中的:空气电阻值。留意一下Acc,这是数据的可信度。分4个等级。

acc含义IAQ 值可信度
0初始化中(STABILIZATION)无效,IAQ=50 是占位值
1已初始化,仍在学习基线开始有效,但误差大
2已校准可用,参考意义
3完全校准完全可信,稳定

540dafb5c0bded0d3a85ba02308d20c4.jpg

系统上电后,需要过一会(大约10分钟)Acc值才会转到1,但这时空气质量(IAQ;VOC;CO2)数据依旧不可信,需要等待AI模型继续学习,其余温度、湿度、气压数据是可用的。接下来就是漫长的等待(第一次约2小时,以后会快点),要等到模型收集到足够多的数据,才能做出推理。

746a9e878b7ce819355c76fd58f5b191.jpg


对着传感器轻轻吹气

image.png

弄了张湿纸巾,放在传感器旁边,瞬间VOC爆表(最高就是1000,IAQ也爆表,最高500)。但是CO2也受到了影响,开始增长起来。

c537cc651d178020e4aac8e55ec3f540.jpg


这个传感器使用下来的感受是:传感器很厉害,做到了一个传感器就能感知温度、湿度、气压、空气质量、CO2浓度、VOC浓度,而且感觉还挺准,有参考意义。但也有缺点,学习过程太慢了,首次使用,需要数小时的学习时长。再一个当用湿纸巾(含酒精)污染空气时,CO2浓度和IAQ浓度,都跟随变化,感觉不是很对。

K10-R8N16_bme688.zip




共1条 1/1 1 跳转至页

回复

匿名不能发帖!请先 [ 登陆 注册 ]