[P106] Update BME680 library to latest

This commit is contained in:
Ton Huisman
2023-04-15 22:08:10 +02:00
parent b802fdba89
commit d86a95caaa
11 changed files with 3421 additions and 2489 deletions
+223 -331
View File
@@ -32,28 +32,16 @@
//#define BME680_DEBUG
/** Wire object **/
TwoWire *_wire = NULL;
/** SPI object **/
SPIClass *_spi = NULL;
/** These SPI pins must be global in order to work with underlying library **/
int8_t _BME680_SoftwareSPI_MOSI; ///< Global SPI MOSI pin
int8_t _BME680_SoftwareSPI_MISO; ///< Global SPI MISO pin
int8_t _BME680_SoftwareSPI_SCK; ///< Globak SPI Clock pin
/** Our hardware interface functions **/
static int8_t i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data,
uint16_t len);
static int8_t i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data,
uint16_t len);
static int8_t spi_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data,
uint16_t len);
static int8_t spi_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data,
uint16_t len);
static uint8_t spi_transfer(uint8_t x);
static void delay_msec(uint32_t ms);
static int8_t i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len,
void *interface);
static int8_t i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t len,
void *interface);
static int8_t spi_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len,
void *interface);
static int8_t spi_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t len,
void *interface);
static void delay_usec(uint32_t us, void *intf_ptr);
// PUBLIC FUNCTIONS
@@ -63,13 +51,8 @@ static void delay_msec(uint32_t ms);
* optional Wire object
*/
Adafruit_BME680::Adafruit_BME680(TwoWire *theWire)
: _cs(-1), _meas_start(0), _meas_period(0) {
: _meas_start(0), _meas_period(0) {
_wire = theWire;
_BME680_SoftwareSPI_MOSI = -1;
_BME680_SoftwareSPI_MISO = -1;
_BME680_SoftwareSPI_SCK = -1;
_filterEnabled = _tempEnabled = _humEnabled = _presEnabled = _gasEnabled =
false;
}
/*!
@@ -80,13 +63,9 @@ Adafruit_BME680::Adafruit_BME680(TwoWire *theWire)
* optional SPI object
*/
Adafruit_BME680::Adafruit_BME680(int8_t cspin, SPIClass *theSPI)
: _cs(cspin), _meas_start(0), _meas_period(0) {
_spi = theSPI;
_BME680_SoftwareSPI_MOSI = -1;
_BME680_SoftwareSPI_MISO = -1;
_BME680_SoftwareSPI_SCK = -1;
_filterEnabled = _tempEnabled = _humEnabled = _presEnabled = _gasEnabled =
false;
: _meas_start(0), _meas_period(0) {
_spidev = new Adafruit_SPIDevice(cspin, 1000000, SPI_BITORDER_MSBFIRST,
SPI_MODE0, theSPI);
}
/*!
@@ -102,12 +81,9 @@ Adafruit_BME680::Adafruit_BME680(int8_t cspin, SPIClass *theSPI)
*/
Adafruit_BME680::Adafruit_BME680(int8_t cspin, int8_t mosipin, int8_t misopin,
int8_t sckpin)
: _cs(cspin), _meas_start(0), _meas_period(0) {
_BME680_SoftwareSPI_MOSI = mosipin;
_BME680_SoftwareSPI_MISO = misopin;
_BME680_SoftwareSPI_SCK = sckpin;
_filterEnabled = _tempEnabled = _humEnabled = _presEnabled = _gasEnabled =
false;
: _meas_start(0), _meas_period(0) {
_spidev = new Adafruit_SPIDevice(cspin, sckpin, misopin, mosipin, 1000000,
SPI_BITORDER_MSBFIRST, SPI_MODE0);
}
/*!
@@ -122,45 +98,46 @@ Adafruit_BME680::Adafruit_BME680(int8_t cspin, int8_t mosipin, int8_t misopin,
* @return True on sensor initialization success. False on failure.
*/
bool Adafruit_BME680::begin(uint8_t addr, bool initSettings) {
_i2caddr = addr;
int8_t rslt;
if (_cs == -1) {
// i2c
_wire->begin();
gas_sensor.dev_id = addr;
gas_sensor.intf = BME680_I2C_INTF;
gas_sensor.read = &i2c_read;
gas_sensor.write = &i2c_write;
} else {
digitalWrite(_cs, HIGH);
pinMode(_cs, OUTPUT);
if (_BME680_SoftwareSPI_SCK == -1) {
// hardware SPI
_spi->begin();
} else {
// software SPI
pinMode(_BME680_SoftwareSPI_SCK, OUTPUT);
pinMode(_BME680_SoftwareSPI_MOSI, OUTPUT);
pinMode(_BME680_SoftwareSPI_MISO, INPUT);
if (!_spidev) { // i2c
if (_i2cdev) {
delete _i2cdev;
}
_i2cdev = new Adafruit_I2CDevice(addr, _wire);
if (!_i2cdev->begin()) {
return false;
}
gas_sensor.dev_id = _cs;
gas_sensor.intf = BME680_SPI_INTF;
gas_sensor.chip_id = addr;
gas_sensor.intf = BME68X_I2C_INTF;
gas_sensor.intf_ptr = (void *)_i2cdev;
gas_sensor.read = &i2c_read;
gas_sensor.write = &i2c_write;
} else {
if (!_spidev->begin()) {
return false;
}
gas_sensor.chip_id = 0;
gas_sensor.intf = BME68X_SPI_INTF;
gas_sensor.intf_ptr = (void *)_spidev;
gas_sensor.read = &spi_read;
gas_sensor.write = &spi_write;
}
gas_sensor.delay_ms = delay_msec;
gas_sensor.amb_temp = 25; /* The ambient temperature in deg C is used for
defining the heater temperature */
gas_sensor.delay_us = delay_usec;
int8_t rslt = bme680_init(&gas_sensor);
rslt = bme68x_init(&gas_sensor);
#ifdef BME680_DEBUG
Serial.print("Result: ");
Serial.print(F("Init Result: "));
Serial.println(rslt);
#endif
if (rslt != BME680_OK)
if (rslt != BME68X_OK)
return false;
#ifdef BME680_DEBUG
@@ -225,16 +202,25 @@ bool Adafruit_BME680::begin(uint8_t addr, bool initSettings) {
#endif
if (initSettings) {
setTemperatureOversampling(BME680_OS_8X);
setHumidityOversampling(BME680_OS_2X);
setPressureOversampling(BME680_OS_4X);
setIIRFilterSize(BME680_FILTER_SIZE_3);
setIIRFilterSize(BME68X_FILTER_SIZE_3);
setODR(BME68X_ODR_NONE);
setHumidityOversampling(BME68X_OS_2X);
setPressureOversampling(BME68X_OS_4X);
setTemperatureOversampling(BME68X_OS_8X);
setGasHeater(320, 150); // 320*C for 150 ms
} else {
setGasHeater(0, 0);
}
// don't do anything till we request a reading
gas_sensor.power_mode = BME680_FORCED_MODE;
rslt = bme68x_set_op_mode(BME68X_FORCED_MODE, &gas_sensor);
#ifdef BME680_DEBUG
Serial.print(F("Opmode Result: "));
Serial.println(rslt);
#endif
if (rslt != BME68X_OK)
return false;
return true;
}
@@ -304,66 +290,56 @@ float Adafruit_BME680::readAltitude(float seaLevel) {
*/
bool Adafruit_BME680::performReading(void) { return endReading(); }
unsigned long Adafruit_BME680::beginReading(void) {
/*! @brief Begin an asynchronous reading.
* @return When the reading would be ready as absolute time in millis().
*/
uint32_t Adafruit_BME680::beginReading(void) {
if (_meas_start != 0) {
/* A measurement is already in progress */
return _meas_start + _meas_period;
}
uint8_t set_required_settings = 0;
int8_t rslt;
/* Select the power mode */
/* Must be set before writing the sensor configuration */
gas_sensor.power_mode = BME680_FORCED_MODE;
/* Set the required sensor settings needed */
if (_tempEnabled)
set_required_settings |= BME680_OST_SEL;
if (_humEnabled)
set_required_settings |= BME680_OSH_SEL;
if (_presEnabled)
set_required_settings |= BME680_OSP_SEL;
if (_filterEnabled)
set_required_settings |= BME680_FILTER_SEL;
if (_gasEnabled)
set_required_settings |= BME680_GAS_SENSOR_SEL;
/* Set the desired sensor configuration */
int8_t rslt = bme68x_set_op_mode(BME68X_FORCED_MODE, &gas_sensor);
#ifdef BME680_DEBUG
Serial.println("Setting sensor settings");
Serial.print(F("Opmode Result: "));
Serial.println(rslt);
#endif
rslt = bme680_set_sensor_settings(set_required_settings, &gas_sensor);
if (rslt != BME680_OK)
return 0;
if (rslt != BME68X_OK)
return false;
/* Set the power mode */
#ifdef BME680_DEBUG
Serial.println("Setting power mode");
#endif
rslt = bme680_set_sensor_mode(&gas_sensor);
if (rslt != BME680_OK)
return 0;
/* Calculate delay period in microseconds */
uint32_t delayus_period = (uint32_t)bme68x_get_meas_dur(
BME68X_FORCED_MODE, &gas_conf, &gas_sensor) +
((uint32_t)gas_heatr_conf.heatr_dur * 1000);
// Serial.print("measure: ");
// Serial.println(bme68x_get_meas_dur(BME68X_FORCED_MODE, &gas_conf,
// &gas_sensor)); Serial.print("heater: ");
// Serial.println((uint32_t)gas_heatr_conf.heatr_dur * 1000);
/* Get the total measurement duration so as to sleep or wait till the
* measurement is complete */
uint16_t meas_period;
bme680_get_profile_dur(&meas_period, &gas_sensor);
_meas_start = millis();
_meas_period = meas_period;
_meas_period = delayus_period / 1000;
return _meas_start + _meas_period;
}
/*! @brief End an asynchronous reading.
* If the asynchronous reading is still in progress, block until it
* ends. If no asynchronous reading has started, this is equivalent to
* performReading().
* @return Whether success.
*/
bool Adafruit_BME680::endReading(void) {
unsigned long meas_end = beginReading();
uint32_t meas_end = beginReading();
if (meas_end == 0) {
return false;
}
int remaining_millis = remainingReadingMillis();
if (remaining_millis > 0) {
#ifdef BME680_DEBUG
Serial.print("Waiting (ms) ");
Serial.print(F("Waiting (ms) "));
Serial.println(remaining_millis);
#endif
delay(static_cast<unsigned int>(remaining_millis) *
@@ -373,54 +349,54 @@ bool Adafruit_BME680::endReading(void) {
_meas_period = 0;
#ifdef BME680_DEBUG
Serial.print("t_fine = ");
Serial.print(F("t_fine = "));
Serial.println(gas_sensor.calib.t_fine);
#endif
struct bme680_field_data data;
struct bme68x_data data;
uint8_t n_fields;
// Serial.println("Getting sensor data");
int8_t rslt = bme680_get_sensor_data(&data, &gas_sensor);
if (rslt != BME680_OK)
#ifdef BME680_DEBUG
Serial.println(F("Getting sensor data"));
#endif
int8_t rslt =
bme68x_get_data(BME68X_FORCED_MODE, &data, &n_fields, &gas_sensor);
#ifdef BME680_DEBUG
Serial.print(F("GetData Result: "));
Serial.println(rslt);
#endif
if (rslt != BME68X_OK)
return false;
if (_tempEnabled) {
// Serial.print("Temp: "); Serial.println(data.temperature / 100.0, 2);
temperature = data.temperature / 100.0;
} else {
temperature = NAN;
}
if (_humEnabled) {
// Serial.print("Hum: "); Serial.println(data.humidity / 1000.0, 2);
humidity = data.humidity / 1000.0;
} else {
humidity = NAN;
}
if (_presEnabled) {
// Serial.print("Pres: "); Serial.println(data.pressure, 2);
if (n_fields) {
temperature = data.temperature;
humidity = data.humidity;
pressure = data.pressure;
} else {
pressure = 0;
}
/* Avoid using measurements from an unstable heating setup */
if (_gasEnabled) {
if (data.status & BME680_HEAT_STAB_MSK) {
#ifdef BME680_DEBUG
Serial.print(F("data.status 0x"));
Serial.println(data.status, HEX);
#endif
if (data.status & (BME68X_HEAT_STAB_MSK | BME68X_GASM_VALID_MSK)) {
// Serial.print("Gas resistance: "); Serial.println(data.gas_resistance);
gas_resistance = data.gas_resistance;
} else {
gas_resistance = 0;
// Serial.println("Gas reading unstable!");
}
} else {
gas_resistance = 0;
}
return true;
}
/*! @brief Get remaining time for an asynchronous reading.
* If the asynchronous reading is still in progress, how many millis
* until its completion. If the asynchronous reading is completed, 0. If no
* asynchronous reading has started, -1 or
* Adafruit_BME680::reading_not_started. Does not block.
* @return Remaining millis until endReading will not block if invoked.
*/
int Adafruit_BME680::remainingReadingMillis(void) {
if (_meas_start != 0) {
/* A measurement is already in progress */
@@ -439,279 +415,195 @@ int Adafruit_BME680::remainingReadingMillis(void) {
* @return True on success, False on failure
*/
bool Adafruit_BME680::setGasHeater(uint16_t heaterTemp, uint16_t heaterTime) {
gas_sensor.gas_sett.heatr_temp = heaterTemp;
gas_sensor.gas_sett.heatr_dur = heaterTime;
if ((heaterTemp == 0) || (heaterTime == 0)) {
// disabled!
gas_sensor.gas_sett.heatr_ctrl = BME680_DISABLE_HEATER;
gas_sensor.gas_sett.run_gas = BME680_DISABLE_GAS_MEAS;
_gasEnabled = false;
gas_heatr_conf.enable = BME68X_DISABLE;
} else {
gas_sensor.gas_sett.heatr_ctrl = BME680_ENABLE_HEATER;
gas_sensor.gas_sett.run_gas = BME680_ENABLE_GAS_MEAS;
_gasEnabled = true;
gas_heatr_conf.enable = BME68X_ENABLE;
gas_heatr_conf.heatr_temp = heaterTemp;
gas_heatr_conf.heatr_dur = heaterTime;
}
return true;
int8_t rslt =
bme68x_set_heatr_conf(BME68X_FORCED_MODE, &gas_heatr_conf, &gas_sensor);
#ifdef BME680_DEBUG
Serial.print(F("SetHeaterConf Result: "));
Serial.println(rslt);
#endif
return rslt == 0;
}
/*!
* @brief Setter for Output Data Rate
* @param odr
* Output data rate setting, can be BME68X_ODR_NONE,
* BME68X_ODR_0_59_MS, BME68X_ODR_10_MS, BME68X_ODR_20_MS, BME68X_ODR_62_5_MS,
* BME68X_ODR_125_MS, BME68X_ODR_250_MS, BME68X_ODR_500_MS, BME68X_ODR_1000_MS
* @return True on success, False on failure
*/
bool Adafruit_BME680::setODR(uint8_t odr) {
if (odr > BME68X_ODR_NONE)
return false;
gas_conf.odr = odr;
int8_t rslt = bme68x_set_conf(&gas_conf, &gas_sensor);
#ifdef BME680_DEBUG
Serial.print(F("SetConf Result: "));
Serial.println(rslt);
#endif
return rslt == 0;
}
/*!
* @brief Setter for Temperature oversampling
* @param oversample
* Oversampling setting, can be BME680_OS_NONE (turn off Temperature
* reading), BME680_OS_1X, BME680_OS_2X, BME680_OS_4X, BME680_OS_8X or
* BME680_OS_16X
* Oversampling setting, can be BME68X_OS_NONE (turn off Temperature
* reading), BME68X_OS_1X, BME68X_OS_2X, BME68X_OS_4X, BME68X_OS_8X or
* BME68X_OS_16X
* @return True on success, False on failure
*/
bool Adafruit_BME680::setTemperatureOversampling(uint8_t oversample) {
if (oversample > BME680_OS_16X)
if (oversample > BME68X_OS_16X)
return false;
gas_sensor.tph_sett.os_temp = oversample;
gas_conf.os_temp = oversample;
if (oversample == BME680_OS_NONE)
_tempEnabled = false;
else
_tempEnabled = true;
return true;
int8_t rslt = bme68x_set_conf(&gas_conf, &gas_sensor);
#ifdef BME680_DEBUG
Serial.print(F("SetConf Result: "));
Serial.println(rslt);
#endif
return rslt == 0;
}
/*!
* @brief Setter for Humidity oversampling
* @param oversample
* Oversampling setting, can be BME680_OS_NONE (turn off Humidity
* reading), BME680_OS_1X, BME680_OS_2X, BME680_OS_4X, BME680_OS_8X or
* BME680_OS_16X
* Oversampling setting, can be BME68X_OS_NONE (turn off Humidity
* reading), BME68X_OS_1X, BME68X_OS_2X, BME68X_OS_4X, BME68X_OS_8X or
* BME68X_OS_16X
* @return True on success, False on failure
*/
bool Adafruit_BME680::setHumidityOversampling(uint8_t oversample) {
if (oversample > BME680_OS_16X)
if (oversample > BME68X_OS_16X)
return false;
gas_sensor.tph_sett.os_hum = oversample;
gas_conf.os_hum = oversample;
if (oversample == BME680_OS_NONE)
_humEnabled = false;
else
_humEnabled = true;
return true;
int8_t rslt = bme68x_set_conf(&gas_conf, &gas_sensor);
#ifdef BME680_DEBUG
Serial.print(F("SetConf Result: "));
Serial.println(rslt);
#endif
return rslt == 0;
}
/*!
* @brief Setter for Pressure oversampling
* @param oversample
* Oversampling setting, can be BME680_OS_NONE (turn off Pressure
* reading), BME680_OS_1X, BME680_OS_2X, BME680_OS_4X, BME680_OS_8X or
* BME680_OS_16X
* Oversampling setting, can be BME68X_OS_NONE (turn off Pressure
* reading), BME68X_OS_1X, BME68X_OS_2X, BME68X_OS_4X, BME68X_OS_8X or
* BME68X_OS_16X
* @return True on success, False on failure
*/
bool Adafruit_BME680::setPressureOversampling(uint8_t oversample) {
if (oversample > BME680_OS_16X)
if (oversample > BME68X_OS_16X)
return false;
gas_sensor.tph_sett.os_pres = oversample;
gas_conf.os_pres = oversample;
if (oversample == BME680_OS_NONE)
_presEnabled = false;
else
_presEnabled = true;
return true;
int8_t rslt = bme68x_set_conf(&gas_conf, &gas_sensor);
#ifdef BME680_DEBUG
Serial.print(F("SetConf Result: "));
Serial.println(rslt);
#endif
return rslt == 0;
}
/*!
* @brief Setter for IIR filter.
* @param filtersize
* Size of the filter (in samples).
* Can be BME680_FILTER_SIZE_0 (no filtering), BME680_FILTER_SIZE_1,
* BME680_FILTER_SIZE_3, BME680_FILTER_SIZE_7, BME680_FILTER_SIZE_15,
* BME680_FILTER_SIZE_31, BME680_FILTER_SIZE_63, BME680_FILTER_SIZE_127
* Can be BME68X_FILTER_SIZE_0 (no filtering), BME68X_FILTER_SIZE_1,
* BME68X_FILTER_SIZE_3, BME68X_FILTER_SIZE_7, BME68X_FILTER_SIZE_15,
* BME68X_FILTER_SIZE_31, BME68X_FILTER_SIZE_63, BME68X_FILTER_SIZE_127
* @return True on success, False on failure
*/
bool Adafruit_BME680::setIIRFilterSize(uint8_t filtersize) {
if (filtersize > BME680_FILTER_SIZE_127)
if (filtersize > BME68X_FILTER_SIZE_127)
return false;
gas_conf.filter = filtersize;
gas_sensor.tph_sett.filter = filtersize;
if (filtersize == BME680_FILTER_SIZE_0)
_filterEnabled = false;
else
_filterEnabled = true;
return true;
int8_t rslt = bme68x_set_conf(&gas_conf, &gas_sensor);
#ifdef BME680_DEBUG
Serial.print(F("SetConf Result: "));
Serial.println(rslt);
#endif
return rslt == 0;
}
/*!
* @brief Reads 8 bit values over I2C
*/
int8_t i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data,
uint16_t len) {
#ifdef BME680_DEBUG
Serial.print("\tI2C $");
Serial.print(reg_addr, HEX);
Serial.print(" => ");
#endif
int8_t i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, void *intf) {
_wire->beginTransmission((uint8_t)dev_id);
_wire->write((uint8_t)reg_addr);
_wire->endTransmission();
if (len != _wire->requestFrom((uint8_t)dev_id, (uint8_t)len)) {
#ifdef BME680_DEBUG
Serial.print("Failed to read ");
Serial.print(len);
Serial.print(" bytes from ");
Serial.println(dev_id, HEX);
#endif
return 1;
Adafruit_I2CDevice *_dev = (Adafruit_I2CDevice *)intf;
if (!_dev->write_then_read(&reg_addr, 1, reg_data, len, true)) {
return -1;
}
while (len--) {
*reg_data = (uint8_t)_wire->read();
#ifdef BME680_DEBUG
Serial.print("0x");
Serial.print(*reg_data, HEX);
Serial.print(", ");
#endif
reg_data++;
}
#ifdef BME680_DEBUG
Serial.println("");
#endif
return 0;
}
/*!
* @brief Writes 8 bit values over I2C
*/
int8_t i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data,
uint16_t len) {
#ifdef BME680_DEBUG
Serial.print("\tI2C $");
Serial.print(reg_addr, HEX);
Serial.print(" <= ");
#endif
_wire->beginTransmission((uint8_t)dev_id);
_wire->write((uint8_t)reg_addr);
while (len--) {
_wire->write(*reg_data);
#ifdef BME680_DEBUG
Serial.print("0x");
Serial.print(*reg_data, HEX);
Serial.print(", ");
#endif
reg_data++;
int8_t i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t len,
void *intf) {
Adafruit_I2CDevice *_dev = (Adafruit_I2CDevice *)intf;
if (!_dev->write((uint8_t *)reg_data, len, true, &reg_addr, 1)) {
return -1;
}
_wire->endTransmission();
#ifdef BME680_DEBUG
Serial.println("");
#endif
return 0;
}
/*!
* @brief Reads 8 bit values over SPI
*/
static int8_t spi_read(uint8_t cspin, uint8_t reg_addr, uint8_t *reg_data,
uint16_t len) {
#ifdef BME680_DEBUG
Serial.print("\tSPI $");
Serial.print(reg_addr, HEX);
Serial.print(" => ");
#endif
static int8_t spi_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len,
void *intf_ptr) {
Adafruit_SPIDevice *_dev = (Adafruit_SPIDevice *)intf_ptr;
// If hardware SPI we should use transactions!
if (_BME680_SoftwareSPI_SCK == -1) {
_spi->beginTransaction(
SPISettings(BME680_DEFAULT_SPIFREQ, MSBFIRST, SPI_MODE0));
reg_addr |= 0x80;
if (!_dev->write_then_read(&reg_addr, 1, reg_data, len, 0x0)) {
return -1;
}
digitalWrite(cspin, LOW);
spi_transfer(reg_addr | 0x80);
while (len--) {
*reg_data = spi_transfer(0x00);
#ifdef BME680_DEBUG
Serial.print("0x");
Serial.print(*reg_data, HEX);
Serial.print(", ");
#endif
reg_data++;
}
digitalWrite(cspin, HIGH);
if (_BME680_SoftwareSPI_SCK == -1) {
_spi->endTransaction();
}
#ifdef BME680_DEBUG
Serial.println("");
#endif
return 0;
}
/*!
* @brief Writes 8 bit values over SPI
*/
static int8_t spi_write(uint8_t cspin, uint8_t reg_addr, uint8_t *reg_data,
uint16_t len) {
#ifdef BME680_DEBUG
Serial.print("\tSPI $");
Serial.print(reg_addr, HEX);
Serial.print(" <= ");
#endif
static int8_t spi_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t len,
void *intf_ptr) {
Adafruit_SPIDevice *_dev = (Adafruit_SPIDevice *)intf_ptr;
// If hardware SPI we should use transactions!
if (_BME680_SoftwareSPI_SCK == -1) {
_spi->beginTransaction(
SPISettings(BME680_DEFAULT_SPIFREQ, MSBFIRST, SPI_MODE0));
if (!_dev->write((uint8_t *)reg_data, len, &reg_addr, 1)) {
return -1;
}
digitalWrite(cspin, LOW);
spi_transfer(reg_addr);
while (len--) {
spi_transfer(*reg_data);
#ifdef BME680_DEBUG
Serial.print("0x");
Serial.print(*reg_data, HEX);
Serial.print(", ");
#endif
reg_data++;
}
digitalWrite(cspin, HIGH);
if (_BME680_SoftwareSPI_SCK == -1) {
_spi->endTransaction();
}
#ifdef BME680_DEBUG
Serial.println("");
#endif
return 0;
}
static uint8_t spi_transfer(uint8_t x) {
if (_BME680_SoftwareSPI_SCK == -1)
return _spi->transfer(x);
// software spi
// Serial.println("Software SPI");
uint8_t reply = 0;
for (int i = 7; i >= 0; i--) {
reply <<= 1;
digitalWrite(_BME680_SoftwareSPI_SCK, LOW);
digitalWrite(_BME680_SoftwareSPI_MOSI, x & (1 << i));
digitalWrite(_BME680_SoftwareSPI_SCK, HIGH);
if (digitalRead(_BME680_SoftwareSPI_MISO))
reply |= 1;
}
return reply;
static void delay_usec(uint32_t us, void *intf_ptr) {
(void)intf_ptr; // Unused parameter
delayMicroseconds(us);
yield();
}
static void delay_msec(uint32_t ms) { delay(ms); }
+41 -30
View File
@@ -26,13 +26,38 @@
#include "Arduino.h"
#include "bme680.h"
#include "bme68x.h"
#include <Adafruit_I2CDevice.h>
#include <Adafruit_SPIDevice.h>
#include <Adafruit_Sensor.h>
#include <SPI.h>
#include <Wire.h>
#define BME680_DEFAULT_ADDRESS (0x77) ///< The default I2C address
#define BME680_DEFAULT_SPIFREQ (1000000) ///< The default SPI Clock speed
#define BME68X_DEFAULT_ADDRESS (0x77) ///< The default I2C address
#define BME68X_DEFAULT_SPIFREQ (1000000) ///< The default SPI Clock speed
#define BME680_OS_16X BME68X_OS_16X ///< Alias for BME680 existing examples
#define BME680_OS_8X BME68X_OS_8X ///< Alias for BME680 existing examples
#define BME680_OS_4X BME68X_OS_4X ///< Alias for BME680 existing examples
#define BME680_OS_2X BME68X_OS_2X ///< Alias for BME680 existing examples
#define BME680_OS_1X BME68X_OS_1X ///< Alias for BME680 existing examples
#define BME680_OS_NONE BME68X_OS_NONE ///< Alias for BME680 existing examples
#define BME680_FILTER_SIZE_127 \
BME68X_FILTER_SIZE_127 ///< Alias for BME680 existing examples
#define BME680_FILTER_SIZE_63 \
BME68X_FILTER_SIZE_63 ///< Alias for BME680 existing examples
#define BME680_FILTER_SIZE_31 \
BME68X_FILTER_SIZE_31 ///< Alias for BME680 existing examples
#define BME680_FILTER_SIZE_15 \
BME68X_FILTER_SIZE_15 ///< Alias for BME680 existing examples
#define BME680_FILTER_SIZE_7 \
BME68X_FILTER_SIZE_7 ///< Alias for BME680 existing examples
#define BME680_FILTER_SIZE_3 \
BME68X_FILTER_SIZE_3 ///< Alias for BME680 existing examples
#define BME680_FILTER_SIZE_1 \
BME68X_FILTER_SIZE_1 ///< Alias for BME680 existing examples
#define BME680_FILTER_SIZE_0 \
BME68X_FILTER_OFF ///< Alias for BME680 existing examples
/*! Adafruit_BME680 Class for both I2C and SPI usage.
* Wraps the Bosch library for Arduino usage
@@ -50,7 +75,7 @@ public:
Adafruit_BME680(int8_t cspin, SPIClass *theSPI = &SPI);
Adafruit_BME680(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin);
bool begin(uint8_t addr = BME680_DEFAULT_ADDRESS, bool initSettings = true);
bool begin(uint8_t addr = BME68X_DEFAULT_ADDRESS, bool initSettings = true);
float readTemperature();
float readPressure();
float readHumidity();
@@ -62,30 +87,15 @@ public:
bool setHumidityOversampling(uint8_t os);
bool setIIRFilterSize(uint8_t fs);
bool setGasHeater(uint16_t heaterTemp, uint16_t heaterTime);
bool setODR(uint8_t odr);
// Perform a reading in blocking mode.
bool performReading();
/*! @brief Begin an asynchronous reading.
* @return When the reading would be ready as absolute time in millis().
*/
unsigned long beginReading();
uint32_t beginReading();
/*! @brief End an asynchronous reading.
* If the asynchronous reading is still in progress, block until it
* ends. If no asynchronous reading has started, this is equivalent to
* performReading().
* @return Whether success.
*/
bool endReading();
/*! @brief Get remaining time for an asynchronous reading.
* If the asynchronous reading is still in progress, how many millis
* until its completion. If the asynchronous reading is completed, 0. If no
* asynchronous reading has started, -1 or
* Adafruit_BME680::reading_not_started. Does not block.
* @return Remaining millis until endReading will not block if invoked.
*/
int remainingReadingMillis();
/** Temperature (Celsius) assigned after calling performReading() or
@@ -102,16 +112,17 @@ public:
uint32_t gas_resistance;
private:
bool _filterEnabled, _tempEnabled, _humEnabled, _presEnabled, _gasEnabled;
uint8_t _i2caddr;
Adafruit_I2CDevice *_i2cdev = NULL;
Adafruit_SPIDevice *_spidev = NULL;
TwoWire *_wire = NULL;
int32_t _sensorID;
int8_t _cs;
unsigned long _meas_start;
uint16_t _meas_period;
uint32_t _meas_start = 0;
uint16_t _meas_period = 0;
uint8_t spixfer(uint8_t x);
struct bme680_dev gas_sensor;
struct bme68x_dev gas_sensor;
struct bme68x_conf gas_conf;
struct bme68x_heatr_conf gas_heatr_conf;
};
#endif
+1 -1
View File
@@ -873,7 +873,7 @@ RECURSIVE = NO
# Note that relative paths are relative to the directory from which doxygen is
# run.
EXCLUDE = bme680.c bme680.h bme680_defs.h README.md
EXCLUDE = bme68x.c bme68x.h bme68x_defs.h README.md
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
File diff suppressed because it is too large Load Diff
-222
View File
@@ -1,222 +0,0 @@
/**
* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* Neither the name of the copyright holder nor the names of the
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*
* The information provided is believed to be accurate and reliable.
* The copyright holder assumes no responsibility
* for the consequences of use
* of such information nor for any infringement of patents or
* other rights of third parties which may result from its use.
* No license is granted by implication or otherwise under any patent or
* patent rights of the copyright holder.
*
* @file bme680.h
* @date 19 Jun 2018
* @version 3.5.9
* @brief Sensor driver for BME680 sensor
*
*/
#ifndef BME680_H_
#define BME680_H_
/*! CPP guard */
#ifdef __cplusplus
extern "C"
{
#endif
/* Header includes */
#include "bme680_defs.h"
/** function prototype declarations **/
/*!
* @brief This API is the entry point.
* It reads the chip-id and calibration data from the sensor.
* @param[in,out] dev
* Structure instance of bme680_dev
* @return Result of API execution status
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error
*/
int8_t bme680_init(struct bme680_dev *dev);
/*!
* @brief This API writes the given data to the register address
* of the sensor.
* @param[in] reg_addr
* Register address from where the data to be written.
* @param[in] reg_data
* Pointer to data buffer which is to be written
* in the sensor.
* @param[in] len
* No of bytes of data to write..
* @param[in] dev
* Structure instance of bme680_dev.
* @return Result of API execution status
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error
*/
int8_t bme680_set_regs(const uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len, struct bme680_dev *dev);
/*!
* @brief This API reads the data from the given register address of the sensor.
* @param[in] reg_addr
* Register address from where the data to be read
* @param[out] reg_data
* Pointer to data buffer to store the read data.
* @param[in] len
* No of bytes of data to be read.
* @param[in] dev
* Structure instance of bme680_dev.
*
* @return Result of API execution status
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error
*/
int8_t bme680_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint16_t len, struct bme680_dev *dev);
/*!
* @brief This API performs the soft reset of the sensor.
* @param[in] dev
* Structure instance of bme680_dev.
* @return Result of API execution status
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error.
*/
int8_t bme680_soft_reset(struct bme680_dev *dev);
/*!
* @brief This API is used to set the power mode of the sensor.
* @param[in] dev
* Structure instance of bme680_dev
* @note Pass the value to bme680_dev.power_mode structure variable.
* value | mode
* -------------|------------------
* 0x00 | BME680_SLEEP_MODE
* 0x01 | BME680_FORCED_MODE
* @return Result of API execution status
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error
*/
int8_t bme680_set_sensor_mode(struct bme680_dev *dev);
/*!
* @brief This API is used to get the power mode of the sensor.
*
* @param[in] dev : Structure instance of bme680_dev
* @note : bme680_dev.power_mode structure variable hold the power mode.
*
* value | mode
* ---------|------------------
* 0x00 | BME680_SLEEP_MODE
* 0x01 | BME680_FORCED_MODE
*
* @return Result of API execution status
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error
*/
int8_t bme680_get_sensor_mode(struct bme680_dev *dev);
/*!
* @brief This API is used to set the profile duration of the sensor.
* @param[in] dev
* Structure instance of bme680_dev.
* @param[in] duration
* Duration of the measurement in ms.
* @return Nothing
*/
void bme680_set_profile_dur(uint16_t duration, struct bme680_dev *dev);
/*!
* @brief This API is used to get the profile duration of the sensor.
*
* @param[in] dev
* Structure instance of bme680_dev.
* @param[in] duration
* Duration of the measurement in ms.
* @return Nothing
*/
void bme680_get_profile_dur(uint16_t *duration, const struct bme680_dev *dev);
/*!
* @brief This API reads the pressure, temperature and humidity and gas data
* from the sensor, compensates the data and store it in the bme680_data
* structure instance passed by the user.
* @param[out] data
* Structure instance to hold the data.
* @param[in] dev
* Structure instance of bme680_dev.
* @return Result of API execution status
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error
*/
int8_t bme680_get_sensor_data(struct bme680_field_data *data, struct bme680_dev *dev);
/*!
* @brief This API is used to set the oversampling, filter and T,P,H, gas selection
* settings in the sensor.
* @param[in] dev
* Structure instance of bme680_dev.
* @param[in] desired_settings
* Variable used to select the settings which are to be set in the sensor.
*
* Macros | Functionality
* ----------------------------|----------------------------------------------
* BME680_OST_SEL | To set temperature oversampling.
* BME680_OSP_SEL | To set pressure oversampling.
* BME680_OSH_SEL | To set humidity oversampling.
* BME680_GAS_MEAS_SEL | To set gas measurement setting.
* BME680_FILTER_SEL | To set filter setting.
* BME680_HCNTRL_SEL | To set humidity control setting.
* BME680_RUN_GAS_SEL | To set run gas setting.
* BME680_NBCONV_SEL | To set NB conversion setting.
* BME680_GAS_SENSOR_SEL | To set all gas sensor related settings
*
* @note Below are the macros to be used by the user for selecting the
* desired settings. User can do OR operation of these macros for configuring
* multiple settings.
*
* @return Result of API execution status
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error.
*/
int8_t bme680_set_sensor_settings(uint16_t desired_settings, struct bme680_dev *dev);
/*!
* @brief This API is used to get the oversampling, filter and T,P,H, gas selection
* settings in the sensor.
* @param[in] dev
* Structure instance of bme680_dev.
* @param[in] desired_settings
* Variable used to select the settings which are to be get from the sensor.
* @return Result of API execution status
* @retval zero -> Success / +ve value -> Warning / -ve value -> Error.
*/
int8_t bme680_get_sensor_settings(uint16_t desired_settings, struct bme680_dev *dev);
#ifdef __cplusplus
}
#endif /* End of CPP guard */
#endif /* BME680_H_ */
/** @}*/
-538
View File
@@ -1,538 +0,0 @@
/**
* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* Neither the name of the copyright holder nor the names of the
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*
* The information provided is believed to be accurate and reliable.
* The copyright holder assumes no responsibility
* for the consequences of use
* of such information nor for any infringement of patents or
* other rights of third parties which may result from its use.
* No license is granted by implication or otherwise under any patent or
* patent rights of the copyright holder.
*
* @file bme680_defs.h
* @date 19 Jun 2018
* @version 3.5.9
* @brief Sensor driver for BME680 sensor
*/
#ifndef BME680_DEFS_H_
#define BME680_DEFS_H_
/** header includes **/
#ifdef __KERNEL__
#include <linux/types.h>
#include <linux/kernel.h>
#else
#include <stdint.h>
#include <stddef.h>
#endif
/** Common macros **/
#if !defined(UINT8_C) && !defined(INT8_C)
#define INT8_C(x) S8_C(x)
#define UINT8_C(x) U8_C(x)
#endif
#if !defined(UINT16_C) && !defined(INT16_C)
#define INT16_C(x) S16_C(x)
#define UINT16_C(x) U16_C(x)
#endif
#if !defined(INT32_C) && !defined(UINT32_C)
#define INT32_C(x) S32_C(x)
#define UINT32_C(x) U32_C(x)
#endif
#if !defined(INT64_C) && !defined(UINT64_C)
#define INT64_C(x) S64_C(x)
#define UINT64_C(x) U64_C(x)
#endif
/** C standard macros **/
#ifndef NULL
#ifdef __cplusplus
#define NULL nullptr
#else
#define NULL nullptr
#endif
#endif
/** BME680 configuration macros */
/** Enable or un-comment the macro to provide floating point data output **/
#ifndef BME680_FLOAT_POINT_COMPENSATION
/* #define BME680_FLOAT_POINT_COMPENSATION **/
#endif
/** BME680 General config **/
#define BME680_POLL_PERIOD_MS UINT8_C(10)
/** BME680 I2C addresses **/
#define BME680_I2C_ADDR_PRIMARY UINT8_C(0x76)
#define BME680_I2C_ADDR_SECONDARY UINT8_C(0x77)
/** BME680 unique chip identifier **/
#define BME680_CHIP_ID UINT8_C(0x61)
/** BME680 coefficients related defines **/
#define BME680_COEFF_SIZE UINT8_C(41)
#define BME680_COEFF_ADDR1_LEN UINT8_C(25)
#define BME680_COEFF_ADDR2_LEN UINT8_C(16)
/** BME680 field_x related defines **/
#define BME680_FIELD_LENGTH UINT8_C(15)
#define BME680_FIELD_ADDR_OFFSET UINT8_C(17)
/** Soft reset command **/
#define BME680_SOFT_RESET_CMD UINT8_C(0xb6)
/** Error code definitions **/
#define BME680_OK INT8_C(0)
/* Errors */
#define BME680_E_NULL_PTR INT8_C(-1)
#define BME680_E_COM_FAIL INT8_C(-2)
#define BME680_E_DEV_NOT_FOUND INT8_C(-3)
#define BME680_E_INVALID_LENGTH INT8_C(-4)
/* Warnings */
#define BME680_W_DEFINE_PWR_MODE INT8_C(1)
#define BME680_W_NO_NEW_DATA INT8_C(2)
/* Info's */
#define BME680_I_MIN_CORRECTION UINT8_C(1)
#define BME680_I_MAX_CORRECTION UINT8_C(2)
/** Register map **/
/** Other coefficient's address **/
#define BME680_ADDR_RES_HEAT_VAL_ADDR UINT8_C(0x00)
#define BME680_ADDR_RES_HEAT_RANGE_ADDR UINT8_C(0x02)
#define BME680_ADDR_RANGE_SW_ERR_ADDR UINT8_C(0x04)
#define BME680_ADDR_SENS_CONF_START UINT8_C(0x5A)
#define BME680_ADDR_GAS_CONF_START UINT8_C(0x64)
/** Field settings **/
#define BME680_FIELD0_ADDR UINT8_C(0x1d)
/** Heater settings **/
#define BME680_RES_HEAT0_ADDR UINT8_C(0x5a)
#define BME680_GAS_WAIT0_ADDR UINT8_C(0x64)
/** Sensor configuration registers **/
#define BME680_CONF_HEAT_CTRL_ADDR UINT8_C(0x70)
#define BME680_CONF_ODR_RUN_GAS_NBC_ADDR UINT8_C(0x71)
#define BME680_CONF_OS_H_ADDR UINT8_C(0x72)
#define BME680_MEM_PAGE_ADDR UINT8_C(0xf3)
#define BME680_CONF_T_P_MODE_ADDR UINT8_C(0x74)
#define BME680_CONF_ODR_FILT_ADDR UINT8_C(0x75)
/** Coefficient's address **/
#define BME680_COEFF_ADDR1 UINT8_C(0x89)
#define BME680_COEFF_ADDR2 UINT8_C(0xe1)
/** Chip identifier **/
#define BME680_CHIP_ID_ADDR UINT8_C(0xd0)
/** Soft reset register **/
#define BME680_SOFT_RESET_ADDR UINT8_C(0xe0)
/** Heater control settings **/
#define BME680_ENABLE_HEATER UINT8_C(0x00)
#define BME680_DISABLE_HEATER UINT8_C(0x08)
/** Gas measurement settings **/
#define BME680_DISABLE_GAS_MEAS UINT8_C(0x00)
#define BME680_ENABLE_GAS_MEAS UINT8_C(0x01)
/** Over-sampling settings **/
#define BME680_OS_NONE UINT8_C(0)
#define BME680_OS_1X UINT8_C(1)
#define BME680_OS_2X UINT8_C(2)
#define BME680_OS_4X UINT8_C(3)
#define BME680_OS_8X UINT8_C(4)
#define BME680_OS_16X UINT8_C(5)
/** IIR filter settings **/
#define BME680_FILTER_SIZE_0 UINT8_C(0)
#define BME680_FILTER_SIZE_1 UINT8_C(1)
#define BME680_FILTER_SIZE_3 UINT8_C(2)
#define BME680_FILTER_SIZE_7 UINT8_C(3)
#define BME680_FILTER_SIZE_15 UINT8_C(4)
#define BME680_FILTER_SIZE_31 UINT8_C(5)
#define BME680_FILTER_SIZE_63 UINT8_C(6)
#define BME680_FILTER_SIZE_127 UINT8_C(7)
/** Power mode settings */
#define BME680_SLEEP_MODE UINT8_C(0)
#define BME680_FORCED_MODE UINT8_C(1)
/** Delay related macro declaration **/
#define BME680_RESET_PERIOD UINT32_C(10)
/** SPI memory page settings **/
#define BME680_MEM_PAGE0 UINT8_C(0x10)
#define BME680_MEM_PAGE1 UINT8_C(0x00)
/** Ambient humidity shift value for compensation **/
#define BME680_HUM_REG_SHIFT_VAL UINT8_C(4)
/** Run gas enable and disable settings **/
#define BME680_RUN_GAS_DISABLE UINT8_C(0)
#define BME680_RUN_GAS_ENABLE UINT8_C(1)
/** Buffer length macro declaration **/
#define BME680_TMP_BUFFER_LENGTH UINT8_C(40)
#define BME680_REG_BUFFER_LENGTH UINT8_C(6)
#define BME680_FIELD_DATA_LENGTH UINT8_C(3)
#define BME680_GAS_REG_BUF_LENGTH UINT8_C(20)
/** Settings selector **/
#define BME680_OST_SEL UINT16_C(1)
#define BME680_OSP_SEL UINT16_C(2)
#define BME680_OSH_SEL UINT16_C(4)
#define BME680_GAS_MEAS_SEL UINT16_C(8)
#define BME680_FILTER_SEL UINT16_C(16)
#define BME680_HCNTRL_SEL UINT16_C(32)
#define BME680_RUN_GAS_SEL UINT16_C(64)
#define BME680_NBCONV_SEL UINT16_C(128)
#define BME680_GAS_SENSOR_SEL (BME680_GAS_MEAS_SEL | BME680_RUN_GAS_SEL | BME680_NBCONV_SEL)
/** Number of conversion settings **/
#define BME680_NBCONV_MIN UINT8_C(0)
#define BME680_NBCONV_MAX UINT8_C(10)
/** Mask definitions **/
#define BME680_GAS_MEAS_MSK UINT8_C(0x30)
#define BME680_NBCONV_MSK UINT8_C(0X0F)
#define BME680_FILTER_MSK UINT8_C(0X1C)
#define BME680_OST_MSK UINT8_C(0XE0)
#define BME680_OSP_MSK UINT8_C(0X1C)
#define BME680_OSH_MSK UINT8_C(0X07)
#define BME680_HCTRL_MSK UINT8_C(0x08)
#define BME680_RUN_GAS_MSK UINT8_C(0x10)
#define BME680_MODE_MSK UINT8_C(0x03)
#define BME680_RHRANGE_MSK UINT8_C(0x30)
#define BME680_RSERROR_MSK UINT8_C(0xf0)
#define BME680_NEW_DATA_MSK UINT8_C(0x80)
#define BME680_GAS_INDEX_MSK UINT8_C(0x0f)
#define BME680_GAS_RANGE_MSK UINT8_C(0x0f)
#define BME680_GASM_VALID_MSK UINT8_C(0x20)
#define BME680_HEAT_STAB_MSK UINT8_C(0x10)
#define BME680_MEM_PAGE_MSK UINT8_C(0x10)
#define BME680_SPI_RD_MSK UINT8_C(0x80)
#define BME680_SPI_WR_MSK UINT8_C(0x7f)
#define BME680_BIT_H1_DATA_MSK UINT8_C(0x0F)
/** Bit position definitions for sensor settings **/
#define BME680_GAS_MEAS_POS UINT8_C(4)
#define BME680_FILTER_POS UINT8_C(2)
#define BME680_OST_POS UINT8_C(5)
#define BME680_OSP_POS UINT8_C(2)
#define BME680_RUN_GAS_POS UINT8_C(4)
/** Array Index to Field data mapping for Calibration Data **/
#define BME680_T2_LSB_REG (1)
#define BME680_T2_MSB_REG (2)
#define BME680_T3_REG (3)
#define BME680_P1_LSB_REG (5)
#define BME680_P1_MSB_REG (6)
#define BME680_P2_LSB_REG (7)
#define BME680_P2_MSB_REG (8)
#define BME680_P3_REG (9)
#define BME680_P4_LSB_REG (11)
#define BME680_P4_MSB_REG (12)
#define BME680_P5_LSB_REG (13)
#define BME680_P5_MSB_REG (14)
#define BME680_P7_REG (15)
#define BME680_P6_REG (16)
#define BME680_P8_LSB_REG (19)
#define BME680_P8_MSB_REG (20)
#define BME680_P9_LSB_REG (21)
#define BME680_P9_MSB_REG (22)
#define BME680_P10_REG (23)
#define BME680_H2_MSB_REG (25)
#define BME680_H2_LSB_REG (26)
#define BME680_H1_LSB_REG (26)
#define BME680_H1_MSB_REG (27)
#define BME680_H3_REG (28)
#define BME680_H4_REG (29)
#define BME680_H5_REG (30)
#define BME680_H6_REG (31)
#define BME680_H7_REG (32)
#define BME680_T1_LSB_REG (33)
#define BME680_T1_MSB_REG (34)
#define BME680_GH2_LSB_REG (35)
#define BME680_GH2_MSB_REG (36)
#define BME680_GH1_REG (37)
#define BME680_GH3_REG (38)
/** BME680 register buffer index settings **/
#define BME680_REG_FILTER_INDEX UINT8_C(5)
#define BME680_REG_TEMP_INDEX UINT8_C(4)
#define BME680_REG_PRES_INDEX UINT8_C(4)
#define BME680_REG_HUM_INDEX UINT8_C(2)
#define BME680_REG_NBCONV_INDEX UINT8_C(1)
#define BME680_REG_RUN_GAS_INDEX UINT8_C(1)
#define BME680_REG_HCTRL_INDEX UINT8_C(0)
/** BME680 pressure calculation macros **/
/*! This max value is used to provide precedence to multiplication or division
* in pressure compensation equation to achieve least loss of precision and
* avoiding overflows.
* i.e Comparing value, BME680_MAX_OVERFLOW_VAL = INT32_C(1 << 30)
*/
#define BME680_MAX_OVERFLOW_VAL INT32_C(0x40000000)
/** Macro to combine two 8 bit data's to form a 16 bit data **/
#define BME680_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb)
/** Macro to SET and GET BITS of a register **/
#define BME680_SET_BITS(reg_data, bitname, data) \
((reg_data & ~(bitname##_MSK)) | \
((data << bitname##_POS) & bitname##_MSK))
#define BME680_GET_BITS(reg_data, bitname) ((reg_data & (bitname##_MSK)) >> \
(bitname##_POS))
/** Macro variant to handle the bitname position if it is zero **/
#define BME680_SET_BITS_POS_0(reg_data, bitname, data) \
((reg_data & ~(bitname##_MSK)) | \
(data & bitname##_MSK))
#define BME680_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK))
/** Type definitions **/
/*!
* @brief Generic communication function pointer
* @param[in] dev_id
* Place holder to store the id of the device structure
* Can be used to store the index of the Chip select or
* I2C address of the device.
* @param[in] reg_addr
* Used to select the register the where data needs to
* be read from or written to.
* @param[in/out] reg_data
* Data array to read/write
* @param[in] len
* Length of the data array
*/
typedef int8_t (*bme680_com_fptr_t)(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len);
/*!
* @brief Delay function pointer
* @param[in] period
* Time period in milliseconds
*/
typedef void (*bme680_delay_fptr_t)(uint32_t period);
/*!
* @brief Interface selection Enumerations
*/
enum bme680_intf {
/*! SPI interface */
BME680_SPI_INTF,
/*! I2C interface */
BME680_I2C_INTF
};
/** structure definitions **/
/*!
* @brief Sensor field data structure
*/
struct bme680_field_data {
/*! Contains new_data, gasm_valid & heat_stab */
uint8_t status;
/*! The index of the heater profile used */
uint8_t gas_index;
/*! Measurement index to track order */
uint8_t meas_index;
#ifndef BME680_FLOAT_POINT_COMPENSATION
/*! Temperature in degree celsius x100 */
int16_t temperature;
/*! Pressure in Pascal */
uint32_t pressure;
/*! Humidity in % relative humidity x1000 */
uint32_t humidity;
/*! Gas resistance in Ohms */
uint32_t gas_resistance;
#else
/*! Temperature in degree celsius */
float temperature;
/*! Pressure in Pascal */
float pressure;
/*! Humidity in % relative humidity x1000 */
float humidity;
/*! Gas resistance in Ohms */
float gas_resistance;
#endif
};
/*!
* @brief Structure to hold the Calibration data
*/
struct bme680_calib_data {
/*! Variable to store calibrated humidity data */
uint16_t par_h1;
/*! Variable to store calibrated humidity data */
uint16_t par_h2;
/*! Variable to store calibrated humidity data */
int8_t par_h3;
/*! Variable to store calibrated humidity data */
int8_t par_h4;
/*! Variable to store calibrated humidity data */
int8_t par_h5;
/*! Variable to store calibrated humidity data */
uint8_t par_h6;
/*! Variable to store calibrated humidity data */
int8_t par_h7;
/*! Variable to store calibrated gas data */
int8_t par_gh1;
/*! Variable to store calibrated gas data */
int16_t par_gh2;
/*! Variable to store calibrated gas data */
int8_t par_gh3;
/*! Variable to store calibrated temperature data */
uint16_t par_t1;
/*! Variable to store calibrated temperature data */
int16_t par_t2;
/*! Variable to store calibrated temperature data */
int8_t par_t3;
/*! Variable to store calibrated pressure data */
uint16_t par_p1;
/*! Variable to store calibrated pressure data */
int16_t par_p2;
/*! Variable to store calibrated pressure data */
int8_t par_p3;
/*! Variable to store calibrated pressure data */
int16_t par_p4;
/*! Variable to store calibrated pressure data */
int16_t par_p5;
/*! Variable to store calibrated pressure data */
int8_t par_p6;
/*! Variable to store calibrated pressure data */
int8_t par_p7;
/*! Variable to store calibrated pressure data */
int16_t par_p8;
/*! Variable to store calibrated pressure data */
int16_t par_p9;
/*! Variable to store calibrated pressure data */
uint8_t par_p10;
#ifndef BME680_FLOAT_POINT_COMPENSATION
/*! Variable to store t_fine size */
int32_t t_fine;
#else
/*! Variable to store t_fine size */
float t_fine;
#endif
/*! Variable to store heater resistance range */
uint8_t res_heat_range;
/*! Variable to store heater resistance value */
int8_t res_heat_val;
/*! Variable to store error range */
int8_t range_sw_err;
};
/*!
* @brief BME680 sensor settings structure which comprises of ODR,
* over-sampling and filter settings.
*/
struct bme680_tph_sett {
/*! Humidity oversampling */
uint8_t os_hum;
/*! Temperature oversampling */
uint8_t os_temp;
/*! Pressure oversampling */
uint8_t os_pres;
/*! Filter coefficient */
uint8_t filter;
};
/*!
* @brief BME680 gas sensor which comprises of gas settings
* and status parameters
*/
struct bme680_gas_sett {
/*! Variable to store nb conversion */
uint8_t nb_conv;
/*! Variable to store heater control */
uint8_t heatr_ctrl;
/*! Run gas enable value */
uint8_t run_gas;
/*! Heater temperature value */
uint16_t heatr_temp;
/*! Duration profile value */
uint16_t heatr_dur;
};
/*!
* @brief BME680 device structure
*/
struct bme680_dev {
/*! Chip Id */
uint8_t chip_id;
/*! Device Id */
uint8_t dev_id;
/*! SPI/I2C interface */
enum bme680_intf intf;
/*! Memory page used */
uint8_t mem_page;
/*! Ambient temperature in Degree C */
int8_t amb_temp;
/*! Sensor calibration data */
struct bme680_calib_data calib;
/*! Sensor settings */
struct bme680_tph_sett tph_sett;
/*! Gas Sensor settings */
struct bme680_gas_sett gas_sett;
/*! Sensor power modes */
uint8_t power_mode;
/*! New sensor fields */
uint8_t new_fields;
/*! Store the info messages */
uint8_t info_msg;
/*! Bus read function pointer */
bme680_com_fptr_t read;
/*! Bus write function pointer */
bme680_com_fptr_t write;
/*! delay function pointer */
bme680_delay_fptr_t delay_ms;
/*! Communication function result */
int8_t com_rslt;
};
#endif /* BME680_DEFS_H_ */
/** @}*/
/** @}*/
File diff suppressed because it is too large Load Diff
+323
View File
@@ -0,0 +1,323 @@
/**
* Copyright (c) 2021 Bosch Sensortec GmbH. All rights reserved.
*
* BSD-3-Clause
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @file bme68x.h
* @date 2021-05-24
* @version v4.4.6
*
*/
/*!
* @defgroup bme68x BME68X
* @brief <a href="https://www.bosch-sensortec.com/bst/products/all_products/bme680">Product Overview</a>
* and <a href="https://github.com/BoschSensortec/BME68x-Sensor-API">Sensor API Source Code</a>
*/
#ifndef BME68X_H_
#define BME68X_H_
#include "bme68x_defs.h"
/* CPP guard */
#ifdef __cplusplus
extern "C" {
#endif
/**
* \ingroup bme68x
* \defgroup bme68xApiInit Initialization
* @brief Initialize the sensor and device structure
*/
/*!
* \ingroup bme68xApiInit
* \page bme68x_api_bme68x_init bme68x_init
* \code
* int8_t bme68x_init(struct bme68x_dev *dev);
* \endcode
* @details This API reads the chip-id of the sensor which is the first step to
* verify the sensor and also calibrates the sensor
* As this API is the entry point, call this API before using other APIs.
*
* @param[in,out] dev : Structure instance of bme68x_dev
*
* @return Result of API execution status
* @retval 0 -> Success
* @retval < 0 -> Fail
*/
int8_t bme68x_init(struct bme68x_dev *dev);
/**
* \ingroup bme68x
* \defgroup bme68xApiRegister Registers
* @brief Generic API for accessing sensor registers
*/
/*!
* \ingroup bme68xApiRegister
* \page bme68x_api_bme68x_set_regs bme68x_set_regs
* \code
* int8_t bme68x_set_regs(const uint8_t reg_addr, const uint8_t *reg_data, uint32_t len, struct bme68x_dev *dev)
* \endcode
* @details This API writes the given data to the register address of the sensor
*
* @param[in] reg_addr : Register addresses to where the data is to be written
* @param[in] reg_data : Pointer to data buffer which is to be written
* in the reg_addr of sensor.
* @param[in] len : No of bytes of data to write
* @param[in,out] dev : Structure instance of bme68x_dev
*
* @return Result of API execution status
* @retval 0 -> Success
* @retval < 0 -> Fail
*/
int8_t bme68x_set_regs(const uint8_t *reg_addr, const uint8_t *reg_data, uint32_t len, struct bme68x_dev *dev);
/*!
* \ingroup bme68xApiRegister
* \page bme68x_api_bme68x_get_regs bme68x_get_regs
* \code
* int8_t bme68x_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, struct bme68x_dev *dev)
* \endcode
* @details This API reads the data from the given register address of sensor.
*
* @param[in] reg_addr : Register address from where the data to be read
* @param[out] reg_data : Pointer to data buffer to store the read data.
* @param[in] len : No of bytes of data to be read.
* @param[in,out] dev : Structure instance of bme68x_dev.
*
* @return Result of API execution status
* @retval 0 -> Success
* @retval < 0 -> Fail
*/
int8_t bme68x_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, struct bme68x_dev *dev);
/**
* \ingroup bme68x
* \defgroup bme68xApiSystem System
* @brief API that performs system-level operations
*/
/*!
* \ingroup bme68xApiSystem
* \page bme68x_api_bme68x_soft_reset bme68x_soft_reset
* \code
* int8_t bme68x_soft_reset(struct bme68x_dev *dev);
* \endcode
* @details This API soft-resets the sensor.
*
* @param[in,out] dev : Structure instance of bme68x_dev.
*
* @return Result of API execution status
* @retval 0 -> Success
* @retval < 0 -> Fail
*/
int8_t bme68x_soft_reset(struct bme68x_dev *dev);
/**
* \ingroup bme68x
* \defgroup bme68xApiOm Operation mode
* @brief API to configure operation mode
*/
/*!
* \ingroup bme68xApiOm
* \page bme68x_api_bme68x_set_op_mode bme68x_set_op_mode
* \code
* int8_t bme68x_set_op_mode(const uint8_t op_mode, struct bme68x_dev *dev);
* \endcode
* @details This API is used to set the operation mode of the sensor
* @param[in] op_mode : Desired operation mode.
* @param[in] dev : Structure instance of bme68x_dev
*
* @return Result of API execution status
* @retval 0 -> Success
* @retval < 0 -> Fail
*/
int8_t bme68x_set_op_mode(const uint8_t op_mode, struct bme68x_dev *dev);
/*!
* \ingroup bme68xApiOm
* \page bme68x_api_bme68x_get_op_mode bme68x_get_op_mode
* \code
* int8_t bme68x_get_op_mode(uint8_t *op_mode, struct bme68x_dev *dev);
* \endcode
* @details This API is used to get the operation mode of the sensor.
*
* @param[out] op_mode : Desired operation mode.
* @param[in,out] dev : Structure instance of bme68x_dev
*
* @return Result of API execution status
* @retval 0 -> Success
* @retval < 0 -> Fail
*/
int8_t bme68x_get_op_mode(uint8_t *op_mode, struct bme68x_dev *dev);
/*!
* \ingroup bme68xApiConfig
* \page bme68x_api_bme68x_get_meas_dur bme68x_get_meas_dur
* \code
* uint32_t bme68x_get_meas_dur(const uint8_t op_mode, struct bme68x_conf *conf, struct bme68x_dev *dev);
* \endcode
* @details This API is used to get the remaining duration that can be used for heating.
*
* @param[in] op_mode : Desired operation mode.
* @param[in] conf : Desired sensor configuration.
* @param[in] dev : Structure instance of bme68x_dev
*
* @return Measurement duration calculated in microseconds
*/
uint32_t bme68x_get_meas_dur(const uint8_t op_mode, struct bme68x_conf *conf, struct bme68x_dev *dev);
/**
* \ingroup bme68x
* \defgroup bme68xApiData Data Read out
* @brief Read our data from the sensor
*/
/*!
* \ingroup bme68xApiData
* \page bme68x_api_bme68x_get_data bme68x_get_data
* \code
* int8_t bme68x_get_data(uint8_t op_mode, struct bme68x_data *data, uint8_t *n_data, struct bme68x_dev *dev);
* \endcode
* @details This API reads the pressure, temperature and humidity and gas data
* from the sensor, compensates the data and store it in the bme68x_data
* structure instance passed by the user.
*
* @param[in] op_mode : Expected operation mode.
* @param[out] data : Structure instance to hold the data.
* @param[out] n_data : Number of data instances available.
* @param[in,out] dev : Structure instance of bme68x_dev
*
* @return Result of API execution status
* @retval 0 -> Success
* @retval < 0 -> Fail
*/
int8_t bme68x_get_data(uint8_t op_mode, struct bme68x_data *data, uint8_t *n_data, struct bme68x_dev *dev);
/**
* \ingroup bme68x
* \defgroup bme68xApiConfig Configuration
* @brief Configuration API of sensor
*/
/*!
* \ingroup bme68xApiConfig
* \page bme68x_api_bme68x_set_conf bme68x_set_conf
* \code
* int8_t bme68x_set_conf(struct bme68x_conf *conf, struct bme68x_dev *dev);
* \endcode
* @details This API is used to set the oversampling, filter and odr configuration
*
* @param[in] conf : Desired sensor configuration.
* @param[in,out] dev : Structure instance of bme68x_dev.
*
* @return Result of API execution status
* @retval 0 -> Success
* @retval < 0 -> Fail
*/
int8_t bme68x_set_conf(struct bme68x_conf *conf, struct bme68x_dev *dev);
/*!
* \ingroup bme68xApiConfig
* \page bme68x_api_bme68x_get_conf bme68x_get_conf
* \code
* int8_t bme68x_get_conf(struct bme68x_conf *conf, struct bme68x_dev *dev);
* \endcode
* @details This API is used to get the oversampling, filter and odr
* configuration
*
* @param[out] conf : Present sensor configuration.
* @param[in,out] dev : Structure instance of bme68x_dev.
*
* @return Result of API execution status
* @retval 0 -> Success
* @retval < 0 -> Fail
*/
int8_t bme68x_get_conf(struct bme68x_conf *conf, struct bme68x_dev *dev);
/*!
* \ingroup bme68xApiConfig
* \page bme68x_api_bme68x_set_heatr_conf bme68x_set_heatr_conf
* \code
* int8_t bme68x_set_heatr_conf(uint8_t op_mode, const struct bme68x_heatr_conf *conf, struct bme68x_dev *dev);
* \endcode
* @details This API is used to set the gas configuration of the sensor.
*
* @param[in] op_mode : Expected operation mode of the sensor.
* @param[in] conf : Desired heating configuration.
* @param[in,out] dev : Structure instance of bme68x_dev.
*
* @return Result of API execution status
* @retval 0 -> Success
* @retval < 0 -> Fail
*/
int8_t bme68x_set_heatr_conf(uint8_t op_mode, const struct bme68x_heatr_conf *conf, struct bme68x_dev *dev);
/*!
* \ingroup bme68xApiConfig
* \page bme68x_api_bme68x_get_heatr_conf bme68x_get_heatr_conf
* \code
* int8_t bme68x_get_heatr_conf(const struct bme68x_heatr_conf *conf, struct bme68x_dev *dev);
* \endcode
* @details This API is used to get the gas configuration of the sensor.
*
* @param[out] conf : Current configurations of the gas sensor.
* @param[in,out] dev : Structure instance of bme68x_dev.
*
* @return Result of API execution status
* @retval 0 -> Success
* @retval < 0 -> Fail
*/
int8_t bme68x_get_heatr_conf(const struct bme68x_heatr_conf *conf, struct bme68x_dev *dev);
/*!
* \ingroup bme68xApiSystem
* \page bme68x_api_bme68x_low_gas_selftest_check bme68x_low_gas_selftest_check
* \code
* int8_t bme68x_low_gas_selftest_check(const struct bme68x_dev *dev);
* \endcode
* @details This API performs Self-test of low gas variant of BME68X
*
* @param[in, out] dev : Structure instance of bme68x_dev
*
* @return Result of API execution status
* @retval 0 -> Success
* @retval < 0 -> Fail
*/
int8_t bme68x_low_gas_selftest_check(const struct bme68x_dev *dev);
#ifdef __cplusplus
}
#endif /* End of CPP guard */
#endif /* BME68X_H_ */
+972
View File
@@ -0,0 +1,972 @@
/**
* Copyright (c) 2021 Bosch Sensortec GmbH. All rights reserved.
*
* BSD-3-Clause
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @file bme68x_defs.h
* @date 2021-05-24
* @version v4.4.6
*
*/
/*! @cond DOXYGEN_SUPRESS */
#ifndef BME68X_DEFS_H_
#define BME68X_DEFS_H_
/********************************************************* */
/*! Header includes */
/********************************************************* */
#ifdef __KERNEL__
#include <linux/types.h>
#include <linux/kernel.h>
#else
#include <stdint.h>
#include <stddef.h>
#endif
/********************************************************* */
/*! Common Macros */
/********************************************************* */
#ifdef __KERNEL__
#if !defined(UINT8_C) && !defined(INT8_C)
#define INT8_C(x) S8_C(x)
#define UINT8_C(x) U8_C(x)
#endif
#if !defined(UINT16_C) && !defined(INT16_C)
#define INT16_C(x) S16_C(x)
#define UINT16_C(x) U16_C(x)
#endif
#if !defined(INT32_C) && !defined(UINT32_C)
#define INT32_C(x) S32_C(x)
#define UINT32_C(x) U32_C(x)
#endif
#if !defined(INT64_C) && !defined(UINT64_C)
#define INT64_C(x) S64_C(x)
#define UINT64_C(x) U64_C(x)
#endif
#endif
/*! C standard macros */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *) 0)
#endif
#endif
#ifndef BME68X_DO_NOT_USE_FPU
/* Comment or un-comment the macro to provide floating point data output */
#define BME68X_USE_FPU
#endif
/* Period between two polls (value can be given by user) */
#ifndef BME68X_PERIOD_POLL
#define BME68X_PERIOD_POLL UINT32_C(10000)
#endif
/* BME68X unique chip identifier */
#define BME68X_CHIP_ID UINT8_C(0x61)
/* Period for a soft reset */
#define BME68X_PERIOD_RESET UINT32_C(10000)
/* BME68X lower I2C address */
#define BME68X_I2C_ADDR_LOW UINT8_C(0x76)
/* BME68X higher I2C address */
#define BME68X_I2C_ADDR_HIGH UINT8_C(0x77)
/* Soft reset command */
#define BME68X_SOFT_RESET_CMD UINT8_C(0xb6)
/* Return code definitions */
/* Success */
#define BME68X_OK INT8_C(0)
/* Errors */
/* Null pointer passed */
#define BME68X_E_NULL_PTR INT8_C(-1)
/* Communication failure */
#define BME68X_E_COM_FAIL INT8_C(-2)
/* Sensor not found */
#define BME68X_E_DEV_NOT_FOUND INT8_C(-3)
/* Incorrect length parameter */
#define BME68X_E_INVALID_LENGTH INT8_C(-4)
/* Self test fail error */
#define BME68X_E_SELF_TEST INT8_C(-5)
/* Warnings */
/* Define a valid operation mode */
#define BME68X_W_DEFINE_OP_MODE INT8_C(1)
/* No new data was found */
#define BME68X_W_NO_NEW_DATA INT8_C(2)
/* Define the shared heating duration */
#define BME68X_W_DEFINE_SHD_HEATR_DUR INT8_C(3)
/* Information - only available via bme68x_dev.info_msg */
#define BME68X_I_PARAM_CORR UINT8_C(1)
/* Register map addresses in I2C */
/* Register for 3rd group of coefficients */
#define BME68X_REG_COEFF3 UINT8_C(0x00)
/* 0th Field address*/
#define BME68X_REG_FIELD0 UINT8_C(0x1d)
/* 0th Current DAC address*/
#define BME68X_REG_IDAC_HEAT0 UINT8_C(0x50)
/* 0th Res heat address */
#define BME68X_REG_RES_HEAT0 UINT8_C(0x5a)
/* 0th Gas wait address */
#define BME68X_REG_GAS_WAIT0 UINT8_C(0x64)
/* Shared heating duration address */
#define BME68X_REG_SHD_HEATR_DUR UINT8_C(0x6E)
/* CTRL_GAS_0 address */
#define BME68X_REG_CTRL_GAS_0 UINT8_C(0x70)
/* CTRL_GAS_1 address */
#define BME68X_REG_CTRL_GAS_1 UINT8_C(0x71)
/* CTRL_HUM address */
#define BME68X_REG_CTRL_HUM UINT8_C(0x72)
/* CTRL_MEAS address */
#define BME68X_REG_CTRL_MEAS UINT8_C(0x74)
/* CONFIG address */
#define BME68X_REG_CONFIG UINT8_C(0x75)
/* MEM_PAGE address */
#define BME68X_REG_MEM_PAGE UINT8_C(0xf3)
/* Unique ID address */
#define BME68X_REG_UNIQUE_ID UINT8_C(0x83)
/* Register for 1st group of coefficients */
#define BME68X_REG_COEFF1 UINT8_C(0x8a)
/* Chip ID address */
#define BME68X_REG_CHIP_ID UINT8_C(0xd0)
/* Soft reset address */
#define BME68X_REG_SOFT_RESET UINT8_C(0xe0)
/* Register for 2nd group of coefficients */
#define BME68X_REG_COEFF2 UINT8_C(0xe1)
/* Variant ID Register */
#define BME68X_REG_VARIANT_ID UINT8_C(0xF0)
/* Enable/Disable macros */
/* Enable */
#define BME68X_ENABLE UINT8_C(0x01)
/* Disable */
#define BME68X_DISABLE UINT8_C(0x00)
/* Variant ID macros */
/* Low Gas variant */
#define BME68X_VARIANT_GAS_LOW UINT8_C(0x00)
/* High Gas variant */
#define BME68X_VARIANT_GAS_HIGH UINT8_C(0x01)
/* Oversampling setting macros */
/* Switch off measurement */
#define BME68X_OS_NONE UINT8_C(0)
/* Perform 1 measurement */
#define BME68X_OS_1X UINT8_C(1)
/* Perform 2 measurements */
#define BME68X_OS_2X UINT8_C(2)
/* Perform 4 measurements */
#define BME68X_OS_4X UINT8_C(3)
/* Perform 8 measurements */
#define BME68X_OS_8X UINT8_C(4)
/* Perform 16 measurements */
#define BME68X_OS_16X UINT8_C(5)
/* IIR Filter settings */
/* Switch off the filter */
#define BME68X_FILTER_OFF UINT8_C(0)
/* Filter coefficient of 2 */
#define BME68X_FILTER_SIZE_1 UINT8_C(1)
/* Filter coefficient of 4 */
#define BME68X_FILTER_SIZE_3 UINT8_C(2)
/* Filter coefficient of 8 */
#define BME68X_FILTER_SIZE_7 UINT8_C(3)
/* Filter coefficient of 16 */
#define BME68X_FILTER_SIZE_15 UINT8_C(4)
/* Filter coefficient of 32 */
#define BME68X_FILTER_SIZE_31 UINT8_C(5)
/* Filter coefficient of 64 */
#define BME68X_FILTER_SIZE_63 UINT8_C(6)
/* Filter coefficient of 128 */
#define BME68X_FILTER_SIZE_127 UINT8_C(7)
/* ODR/Standby time macros */
/* Standby time of 0.59ms */
#define BME68X_ODR_0_59_MS UINT8_C(0)
/* Standby time of 62.5ms */
#define BME68X_ODR_62_5_MS UINT8_C(1)
/* Standby time of 125ms */
#define BME68X_ODR_125_MS UINT8_C(2)
/* Standby time of 250ms */
#define BME68X_ODR_250_MS UINT8_C(3)
/* Standby time of 500ms */
#define BME68X_ODR_500_MS UINT8_C(4)
/* Standby time of 1s */
#define BME68X_ODR_1000_MS UINT8_C(5)
/* Standby time of 10ms */
#define BME68X_ODR_10_MS UINT8_C(6)
/* Standby time of 20ms */
#define BME68X_ODR_20_MS UINT8_C(7)
/* No standby time */
#define BME68X_ODR_NONE UINT8_C(8)
/* Operating mode macros */
/* Sleep operation mode */
#define BME68X_SLEEP_MODE UINT8_C(0)
/* Forced operation mode */
#define BME68X_FORCED_MODE UINT8_C(1)
/* Parallel operation mode */
#define BME68X_PARALLEL_MODE UINT8_C(2)
/* Sequential operation mode */
#define BME68X_SEQUENTIAL_MODE UINT8_C(3)
/* SPI page macros */
/* SPI memory page 0 */
#define BME68X_MEM_PAGE0 UINT8_C(0x10)
/* SPI memory page 1 */
#define BME68X_MEM_PAGE1 UINT8_C(0x00)
/* Coefficient index macros */
/* Length for all coefficients */
#define BME68X_LEN_COEFF_ALL UINT8_C(42)
/* Length for 1st group of coefficients */
#define BME68X_LEN_COEFF1 UINT8_C(23)
/* Length for 2nd group of coefficients */
#define BME68X_LEN_COEFF2 UINT8_C(14)
/* Length for 3rd group of coefficients */
#define BME68X_LEN_COEFF3 UINT8_C(5)
/* Length of the field */
#define BME68X_LEN_FIELD UINT8_C(17)
/* Length between two fields */
#define BME68X_LEN_FIELD_OFFSET UINT8_C(17)
/* Length of the configuration register */
#define BME68X_LEN_CONFIG UINT8_C(5)
/* Length of the interleaved buffer */
#define BME68X_LEN_INTERLEAVE_BUFF UINT8_C(20)
/* Coefficient index macros */
/* Coefficient T2 LSB position */
#define BME68X_IDX_T2_LSB (0)
/* Coefficient T2 MSB position */
#define BME68X_IDX_T2_MSB (1)
/* Coefficient T3 position */
#define BME68X_IDX_T3 (2)
/* Coefficient P1 LSB position */
#define BME68X_IDX_P1_LSB (4)
/* Coefficient P1 MSB position */
#define BME68X_IDX_P1_MSB (5)
/* Coefficient P2 LSB position */
#define BME68X_IDX_P2_LSB (6)
/* Coefficient P2 MSB position */
#define BME68X_IDX_P2_MSB (7)
/* Coefficient P3 position */
#define BME68X_IDX_P3 (8)
/* Coefficient P4 LSB position */
#define BME68X_IDX_P4_LSB (10)
/* Coefficient P4 MSB position */
#define BME68X_IDX_P4_MSB (11)
/* Coefficient P5 LSB position */
#define BME68X_IDX_P5_LSB (12)
/* Coefficient P5 MSB position */
#define BME68X_IDX_P5_MSB (13)
/* Coefficient P7 position */
#define BME68X_IDX_P7 (14)
/* Coefficient P6 position */
#define BME68X_IDX_P6 (15)
/* Coefficient P8 LSB position */
#define BME68X_IDX_P8_LSB (18)
/* Coefficient P8 MSB position */
#define BME68X_IDX_P8_MSB (19)
/* Coefficient P9 LSB position */
#define BME68X_IDX_P9_LSB (20)
/* Coefficient P9 MSB position */
#define BME68X_IDX_P9_MSB (21)
/* Coefficient P10 position */
#define BME68X_IDX_P10 (22)
/* Coefficient H2 MSB position */
#define BME68X_IDX_H2_MSB (23)
/* Coefficient H2 LSB position */
#define BME68X_IDX_H2_LSB (24)
/* Coefficient H1 LSB position */
#define BME68X_IDX_H1_LSB (24)
/* Coefficient H1 MSB position */
#define BME68X_IDX_H1_MSB (25)
/* Coefficient H3 position */
#define BME68X_IDX_H3 (26)
/* Coefficient H4 position */
#define BME68X_IDX_H4 (27)
/* Coefficient H5 position */
#define BME68X_IDX_H5 (28)
/* Coefficient H6 position */
#define BME68X_IDX_H6 (29)
/* Coefficient H7 position */
#define BME68X_IDX_H7 (30)
/* Coefficient T1 LSB position */
#define BME68X_IDX_T1_LSB (31)
/* Coefficient T1 MSB position */
#define BME68X_IDX_T1_MSB (32)
/* Coefficient GH2 LSB position */
#define BME68X_IDX_GH2_LSB (33)
/* Coefficient GH2 MSB position */
#define BME68X_IDX_GH2_MSB (34)
/* Coefficient GH1 position */
#define BME68X_IDX_GH1 (35)
/* Coefficient GH3 position */
#define BME68X_IDX_GH3 (36)
/* Coefficient res heat value position */
#define BME68X_IDX_RES_HEAT_VAL (37)
/* Coefficient res heat range position */
#define BME68X_IDX_RES_HEAT_RANGE (39)
/* Coefficient range switching error position */
#define BME68X_IDX_RANGE_SW_ERR (41)
/* Gas measurement macros */
/* Disable gas measurement */
#define BME68X_DISABLE_GAS_MEAS UINT8_C(0x00)
/* Enable gas measurement low */
#define BME68X_ENABLE_GAS_MEAS_L UINT8_C(0x01)
/* Enable gas measurement high */
#define BME68X_ENABLE_GAS_MEAS_H UINT8_C(0x02)
/* Heater control macros */
/* Enable heater */
#define BME68X_ENABLE_HEATER UINT8_C(0x00)
/* Disable heater */
#define BME68X_DISABLE_HEATER UINT8_C(0x01)
#ifdef BME68X_USE_FPU
/* 0 degree Celsius */
#define BME68X_MIN_TEMPERATURE INT16_C(0)
/* 60 degree Celsius */
#define BME68X_MAX_TEMPERATURE INT16_C(60)
/* 900 hecto Pascals */
#define BME68X_MIN_PRESSURE UINT32_C(90000)
/* 1100 hecto Pascals */
#define BME68X_MAX_PRESSURE UINT32_C(110000)
/* 20% relative humidity */
#define BME68X_MIN_HUMIDITY UINT32_C(20)
/* 80% relative humidity*/
#define BME68X_MAX_HUMIDITY UINT32_C(80)
#else
/* 0 degree Celsius */
#define BME68X_MIN_TEMPERATURE INT16_C(0)
/* 60 degree Celsius */
#define BME68X_MAX_TEMPERATURE INT16_C(6000)
/* 900 hecto Pascals */
#define BME68X_MIN_PRESSURE UINT32_C(90000)
/* 1100 hecto Pascals */
#define BME68X_MAX_PRESSURE UINT32_C(110000)
/* 20% relative humidity */
#define BME68X_MIN_HUMIDITY UINT32_C(20000)
/* 80% relative humidity*/
#define BME68X_MAX_HUMIDITY UINT32_C(80000)
#endif
#define BME68X_HEATR_DUR1 UINT16_C(1000)
#define BME68X_HEATR_DUR2 UINT16_C(2000)
#define BME68X_HEATR_DUR1_DELAY UINT32_C(1000000)
#define BME68X_HEATR_DUR2_DELAY UINT32_C(2000000)
#define BME68X_N_MEAS UINT8_C(6)
#define BME68X_LOW_TEMP UINT8_C(150)
#define BME68X_HIGH_TEMP UINT16_C(350)
/* Mask macros */
/* Mask for number of conversions */
#define BME68X_NBCONV_MSK UINT8_C(0X0f)
/* Mask for IIR filter */
#define BME68X_FILTER_MSK UINT8_C(0X1c)
/* Mask for ODR[3] */
#define BME68X_ODR3_MSK UINT8_C(0x80)
/* Mask for ODR[2:0] */
#define BME68X_ODR20_MSK UINT8_C(0xe0)
/* Mask for temperature oversampling */
#define BME68X_OST_MSK UINT8_C(0Xe0)
/* Mask for pressure oversampling */
#define BME68X_OSP_MSK UINT8_C(0X1c)
/* Mask for humidity oversampling */
#define BME68X_OSH_MSK UINT8_C(0X07)
/* Mask for heater control */
#define BME68X_HCTRL_MSK UINT8_C(0x08)
/* Mask for run gas */
#define BME68X_RUN_GAS_MSK UINT8_C(0x30)
/* Mask for operation mode */
#define BME68X_MODE_MSK UINT8_C(0x03)
/* Mask for res heat range */
#define BME68X_RHRANGE_MSK UINT8_C(0x30)
/* Mask for range switching error */
#define BME68X_RSERROR_MSK UINT8_C(0xf0)
/* Mask for new data */
#define BME68X_NEW_DATA_MSK UINT8_C(0x80)
/* Mask for gas index */
#define BME68X_GAS_INDEX_MSK UINT8_C(0x0f)
/* Mask for gas range */
#define BME68X_GAS_RANGE_MSK UINT8_C(0x0f)
/* Mask for gas measurement valid */
#define BME68X_GASM_VALID_MSK UINT8_C(0x20)
/* Mask for heater stability */
#define BME68X_HEAT_STAB_MSK UINT8_C(0x10)
/* Mask for SPI memory page */
#define BME68X_MEM_PAGE_MSK UINT8_C(0x10)
/* Mask for reading a register in SPI */
#define BME68X_SPI_RD_MSK UINT8_C(0x80)
/* Mask for writing a register in SPI */
#define BME68X_SPI_WR_MSK UINT8_C(0x7f)
/* Mask for the H1 calibration coefficient */
#define BME68X_BIT_H1_DATA_MSK UINT8_C(0x0f)
/* Position macros */
/* Filter bit position */
#define BME68X_FILTER_POS UINT8_C(2)
/* Temperature oversampling bit position */
#define BME68X_OST_POS UINT8_C(5)
/* Pressure oversampling bit position */
#define BME68X_OSP_POS UINT8_C(2)
/* ODR[3] bit position */
#define BME68X_ODR3_POS UINT8_C(7)
/* ODR[2:0] bit position */
#define BME68X_ODR20_POS UINT8_C(5)
/* Run gas bit position */
#define BME68X_RUN_GAS_POS UINT8_C(4)
/* Heater control bit position */
#define BME68X_HCTRL_POS UINT8_C(3)
/* Macro to combine two 8 bit data's to form a 16 bit data */
#define BME68X_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb)
/* Macro to set bits */
#define BME68X_SET_BITS(reg_data, bitname, data) \
((reg_data & ~(bitname##_MSK)) | \
((data << bitname##_POS) & bitname##_MSK))
/* Macro to get bits */
#define BME68X_GET_BITS(reg_data, bitname) ((reg_data & (bitname##_MSK)) >> \
(bitname##_POS))
/* Macro to set bits starting from position 0 */
#define BME68X_SET_BITS_POS_0(reg_data, bitname, data) \
((reg_data & ~(bitname##_MSK)) | \
(data & bitname##_MSK))
/* Macro to get bits starting from position 0 */
#define BME68X_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK))
/**
* BME68X_INTF_RET_TYPE is the read/write interface return type which can be overwritten by the build system.
* The default is set to int8_t.
*/
#ifndef BME68X_INTF_RET_TYPE
#define BME68X_INTF_RET_TYPE int8_t
#endif
/**
* BME68X_INTF_RET_SUCCESS is the success return value read/write interface return type which can be
* overwritten by the build system. The default is set to 0. It is used to check for a successful
* execution of the read/write functions
*/
#ifndef BME68X_INTF_RET_SUCCESS
#define BME68X_INTF_RET_SUCCESS INT8_C(0)
#endif
/********************************************************* */
/*! Function Pointers */
/********************************************************* */
/*!
* @brief Bus communication function pointer which should be mapped to
* the platform specific read functions of the user
*
* @param[in] reg_addr : 8bit register address of the sensor
* @param[out] reg_data : Data from the specified address
* @param[in] length : Length of the reg_data array
* @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors
* for interface related callbacks
* @retval 0 for Success
* @retval Non-zero for Failure
*/
typedef BME68X_INTF_RET_TYPE (*bme68x_read_fptr_t)(uint8_t reg_addr, uint8_t *reg_data, uint32_t length,
void *intf_ptr);
/*!
* @brief Bus communication function pointer which should be mapped to
* the platform specific write functions of the user
*
* @param[in] reg_addr : 8bit register address of the sensor
* @param[out] reg_data : Data to the specified address
* @param[in] length : Length of the reg_data array
* @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors
* for interface related callbacks
* @retval 0 for Success
* @retval Non-zero for Failure
*
*/
typedef BME68X_INTF_RET_TYPE (*bme68x_write_fptr_t)(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length,
void *intf_ptr);
/*!
* @brief Delay function pointer which should be mapped to
* delay function of the user
*
* @param period - The time period in microseconds
* @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors
* for interface related callbacks
*/
typedef void (*bme68x_delay_us_fptr_t)(uint32_t period, void *intf_ptr);
/*
* @brief Generic communication function pointer
* @param[in] dev_id: Place holder to store the id of the device structure
* Can be used to store the index of the Chip select or
* I2C address of the device.
* @param[in] reg_addr: Used to select the register the where data needs to
* be read from or written to.
* @param[in,out] reg_data: Data array to read/write
* @param[in] len: Length of the data array
*/
/*
* @brief Interface selection Enumerations
*/
enum bme68x_intf {
/*! SPI interface */
BME68X_SPI_INTF,
/*! I2C interface */
BME68X_I2C_INTF
};
/* Structure definitions */
/*
* @brief Sensor field data structure
*/
struct bme68x_data
{
/*! Contains new_data, gasm_valid & heat_stab */
uint8_t status;
/*! The index of the heater profile used */
uint8_t gas_index;
/*! Measurement index to track order */
uint8_t meas_index;
/*! Heater resistance */
uint8_t res_heat;
/*! Current DAC */
uint8_t idac;
/*! Gas wait period */
uint8_t gas_wait;
#ifndef BME68X_USE_FPU
/*! Temperature in degree celsius x100 */
int16_t temperature;
/*! Pressure in Pascal */
uint32_t pressure;
/*! Humidity in % relative humidity x1000 */
uint32_t humidity;
/*! Gas resistance in Ohms */
uint32_t gas_resistance;
#else
/*! Temperature in degree celsius */
float temperature;
/*! Pressure in Pascal */
float pressure;
/*! Humidity in % relative humidity x1000 */
float humidity;
/*! Gas resistance in Ohms */
float gas_resistance;
#endif
};
/*
* @brief Structure to hold the calibration coefficients
*/
struct bme68x_calib_data
{
/*! Calibration coefficient for the humidity sensor */
uint16_t par_h1;
/*! Calibration coefficient for the humidity sensor */
uint16_t par_h2;
/*! Calibration coefficient for the humidity sensor */
int8_t par_h3;
/*! Calibration coefficient for the humidity sensor */
int8_t par_h4;
/*! Calibration coefficient for the humidity sensor */
int8_t par_h5;
/*! Calibration coefficient for the humidity sensor */
uint8_t par_h6;
/*! Calibration coefficient for the humidity sensor */
int8_t par_h7;
/*! Calibration coefficient for the gas sensor */
int8_t par_gh1;
/*! Calibration coefficient for the gas sensor */
int16_t par_gh2;
/*! Calibration coefficient for the gas sensor */
int8_t par_gh3;
/*! Calibration coefficient for the temperature sensor */
uint16_t par_t1;
/*! Calibration coefficient for the temperature sensor */
int16_t par_t2;
/*! Calibration coefficient for the temperature sensor */
int8_t par_t3;
/*! Calibration coefficient for the pressure sensor */
uint16_t par_p1;
/*! Calibration coefficient for the pressure sensor */
int16_t par_p2;
/*! Calibration coefficient for the pressure sensor */
int8_t par_p3;
/*! Calibration coefficient for the pressure sensor */
int16_t par_p4;
/*! Calibration coefficient for the pressure sensor */
int16_t par_p5;
/*! Calibration coefficient for the pressure sensor */
int8_t par_p6;
/*! Calibration coefficient for the pressure sensor */
int8_t par_p7;
/*! Calibration coefficient for the pressure sensor */
int16_t par_p8;
/*! Calibration coefficient for the pressure sensor */
int16_t par_p9;
/*! Calibration coefficient for the pressure sensor */
uint8_t par_p10;
#ifndef BME68X_USE_FPU
/*! Variable to store the intermediate temperature coefficient */
int32_t t_fine;
#else
/*! Variable to store the intermediate temperature coefficient */
float t_fine;
#endif
/*! Heater resistance range coefficient */
uint8_t res_heat_range;
/*! Heater resistance value coefficient */
int8_t res_heat_val;
/*! Gas resistance range switching error coefficient */
int8_t range_sw_err;
};
/*
* @brief BME68X sensor settings structure which comprises of ODR,
* over-sampling and filter settings.
*/
struct bme68x_conf
{
/*! Humidity oversampling. Refer @ref osx*/
uint8_t os_hum;
/*! Temperature oversampling. Refer @ref osx */
uint8_t os_temp;
/*! Pressure oversampling. Refer @ref osx */
uint8_t os_pres;
/*! Filter coefficient. Refer @ref filter*/
uint8_t filter;
/*!
* Standby time between sequential mode measurement profiles.
* Refer @ref odr
*/
uint8_t odr;
};
/*
* @brief BME68X gas heater configuration
*/
struct bme68x_heatr_conf
{
/*! Enable gas measurement. Refer @ref en_dis */
uint8_t enable;
/*! Store the heater temperature for forced mode degree Celsius */
uint16_t heatr_temp;
/*! Store the heating duration for forced mode in milliseconds */
uint16_t heatr_dur;
/*! Store the heater temperature profile in degree Celsius */
uint16_t *heatr_temp_prof;
/*! Store the heating duration profile in milliseconds */
uint16_t *heatr_dur_prof;
/*! Variable to store the length of the heating profile */
uint8_t profile_len;
/*!
* Variable to store heating duration for parallel mode
* in milliseconds
*/
uint16_t shared_heatr_dur;
};
/*
* @brief BME68X device structure
*/
struct bme68x_dev
{
/*! Chip Id */
uint8_t chip_id;
/*!
* The interface pointer is used to enable the user
* to link their interface descriptors for reference during the
* implementation of the read and write interfaces to the
* hardware.
*/
void *intf_ptr;
/*!
* Variant id
* ----------------------------------------
* Value | Variant
* ----------------------------------------
* 0 | BME68X_VARIANT_GAS_LOW
* 1 | BME68X_VARIANT_GAS_HIGH
* ----------------------------------------
*/
uint32_t variant_id;
/*! SPI/I2C interface */
enum bme68x_intf intf;
/*! Memory page used */
uint8_t mem_page;
/*! Ambient temperature in Degree C*/
int8_t amb_temp;
/*! Sensor calibration data */
struct bme68x_calib_data calib;
/*! Read function pointer */
bme68x_read_fptr_t read;
/*! Write function pointer */
bme68x_write_fptr_t write;
/*! Delay function pointer */
bme68x_delay_us_fptr_t delay_us;
/*! To store interface pointer error */
BME68X_INTF_RET_TYPE intf_rslt;
/*! Store the info messages */
uint8_t info_msg;
};
#endif /* BME68X_DEFS_H_ */
/*! @endcond */
+4 -4
View File
@@ -1,10 +1,10 @@
name=Adafruit BME680 Library
version=1.1.1
version=2.0.2
author=Adafruit
maintainer=Adafruit <info@adafruit.com>
sentence=Arduino library for BME680 sensors.
paragraph=Arduino library for BME680 humidity and pressure sensors.
sentence=Arduino library for BME680 and BME688 sensors.
paragraph=Arduino library for BME680 and BME688 humidity and pressure sensors.
category=Sensors
url=https://github.com/adafruit/Adafruit_BME680
architectures=*
depends=Adafruit Unified Sensor, Adafruit GFX Library, Adafruit SSD1306
depends=Adafruit Unified Sensor, Adafruit GFX Library, Adafruit SSD1306, Adafruit BusIO
+9 -2
View File
@@ -14,6 +14,11 @@
Adafruit_BME680 Library v1.0.5 required (https://github.com/adafruit/Adafruit_BME680/tree/1.0.5)
/******************************************************************************/
/** Changelog:
* 2023-04-15 tonhuisman: Fix copy/paste error for FEATURE_I2C_GET_ADDRESS
* Update Adafruit_BME680 library to v2.0.2
* 2023-04-15 tonhuisman: Started Changelog
*/
# include "src/PluginStructs/P106_data_struct.h"
@@ -69,6 +74,7 @@ boolean Plugin_106(uint8_t function, struct EventStruct *event, String& string)
case PLUGIN_WEBFORM_SHOW_I2C_PARAMS:
{
const uint8_t i2cAddressValues[] = { 0x77, 0x76 };
if (function == PLUGIN_WEBFORM_SHOW_I2C_PARAMS) {
addFormSelectorI2C(F("i2c_addr"), 2, i2cAddressValues, PCONFIG(0));
addFormNote(F("SDO Low=0x76, High=0x77"));
@@ -78,7 +84,7 @@ boolean Plugin_106(uint8_t function, struct EventStruct *event, String& string)
break;
}
# if FEATURE_I2FEATURE_I2C_GET_ADDRESSC_DEVICE_CHECK
# if FEATURE_I2C_GET_ADDRESS
case PLUGIN_I2C_GET_ADDRESS:
{
event->Par1 = PCONFIG(0);
@@ -112,7 +118,7 @@ boolean Plugin_106(uint8_t function, struct EventStruct *event, String& string)
if (nullptr != P106_data) {
P106_data->initialized = false; // Force re-init just in case the address changed.
success = P106_data->begin(PCONFIG(0));
success = P106_data->begin(PCONFIG(0));
}
break;
}
@@ -141,6 +147,7 @@ boolean Plugin_106(uint8_t function, struct EventStruct *event, String& string)
UserVar[event->BaseVarIndex + 3] = P106_data->bme.gas_resistance / 1000.0f;
const int elev = PCONFIG(1);
if (elev != 0)
{
UserVar[event->BaseVarIndex + 2] = pressureElevation(P106_data->bme.pressure / 100.0f, elev);