Is there any way to get values to appear in the BME680 temperature XLSB with no or minimal oversampling?
Hello JamesMeech,
Could we know why you need to do this?
I'll assume that this is not possible based on the fact that the question remains unanswered.
Hello JamesMeech,
BME680 supported over sampling. Please refer the following materials from data sheet.
/*!
* @brief This internal API is used to calculate the field data of sensor.
*/
static int8_t read_field_data(struct bme680_field_data *data, struct bme680_dev *dev)
{
int8_t rslt;
uint8_t buff[BME680_FIELD_LENGTH] = { 0 };
uint8_t gas_range;
uint32_t adc_temp;
uint32_t adc_pres;
uint16_t adc_hum;
uint16_t adc_gas_res;
uint8_t tries = 10;
/* Check for null pointer in the device structure*/
rslt = null_ptr_check(dev);
do {
if (rslt == BME680_OK) {
rslt = bme680_get_regs(((uint8_t) (BME680_FIELD0_ADDR)), buff, (uint16_t) BME680_FIELD_LENGTH,
dev);
data->status = buff[0] & BME680_NEW_DATA_MSK;
data->gas_index = buff[0] & BME680_GAS_INDEX_MSK;
data->meas_index = buff[1];
/* read the raw data from the sensor */
adc_pres = (uint32_t) (((uint32_t) buff[2] * 4096) | ((uint32_t) buff[3] * 16)
| ((uint32_t) buff[4] / 16));
adc_temp = (uint32_t) (((uint32_t) buff[5] * 4096) | ((uint32_t) buff[6] * 16)
| ((uint32_t) buff[7] / 16));
adc_hum = (uint16_t) (((uint32_t) buff[8] * 256) | (uint32_t) buff[9]);
adc_gas_res = (uint16_t) ((uint32_t) buff[13] * 4 | (((uint32_t) buff[14]) / 64));
gas_range = buff[14] & BME680_GAS_RANGE_MSK;
data->status |= buff[14] & BME680_GASM_VALID_MSK;
data->status |= buff[14] & BME680_HEAT_STAB_MSK;
if (data->status & BME680_NEW_DATA_MSK) {
data->temperature = calc_temperature(adc_temp, dev);
data->pressure = calc_pressure(adc_pres, dev);
data->humidity = calc_humidity(adc_hum, dev);
data->gas_resistance = calc_gas_resistance(adc_gas_res, gas_range, dev);
break;
}
/* Delay to poll the data */
dev->delay_ms(BME680_POLL_PERIOD_MS);
}
tries--;
} while (tries);
if (!tries)
rslt = BME680_W_NO_NEW_DATA;
return rslt;
}