
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)。

‘’
这里我使用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();
}然后将结果展示在屏幕上:

屏幕右上方是原始数据中的:空气电阻值。留意一下Acc,这是数据的可信度。分4个等级。
| acc | 含义 | IAQ 值可信度 |
| 0 | 初始化中(STABILIZATION) | 无效,IAQ=50 是占位值 |
| 1 | 已初始化,仍在学习基线 | 开始有效,但误差大 |
| 2 | 已校准 | 可用,参考意义 |
| 3 | 完全校准 | 完全可信,稳定 |

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

对着传感器轻轻吹气

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

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