use BSEC2 for ESP32-C3

This commit is contained in:
Thomas Göttgens 2023-05-05 18:09:06 +02:00
parent 7c9d0a022a
commit 10f41e376c
4 changed files with 42 additions and 13 deletions

View File

@ -25,6 +25,7 @@ build_flags =
-DCONFIG_NIMBLE_CPP_LOG_LEVEL=2 -DCONFIG_NIMBLE_CPP_LOG_LEVEL=2
-DCONFIG_BT_NIMBLE_MAX_CCCDS=20 -DCONFIG_BT_NIMBLE_MAX_CCCDS=20
-DESP_OPENSSL_SUPPRESS_LEGACY_WARNING -DESP_OPENSSL_SUPPRESS_LEGACY_WARNING
-DUSE_BSEC2
;-DDEBUG_HEAP ;-DDEBUG_HEAP
lib_deps = lib_deps =
@ -35,9 +36,13 @@ lib_deps =
h2zero/NimBLE-Arduino@^1.4.0 h2zero/NimBLE-Arduino@^1.4.0
https://github.com/lewisxhe/XPowersLib.git#84b7373faea3118b6c37954d52f98b8a337148d6 https://github.com/lewisxhe/XPowersLib.git#84b7373faea3118b6c37954d52f98b8a337148d6
https://github.com/meshtastic/ESP32_Codec2.git#633326c78ac251c059ab3a8c430fcdf25b41672f https://github.com/meshtastic/ESP32_Codec2.git#633326c78ac251c059ab3a8c430fcdf25b41672f
boschsensortec/BSEC2 Software Library@^1.3.2200
boschsensortec/BME68x Sensor Library@^1.1.40407
lib_ignore = lib_ignore =
segger_rtt segger_rtt
ESP32 BLE Arduino ESP32 BLE Arduino
BSEC Software Library
; customize the partition table ; customize the partition table
; http://docs.platformio.org/en/latest/platforms/espressif32.html#partition-tables ; http://docs.platformio.org/en/latest/platforms/espressif32.html#partition-tables

View File

@ -13,8 +13,12 @@ int32_t BME680Sensor::runOnce()
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
} }
bme680.begin(nodeTelemetrySensorsMap[sensorType], Wire); bme680.begin(nodeTelemetrySensorsMap[sensorType], Wire);
#ifdef USE_BSEC2
if (bme680.status == BSEC_OK) {
#else
if (bme680.bsecStatus == BSEC_OK) { if (bme680.bsecStatus == BSEC_OK) {
bme680.setConfig(bsec_config_iaq); #endif
bme680.setConfig(Default_H2S_NonH2S_config);
loadState(); loadState();
bme680.updateSubscription(sensorList, 13, BSEC_SAMPLE_RATE_LP); bme680.updateSubscription(sensorList, 13, BSEC_SAMPLE_RATE_LP);
status = 1; status = 1;
@ -22,6 +26,7 @@ int32_t BME680Sensor::runOnce()
status = 0; status = 0;
} }
return initI2CSensor(); return initI2CSensor();
} }
@ -30,10 +35,17 @@ void BME680Sensor::setup() {}
bool BME680Sensor::getMetrics(meshtastic_Telemetry *measurement) bool BME680Sensor::getMetrics(meshtastic_Telemetry *measurement)
{ {
bme680.run(); bme680.run();
#ifdef USE_BSEC2
measurement->variant.environment_metrics.temperature = bme680.getData(BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE).signal;
measurement->variant.environment_metrics.relative_humidity = bme680.getData(BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY).signal;
measurement->variant.environment_metrics.barometric_pressure = bme680.getData(BSEC_OUTPUT_RAW_PRESSURE).signal / 100.0F;
measurement->variant.environment_metrics.gas_resistance = bme680.getData(BSEC_OUTPUT_RAW_GAS).signal / 1000.0;
#else
measurement->variant.environment_metrics.temperature = bme680.temperature; measurement->variant.environment_metrics.temperature = bme680.temperature;
measurement->variant.environment_metrics.relative_humidity = bme680.humidity; measurement->variant.environment_metrics.relative_humidity = bme680.humidity;
measurement->variant.environment_metrics.barometric_pressure = bme680.pressure / 100.0F; measurement->variant.environment_metrics.barometric_pressure = bme680.pressure / 100.0F;
measurement->variant.environment_metrics.gas_resistance = bme680.gasResistance / 1000.0; measurement->variant.environment_metrics.gas_resistance = bme680.gasResistance / 1000.0;
#endif
// Check if we need to save state to filesystem (every STATE_SAVE_PERIOD ms) // Check if we need to save state to filesystem (every STATE_SAVE_PERIOD ms)
updateState(); updateState();
return true; return true;
@ -62,12 +74,17 @@ void BME680Sensor::updateState()
bool update = false; bool update = false;
if (stateUpdateCounter == 0) { if (stateUpdateCounter == 0) {
/* First state update when IAQ accuracy is >= 3 */ /* First state update when IAQ accuracy is >= 3 */
if (bme680.iaqAccuracy >= 3) { #ifdef USE_BSEC2
LOG_DEBUG("%s state update IAQ accuracy %u >= 3\n", sensorName, bme680.iaqAccuracy); accuracy = bme680.getData(BSEC_OUTPUT_IAQ).accuracy;
#else
accuracy = bme680.iaqAccuracy;
#endif
if (accuracy >= 3) {
LOG_DEBUG("%s state update IAQ accuracy %u >= 3\n", sensorName, accuracy);
update = true; update = true;
stateUpdateCounter++; stateUpdateCounter++;
} else { } else {
LOG_DEBUG("%s not updated, IAQ accuracy is %u >= 3\n", sensorName, bme680.iaqAccuracy); LOG_DEBUG("%s not updated, IAQ accuracy is %u >= 3\n", sensorName, accuracy);
} }
} else { } else {
/* Update every STATE_SAVE_PERIOD minutes */ /* Update every STATE_SAVE_PERIOD minutes */

View File

@ -1,22 +1,35 @@
#include "../mesh/generated/meshtastic/telemetry.pb.h" #include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h" #include "TelemetrySensor.h"
#ifdef USE_BSEC2
#include <bsec2.h>
#else
#include <bsec.h> #include <bsec.h>
#endif // USE_BSEC2
#define STATE_SAVE_PERIOD UINT32_C(360 * 60 * 1000) // That's 6 hours worth of millis() #define STATE_SAVE_PERIOD UINT32_C(360 * 60 * 1000) // That's 6 hours worth of millis()
const uint8_t bsec_config_iaq[] = { #ifdef USE_BSEC2
#include "config/Default_H2S_NonH2S/Default_H2S_NonH2S.h"
#else
const uint8_t Default_H2S_NonH2S_config[] = {
#include <config/generic_33v_3s_4d/bsec_iaq.txt> #include <config/generic_33v_3s_4d/bsec_iaq.txt>
}; };
#endif // USE_BSEC2
class BME680Sensor : virtual public TelemetrySensor class BME680Sensor : virtual public TelemetrySensor
{ {
private: private:
#ifdef USE_BSEC2
Bsec2 bme680;
#else
Bsec bme680; Bsec bme680;
#endif // USE_BSEC2
protected: protected:
virtual void setup() override; virtual void setup() override;
const char *bsecConfigFileName = "/prefs/bsec.dat"; const char *bsecConfigFileName = "/prefs/bsec.dat";
uint8_t bsecState[BSEC_MAX_STATE_BLOB_SIZE] = {0}; uint8_t bsecState[BSEC_MAX_STATE_BLOB_SIZE] = {0};
uint8_t accuracy = 0;
uint16_t stateUpdateCounter = 0; uint16_t stateUpdateCounter = 0;
bsec_virtual_sensor_t sensorList[13] = {BSEC_OUTPUT_IAQ, bsec_virtual_sensor_t sensorList[13] = {BSEC_OUTPUT_IAQ,
BSEC_OUTPUT_STATIC_IAQ, BSEC_OUTPUT_STATIC_IAQ,

View File

@ -5,10 +5,4 @@ board_level = extra
build_flags = ${esp32c3_base.build_flags} build_flags = ${esp32c3_base.build_flags}
-D PRIVATE_HW -D PRIVATE_HW
-I variants/ai-c3 -I variants/ai-c3
; as long as BSEC2 Software Library is not supported remove Sensors from build
build_src_filter = ${esp32c3_base.build_src_filter}
-<modules/Telemetry/EnvironmentTelemetry.cpp>
-<modules/Telemetry/AirQualityTelemetry.cpp>
-<modules/Telemetry/Sensor>
lib_ignore = ${esp32c3_base.lib_ignore}
BSEC Software Library