mirror of
https://github.com/esphome/esphome.git
synced 2024-12-22 21:44:55 +01:00
Burst read for BME280, to reduce spurious spikes (#2809)
This commit is contained in:
parent
24dfecb6f0
commit
cd018ad3a5
2 changed files with 20 additions and 19 deletions
|
@ -33,6 +33,7 @@ static const uint8_t BME280_REGISTER_CONTROLHUMID = 0xF2;
|
||||||
static const uint8_t BME280_REGISTER_STATUS = 0xF3;
|
static const uint8_t BME280_REGISTER_STATUS = 0xF3;
|
||||||
static const uint8_t BME280_REGISTER_CONTROL = 0xF4;
|
static const uint8_t BME280_REGISTER_CONTROL = 0xF4;
|
||||||
static const uint8_t BME280_REGISTER_CONFIG = 0xF5;
|
static const uint8_t BME280_REGISTER_CONFIG = 0xF5;
|
||||||
|
static const uint8_t BME280_REGISTER_MEASUREMENTS = 0xF7;
|
||||||
static const uint8_t BME280_REGISTER_PRESSUREDATA = 0xF7;
|
static const uint8_t BME280_REGISTER_PRESSUREDATA = 0xF7;
|
||||||
static const uint8_t BME280_REGISTER_TEMPDATA = 0xFA;
|
static const uint8_t BME280_REGISTER_TEMPDATA = 0xFA;
|
||||||
static const uint8_t BME280_REGISTER_HUMIDDATA = 0xFD;
|
static const uint8_t BME280_REGISTER_HUMIDDATA = 0xFD;
|
||||||
|
@ -178,21 +179,27 @@ void BME280Component::update() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
float meas_time = 1.5;
|
float meas_time = 1.5f;
|
||||||
meas_time += 2.3f * oversampling_to_time(this->temperature_oversampling_);
|
meas_time += 2.3f * oversampling_to_time(this->temperature_oversampling_);
|
||||||
meas_time += 2.3f * oversampling_to_time(this->pressure_oversampling_) + 0.575f;
|
meas_time += 2.3f * oversampling_to_time(this->pressure_oversampling_) + 0.575f;
|
||||||
meas_time += 2.3f * oversampling_to_time(this->humidity_oversampling_) + 0.575f;
|
meas_time += 2.3f * oversampling_to_time(this->humidity_oversampling_) + 0.575f;
|
||||||
|
|
||||||
this->set_timeout("data", uint32_t(ceilf(meas_time)), [this]() {
|
this->set_timeout("data", uint32_t(ceilf(meas_time)), [this]() {
|
||||||
|
uint8_t data[8];
|
||||||
|
if (!this->read_bytes(BME280_REGISTER_MEASUREMENTS, data, 8)) {
|
||||||
|
ESP_LOGW(TAG, "Error reading registers.");
|
||||||
|
this->status_set_warning();
|
||||||
|
return;
|
||||||
|
}
|
||||||
int32_t t_fine = 0;
|
int32_t t_fine = 0;
|
||||||
float temperature = this->read_temperature_(&t_fine);
|
float temperature = this->read_temperature_(data, &t_fine);
|
||||||
if (std::isnan(temperature)) {
|
if (std::isnan(temperature)) {
|
||||||
ESP_LOGW(TAG, "Invalid temperature, cannot read pressure & humidity values.");
|
ESP_LOGW(TAG, "Invalid temperature, cannot read pressure & humidity values.");
|
||||||
this->status_set_warning();
|
this->status_set_warning();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
float pressure = this->read_pressure_(t_fine);
|
float pressure = this->read_pressure_(data, t_fine);
|
||||||
float humidity = this->read_humidity_(t_fine);
|
float humidity = this->read_humidity_(data, t_fine);
|
||||||
|
|
||||||
ESP_LOGD(TAG, "Got temperature=%.1f°C pressure=%.1fhPa humidity=%.1f%%", temperature, pressure, humidity);
|
ESP_LOGD(TAG, "Got temperature=%.1f°C pressure=%.1fhPa humidity=%.1f%%", temperature, pressure, humidity);
|
||||||
if (this->temperature_sensor_ != nullptr)
|
if (this->temperature_sensor_ != nullptr)
|
||||||
|
@ -204,11 +211,8 @@ void BME280Component::update() {
|
||||||
this->status_clear_warning();
|
this->status_clear_warning();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
float BME280Component::read_temperature_(int32_t *t_fine) {
|
float BME280Component::read_temperature_(const uint8_t *data, int32_t *t_fine) {
|
||||||
uint8_t data[3];
|
int32_t adc = ((data[3] & 0xFF) << 16) | ((data[4] & 0xFF) << 8) | (data[5] & 0xFF);
|
||||||
if (!this->read_bytes(BME280_REGISTER_TEMPDATA, data, 3))
|
|
||||||
return NAN;
|
|
||||||
int32_t adc = ((data[0] & 0xFF) << 16) | ((data[1] & 0xFF) << 8) | (data[2] & 0xFF);
|
|
||||||
adc >>= 4;
|
adc >>= 4;
|
||||||
if (adc == 0x80000)
|
if (adc == 0x80000)
|
||||||
// temperature was disabled
|
// temperature was disabled
|
||||||
|
@ -226,10 +230,7 @@ float BME280Component::read_temperature_(int32_t *t_fine) {
|
||||||
return temperature / 100.0f;
|
return temperature / 100.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
float BME280Component::read_pressure_(int32_t t_fine) {
|
float BME280Component::read_pressure_(const uint8_t *data, int32_t t_fine) {
|
||||||
uint8_t data[3];
|
|
||||||
if (!this->read_bytes(BME280_REGISTER_PRESSUREDATA, data, 3))
|
|
||||||
return NAN;
|
|
||||||
int32_t adc = ((data[0] & 0xFF) << 16) | ((data[1] & 0xFF) << 8) | (data[2] & 0xFF);
|
int32_t adc = ((data[0] & 0xFF) << 16) | ((data[1] & 0xFF) << 8) | (data[2] & 0xFF);
|
||||||
adc >>= 4;
|
adc >>= 4;
|
||||||
if (adc == 0x80000)
|
if (adc == 0x80000)
|
||||||
|
@ -265,9 +266,9 @@ float BME280Component::read_pressure_(int32_t t_fine) {
|
||||||
return (p / 256.0f) / 100.0f;
|
return (p / 256.0f) / 100.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
float BME280Component::read_humidity_(int32_t t_fine) {
|
float BME280Component::read_humidity_(const uint8_t *data, int32_t t_fine) {
|
||||||
uint16_t raw_adc;
|
uint16_t raw_adc = ((data[6] & 0xFF) << 8) | (data[7] & 0xFF);
|
||||||
if (!this->read_byte_16(BME280_REGISTER_HUMIDDATA, &raw_adc) || raw_adc == 0x8000)
|
if (raw_adc == 0x8000)
|
||||||
return NAN;
|
return NAN;
|
||||||
|
|
||||||
int32_t adc = raw_adc;
|
int32_t adc = raw_adc;
|
||||||
|
|
|
@ -82,11 +82,11 @@ class BME280Component : public PollingComponent, public i2c::I2CDevice {
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// Read the temperature value and store the calculated ambient temperature in t_fine.
|
/// Read the temperature value and store the calculated ambient temperature in t_fine.
|
||||||
float read_temperature_(int32_t *t_fine);
|
float read_temperature_(const uint8_t *data, int32_t *t_fine);
|
||||||
/// Read the pressure value in hPa using the provided t_fine value.
|
/// Read the pressure value in hPa using the provided t_fine value.
|
||||||
float read_pressure_(int32_t t_fine);
|
float read_pressure_(const uint8_t *data, int32_t t_fine);
|
||||||
/// Read the humidity value in % using the provided t_fine value.
|
/// Read the humidity value in % using the provided t_fine value.
|
||||||
float read_humidity_(int32_t t_fine);
|
float read_humidity_(const uint8_t *data, int32_t t_fine);
|
||||||
uint8_t read_u8_(uint8_t a_register);
|
uint8_t read_u8_(uint8_t a_register);
|
||||||
uint16_t read_u16_le_(uint8_t a_register);
|
uint16_t read_u16_le_(uint8_t a_register);
|
||||||
int16_t read_s16_le_(uint8_t a_register);
|
int16_t read_s16_le_(uint8_t a_register);
|
||||||
|
|
Loading…
Reference in a new issue