ESP32-PaxCounter/src/bmesensor.cpp

180 lines
5.1 KiB
C++
Raw Normal View History

2019-03-13 21:15:28 +01:00
#if (HAS_BME)
2018-11-22 23:37:53 +01:00
2019-03-13 21:15:28 +01:00
#include "bmesensor.h"
2018-11-22 23:37:53 +01:00
2020-12-22 20:06:16 +01:00
bmeStatus_t bme_status = {0, 0, 0, 0, 0, 0, 0, 0};
Ticker bmecycler;
2019-03-13 21:15:28 +01:00
#define SEALEVELPRESSURE_HPA (1013.25)
#ifdef HAS_BME680
bsec_virtual_sensor_t sensorList[10] = {
BSEC_OUTPUT_RAW_TEMPERATURE,
BSEC_OUTPUT_RAW_PRESSURE,
BSEC_OUTPUT_RAW_HUMIDITY,
BSEC_OUTPUT_RAW_GAS,
BSEC_OUTPUT_IAQ,
BSEC_OUTPUT_STATIC_IAQ,
BSEC_OUTPUT_CO2_EQUIVALENT,
BSEC_OUTPUT_BREATH_VOC_EQUIVALENT,
BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE,
BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY,
};
2019-01-06 19:41:42 +01:00
uint8_t bsecstate_buffer[BSEC_MAX_STATE_BLOB_SIZE] = {0};
2019-01-06 19:41:42 +01:00
Bsec iaqSensor;
2019-03-13 21:15:28 +01:00
#elif defined HAS_BME280
2019-12-15 17:03:33 +01:00
Adafruit_BME280 bme; // using I2C interface
// use these alternative constructors for other hw interface types
// Adafruit_BME280 bme(BME_CS); // hardware SPI
2019-03-13 21:15:28 +01:00
// Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
2019-12-08 12:58:12 +01:00
#elif defined HAS_BMP180
Adafruit_BMP085 bmp; // I2C
2019-03-13 21:15:28 +01:00
#endif
void setBMEIRQ() { xTaskNotify(irqHandlerTask, BME_IRQ, eSetBits); }
2020-10-30 12:25:15 +01:00
// initialize MEMS sensor
2020-12-28 18:32:47 +01:00
// return = 0 -> error / return = 1 -> success
2018-11-25 12:49:49 +01:00
int bme_init(void) {
2020-12-28 18:32:47 +01:00
int rc = 0;
2018-12-31 15:46:52 +01:00
2019-03-13 21:15:28 +01:00
#ifdef HAS_BME680
Wire.begin(HAS_BME680);
iaqSensor.begin(BME680_ADDR, Wire);
2018-11-22 23:37:53 +01:00
ESP_LOGI(TAG, "BSEC v%d.%d.%d.%d", iaqSensor.version.major,
iaqSensor.version.minor, iaqSensor.version.major_bugfix,
iaqSensor.version.minor_bugfix);
2018-11-25 16:05:30 +01:00
iaqSensor.setConfig(bsec_config_iaq);
loadState();
iaqSensor.setTemperatureOffset((float)BME_TEMP_OFFSET);
iaqSensor.updateSubscription(sensorList, 10, BSEC_SAMPLE_RATE_LP);
2018-12-21 00:35:21 +01:00
rc = checkIaqSensorStatus();
2019-03-13 21:15:28 +01:00
#elif defined HAS_BME280
rc = bme.begin(BME280_ADDR);
2019-12-08 12:58:12 +01:00
#elif defined HAS_BMP180
// Wire.begin(21, 22);
rc = bmp.begin();
2020-12-28 18:32:47 +01:00
2019-03-13 21:15:28 +01:00
#endif
2019-07-31 22:20:18 +02:00
if (rc)
2020-12-28 18:32:47 +01:00
bmecycler.attach(BMECYCLE, setBMEIRQ); // start cyclic data transmit
2019-07-25 22:04:38 +02:00
return rc;
} // bme_init()
2018-11-22 23:37:53 +01:00
2019-03-13 21:15:28 +01:00
#ifdef HAS_BME680
2018-12-26 23:01:54 +01:00
// Helper function definitions
int checkIaqSensorStatus(void) {
int rslt = 1; // true = 1 = no error, false = 0 = error
2023-03-12 17:42:40 +01:00
if (iaqSensor.bsecStatus != BSEC_OK) {
2018-12-26 23:01:54 +01:00
rslt = 0;
2023-03-12 17:42:40 +01:00
if (iaqSensor.bsecStatus < BSEC_OK)
ESP_LOGE(TAG, "BSEC error %d", iaqSensor.bsecStatus);
2018-12-26 23:01:54 +01:00
else
2023-03-12 17:42:40 +01:00
ESP_LOGW(TAG, "BSEC warning %d", iaqSensor.bsecStatus);
2018-11-22 23:37:53 +01:00
}
2023-03-12 17:42:40 +01:00
if (iaqSensor.bme68xStatus != BME68X_OK) {
2018-12-26 23:01:54 +01:00
rslt = 0;
2023-03-12 17:42:40 +01:00
if (iaqSensor.bme68xStatus < BME68X_OK)
ESP_LOGE(TAG, "BME680 error %d", iaqSensor.bme68xStatus);
2018-12-26 23:01:54 +01:00
else
2023-03-12 17:42:40 +01:00
ESP_LOGW(TAG, "BME680 warning %d", iaqSensor.bme68xStatus);
2018-12-26 23:01:54 +01:00
}
2018-11-25 11:48:03 +01:00
2018-12-26 23:01:54 +01:00
return rslt;
} // checkIaqSensorStatus()
2019-03-13 21:15:28 +01:00
#endif
2018-11-25 11:48:03 +01:00
// store current BME sensor data in struct
void bme_storedata(bmeStatus_t *bme_store) {
if (cfg.payloadmask & MEMS_DATA)
2018-11-25 11:48:03 +01:00
2019-03-08 18:13:51 +01:00
#ifdef HAS_BME680
if (iaqSensor.run()) { // if new data is available
bme_store->raw_temperature =
iaqSensor.rawTemperature; // temperature in degree celsius
bme_store->raw_humidity = iaqSensor.rawHumidity;
bme_store->temperature = iaqSensor.temperature;
bme_store->humidity =
iaqSensor.humidity; // humidity in % relative humidity x1000
bme_store->pressure = // pressure in Pascal
(iaqSensor.pressure / 100.0); // conversion Pa -> hPa
2020-01-28 21:49:24 +01:00
bme_store->iaq = iaqSensor.iaq;
bme_store->iaq_accuracy = iaqSensor.iaqAccuracy;
bme_store->gas = iaqSensor.gasResistance; // gas resistance in ohms
updateState();
2018-12-26 23:01:54 +01:00
}
2019-03-13 21:15:28 +01:00
#elif defined HAS_BME280
bme_store->temperature = bme.readTemperature();
bme_store->pressure = (bme.readPressure() / 100.0); // conversion Pa -> hPa
// bme.readAltitude(SEALEVELPRESSURE_HPA);
bme_store->humidity = bme.readHumidity();
bme_store->iaq = 0; // IAQ feature not present with BME280
2019-12-08 12:58:12 +01:00
#elif defined HAS_BMP180
bme_store->temperature = bmp.readTemperature();
bme_store->pressure = (bmp.readPressure() / 100.0); // conversion Pa -> hPa
// bme.readAltitude(SEALEVELPRESSURE_HPA);
bme_store->iaq = 0; // IAQ feature not present with BME280
2018-12-26 23:01:54 +01:00
#endif
} // bme_storedata()
2018-11-25 11:48:03 +01:00
2019-03-13 21:15:28 +01:00
#ifdef HAS_BME680
void loadState(void) {
2019-01-01 21:23:45 +01:00
if (cfg.bsecstate[BSEC_MAX_STATE_BLOB_SIZE] == BSEC_MAX_STATE_BLOB_SIZE) {
// Existing state in NVS stored
ESP_LOGI(TAG, "restoring BSEC state from NVRAM");
2018-12-31 15:46:52 +01:00
memcpy(bsecstate_buffer, cfg.bsecstate, BSEC_MAX_STATE_BLOB_SIZE);
iaqSensor.setState(bsecstate_buffer);
checkIaqSensorStatus();
} else // no state stored
ESP_LOGI(TAG,
"no BSEC state stored in NVRAM, starting sensor with defaults");
}
void updateState(void) {
bool update = false;
2020-12-21 22:11:41 +01:00
static uint16_t stateUpdateCounter = 0;
if (stateUpdateCounter == 0) {
2019-01-06 19:41:42 +01:00
// first state update when IAQ accuracy is >= 1
if (iaqSensor.iaqAccuracy >= 1) {
update = true;
stateUpdateCounter++;
}
} else {
/* Update every STATE_SAVE_PERIOD minutes */
2020-12-21 22:11:41 +01:00
if ((long)(millis() - stateUpdateCounter * STATE_SAVE_PERIOD) >= 0) {
update = true;
stateUpdateCounter++;
}
}
if (update) {
2018-12-31 15:46:52 +01:00
iaqSensor.getState(bsecstate_buffer);
checkIaqSensorStatus();
2019-01-01 14:59:00 +01:00
memcpy(cfg.bsecstate, bsecstate_buffer, BSEC_MAX_STATE_BLOB_SIZE);
2019-01-01 21:23:45 +01:00
cfg.bsecstate[BSEC_MAX_STATE_BLOB_SIZE] = BSEC_MAX_STATE_BLOB_SIZE;
ESP_LOGI(TAG, "saving BSEC state to NVRAM");
saveConfig(false);
}
}
2019-03-13 21:15:28 +01:00
#endif
2019-03-13 21:15:28 +01:00
#endif // HAS_BME