initial
This commit is contained in:
1 parent
7f066f338f
commit
5009ec0563
8 files changed
+848
-166
No files matched your search
+77
-137
@@ -1,88 +1,89 @@
|
||||
#ifdef HAS_BME
|
||||
|
||||
#include "bme680mems.h"
|
||||
#include "bsec.h"
|
||||
|
||||
// Local logging tag
|
||||
static const char TAG[] = "main";
|
||||
|
||||
bmeStatus_t bme_status;
|
||||
TaskHandle_t BmeTask;
|
||||
|
||||
float bme_offset = (float)BME_TEMP_OFFSET;
|
||||
|
||||
// --- Bosch BSEC library configuration ---
|
||||
// 3,3V supply voltage; 3s max time between sensor_control calls; 4 days
|
||||
// calibration. Change this const if not applicable for your application (see
|
||||
// BME680 datasheet)
|
||||
const uint8_t bsec_config_iaq[454] = {
|
||||
1, 7, 4, 1, 61, 0, 0, 0, 0, 0, 0, 0, 174, 1, 0,
|
||||
0, 48, 0, 1, 0, 137, 65, 0, 63, 205, 204, 204, 62, 0, 0,
|
||||
64, 63, 205, 204, 204, 62, 0, 0, 225, 68, 0, 192, 168, 71, 64,
|
||||
49, 119, 76, 0, 0, 0, 0, 0, 80, 5, 95, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 28, 0, 2, 0, 0, 244, 1, 225, 0, 25, 0,
|
||||
0, 128, 64, 0, 0, 32, 65, 144, 1, 0, 0, 112, 65, 0, 0,
|
||||
0, 63, 16, 0, 3, 0, 10, 215, 163, 60, 10, 215, 35, 59, 10,
|
||||
215, 35, 59, 9, 0, 5, 0, 0, 0, 0, 0, 1, 88, 0, 9,
|
||||
0, 229, 208, 34, 62, 0, 0, 0, 0, 0, 0, 0, 0, 218, 27,
|
||||
156, 62, 225, 11, 67, 64, 0, 0, 160, 64, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 94, 75, 72, 189, 93, 254, 159, 64, 66, 62, 160, 191,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 33, 31, 180, 190, 138, 176, 97,
|
||||
64, 65, 241, 99, 190, 0, 0, 0, 0, 0, 0, 0, 0, 167, 121,
|
||||
71, 61, 165, 189, 41, 192, 184, 30, 189, 64, 12, 0, 10, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 229, 0, 254, 0, 2, 1, 5, 48,
|
||||
117, 100, 0, 44, 1, 112, 23, 151, 7, 132, 3, 197, 0, 92, 4,
|
||||
144, 1, 64, 1, 64, 1, 144, 1, 48, 117, 48, 117, 48, 117, 48,
|
||||
117, 100, 0, 100, 0, 100, 0, 48, 117, 48, 117, 48, 117, 100, 0,
|
||||
100, 0, 48, 117, 48, 117, 100, 0, 100, 0, 100, 0, 100, 0, 48,
|
||||
117, 48, 117, 48, 117, 100, 0, 100, 0, 100, 0, 48, 117, 48, 117,
|
||||
100, 0, 100, 0, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44,
|
||||
1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1,
|
||||
44, 1, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8,
|
||||
7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7,
|
||||
112, 23, 112, 23, 112, 23, 112, 23, 112, 23, 112, 23, 112, 23, 112,
|
||||
23, 112, 23, 112, 23, 112, 23, 112, 23, 112, 23, 112, 23, 255, 255,
|
||||
255, 255, 255, 255, 255, 255, 220, 5, 220, 5, 220, 5, 255, 255, 255,
|
||||
255, 255, 255, 220, 5, 220, 5, 255, 255, 255, 255, 255, 255, 255, 255,
|
||||
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
||||
255, 255, 255, 255, 255, 255, 255, 255, 255, 44, 1, 0, 0, 0, 0,
|
||||
239, 79, 0, 0};
|
||||
Bsec iaqSensor;
|
||||
|
||||
// initialize BME680 sensor
|
||||
int bme_init(void) {
|
||||
|
||||
// struct bme680_dev gas_sensor;
|
||||
Wire.begin(HAS_BME, 400000); // I2C connect to BME680 sensor with 400 KHz
|
||||
Wire.begin(HAS_BME);
|
||||
iaqSensor.begin(BME_ADDR, Wire);
|
||||
|
||||
// Call to the function which initializes the BSEC library
|
||||
// Switch on low-power mode and provide no temperature offset
|
||||
ESP_LOGI(TAG, "BSEC v%d.%d.%d.%d", iaqSensor.version.major,
|
||||
iaqSensor.version.minor, iaqSensor.version.major_bugfix,
|
||||
iaqSensor.version.minor_bugfix);
|
||||
|
||||
return_values_init ret =
|
||||
bsec_iot_init(BSEC_SAMPLE_RATE_LP, bme_offset, i2c_write, i2c_read,
|
||||
user_delay_ms, state_load, config_load);
|
||||
iaqSensor.setConfig(bsec_config_iaq);
|
||||
|
||||
if ((int)ret.bme680_status) {
|
||||
ESP_LOGE(TAG, "Could not initialize BME680, error %d",
|
||||
(int)ret.bme680_status);
|
||||
} else if ((int)ret.bsec_status) {
|
||||
ESP_LOGE(TAG, "Could not initialize BSEC library, error %d",
|
||||
(int)ret.bsec_status);
|
||||
} else {
|
||||
if (checkIaqSensorStatus())
|
||||
ESP_LOGI(TAG, "BME680 sensor found and initialized");
|
||||
else {
|
||||
ESP_LOGE(TAG, "BME680 sensor not found");
|
||||
return 1;
|
||||
}
|
||||
|
||||
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,
|
||||
};
|
||||
|
||||
iaqSensor.updateSubscription(sensorList, 10, BSEC_SAMPLE_RATE_LP);
|
||||
|
||||
if (checkIaqSensorStatus())
|
||||
ESP_LOGI(TAG, "BSEC subscription succesful");
|
||||
else {
|
||||
ESP_LOGE(TAG, "BSEC subscription error");
|
||||
return 1;
|
||||
}
|
||||
|
||||
iaqSensor.setTemperatureOffset(bme_offset);
|
||||
|
||||
if (checkIaqSensorStatus())
|
||||
ESP_LOGI(TAG, "Ttemperature offset initialized succesful");
|
||||
else {
|
||||
ESP_LOGE(TAG, "Temperature offset initialization error");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void output_ready(int64_t timestamp, float iaq, uint8_t iaq_accuracy,
|
||||
float temperature, float humidity, float pressure,
|
||||
float raw_temperature, float raw_humidity, float gas,
|
||||
bsec_library_return_t bsec_status, float static_iaq,
|
||||
float co2_equivalent, float breath_voc_equivalent) {
|
||||
// Helper function definitions
|
||||
int checkIaqSensorStatus(void) {
|
||||
int rslt = 1; // true = 1 = no error, false = 0 = error
|
||||
|
||||
bme_status.temperature = temperature;
|
||||
bme_status.humidity = humidity;
|
||||
bme_status.pressure = (pressure / 100.0); // conversion Pa -> hPa
|
||||
bme_status.iaq = iaq;
|
||||
if (iaqSensor.status != BSEC_OK) {
|
||||
rslt = 0;
|
||||
if (iaqSensor.status < BSEC_OK)
|
||||
ESP_LOGE(TAG, "BSEC error %d", iaqSensor.status);
|
||||
else
|
||||
ESP_LOGW(TAG, "BSEC warning %d", iaqSensor.status);
|
||||
}
|
||||
|
||||
if (iaqSensor.bme680Status != BME680_OK) {
|
||||
rslt = 0;
|
||||
if (iaqSensor.bme680Status < BME680_OK)
|
||||
ESP_LOGE(TAG, "BME680 error %d", iaqSensor.bme680Status);
|
||||
else
|
||||
ESP_LOGW(TAG, "BME680 warning %d", iaqSensor.bme680Status);
|
||||
}
|
||||
|
||||
return rslt;
|
||||
}
|
||||
|
||||
// loop function which reads and processes data based on sensor settings
|
||||
@@ -91,84 +92,23 @@ void bme_loop(void *pvParameters) {
|
||||
configASSERT(((uint32_t)pvParameters) == 1); // FreeRTOS check
|
||||
|
||||
#ifdef HAS_BME
|
||||
// State is saved every 10.000 samples, which means every 10.000 * 3 secs =
|
||||
// 500 minutes
|
||||
bsec_iot_loop(user_delay_ms, get_timestamp_us, output_ready, state_save,
|
||||
10000);
|
||||
while (checkIaqSensorStatus()) {
|
||||
if (iaqSensor.run()) { // If new data is available
|
||||
bme_status.raw_temperature = iaqSensor.rawTemperature;
|
||||
bme_status.raw_humidity = iaqSensor.rawHumidity;
|
||||
bme_status.temperature = iaqSensor.temperature;
|
||||
bme_status.humidity = iaqSensor.humidity;
|
||||
bme_status.pressure =
|
||||
(iaqSensor.pressure / 100.0); // conversion Pa -> hPa
|
||||
bme_status.iaq = iaqSensor.iaqEstimate;
|
||||
bme_status.iaq_accuracy = iaqSensor.iaqAccuracy;
|
||||
bme_status.gas = iaqSensor.gasResistance;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
ESP_LOGE(TAG, "BME task ended");
|
||||
vTaskDelete(BmeTask); // should never be reached
|
||||
|
||||
} // bme_loop()
|
||||
|
||||
int8_t i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data,
|
||||
uint16_t len) {
|
||||
int8_t rslt = 0;
|
||||
Wire.beginTransmission(dev_id);
|
||||
Wire.write(reg_addr);
|
||||
rslt = Wire.endTransmission(false);
|
||||
|
||||
Wire.requestFrom((int)dev_id, (int)len);
|
||||
for (uint16_t i = 0; (i < len) && Wire.available(); i++) {
|
||||
reg_data[i] = Wire.read();
|
||||
}
|
||||
// return 0 for success, non-zero for failure
|
||||
return rslt;
|
||||
}
|
||||
|
||||
int8_t i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data,
|
||||
uint16_t len) {
|
||||
Wire.beginTransmission(dev_id);
|
||||
Wire.write(reg_addr);
|
||||
for (uint16_t i = 0; i < len; i++) {
|
||||
Wire.write(reg_data[i]);
|
||||
}
|
||||
// return 0 for success, non-zero for failure
|
||||
return Wire.endTransmission(true);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Load previous library state from non-volatile memory
|
||||
*
|
||||
* @param[in,out] state_buffer buffer to hold the loaded state string
|
||||
* @param[in] n_buffer size of the allocated state buffer
|
||||
*
|
||||
* @return number of bytes copied to state_buffer
|
||||
*/
|
||||
uint32_t state_load(uint8_t *state_buffer, uint32_t n_buffer) {
|
||||
// ...
|
||||
// Load a previous library state from non-volatile memory, if available.
|
||||
//
|
||||
// Return zero if loading was unsuccessful or no state was available,
|
||||
// otherwise return length of loaded state string.
|
||||
// ...
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Save library state to non-volatile memory
|
||||
*
|
||||
* @param[in] state_buffer buffer holding the state to be stored
|
||||
* @param[in] length length of the state string to be stored
|
||||
*
|
||||
* @return none
|
||||
*/
|
||||
void state_save(const uint8_t *state_buffer, uint32_t length) {
|
||||
// ...
|
||||
// Save the string some form of non-volatile memory, if possible.
|
||||
// ...
|
||||
}
|
||||
|
||||
uint32_t config_load(uint8_t *config_buffer, uint32_t n_buffer) {
|
||||
|
||||
// Load a library config from non-volatile memory, if available.
|
||||
// Return zero if loading was unsuccessful or no config was available,
|
||||
// otherwise return length of loaded config string.
|
||||
|
||||
memcpy(config_buffer, bsec_config_iaq, sizeof(bsec_config_iaq));
|
||||
return sizeof(bsec_config_iaq);
|
||||
}
|
||||
|
||||
void user_delay_ms(uint32_t period) { delay(period); }
|
||||
|
||||
int64_t get_timestamp_us() { return (int64_t)millis() * 1000; }
|
||||
|
||||
#endif // HAS_BME
|
||||
+1
-1
@@ -17,8 +17,8 @@
|
||||
|
||||
// enable only if device has these sensors, otherwise comment these lines
|
||||
// BME680 sensor on I2C bus
|
||||
// don't forget to connect SDIO of BME680 to GND for selecting i2c addr 0x76
|
||||
#define HAS_BME GPIO_NUM_21, GPIO_NUM_22 // SDA, SCL
|
||||
#define BME_ADDR BME680_I2C_ADDR_PRIMARY // connect SDIO of BME680 to GND
|
||||
|
||||
// user defined sensors
|
||||
//#define HAS_SENSORS 1 // comment out if device has user defined sensors
|
||||
|
||||
+1
-3
@@ -11,11 +11,9 @@
|
||||
// disable brownout detection (avoid unexpected reset on some boards)
|
||||
#define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature
|
||||
|
||||
// enable only if device has these sensors, otherwise comment these lines
|
||||
// BME680 sensor on I2C bus
|
||||
// Octopus32 has a pre-populated BME680 on i2c addr 0x76
|
||||
#define HAS_BME GPIO_NUM_23, GPIO_NUM_22 // SDA, SCL
|
||||
//#define HAS_BME 0x76
|
||||
#define BME_ADDR BME680_I2C_ADDR_PRIMARY // connect SDIO of BME680 to GND
|
||||
|
||||
// user defined sensors
|
||||
//#define HAS_SENSORS 1 // comment out if device has user defined sensors
|
||||
|
||||
@@ -8,12 +8,11 @@
|
||||
// Hardware related definitions for TTGO T-Beam board
|
||||
//
|
||||
// pinouts taken from http://tinymicros.com/wiki/TTGO_T-Beam
|
||||
//
|
||||
|
||||
// enable only if device has these sensors, otherwise comment these lines
|
||||
// BME680 sensor on I2C bus
|
||||
// don't forget to connect SDIO of BME680 to GND for selecting i2c addr 0x76
|
||||
//
|
||||
//#define HAS_BME GPIO_NUM_21, GPIO_NUM_22 // SDA, SCL
|
||||
#define HAS_BME GPIO_NUM_21, GPIO_NUM_22 // SDA, SCL
|
||||
#define BME_ADDR BME680_I2C_ADDR_PRIMARY // connect SDIO of BME680 to GND
|
||||
|
||||
#define HAS_LED GPIO_NUM_14 // on board green LED
|
||||
|
||||
|
||||
Reference in new issue
Block a user