19static constexpr uint32_t DATA_TIMEOUT_ID = 0;
21static const LogString *chip_type_to_str(uint8_t chip_type) {
24 return LOG_STR(
"BMP 388");
26 return LOG_STR(
"BMP 390");
28 return LOG_STR(
"Unknown Chip Type");
35static const LogString *oversampling_to_str(
Oversampling oversampling) {
36 return OversamplingStrings::get_log_str(
static_cast<uint8_t
>(oversampling), OversamplingStrings::LAST_INDEX);
42static const LogString *iir_filter_to_str(
IIRFilter filter) {
43 return IIRFilterStrings::get_log_str(
static_cast<uint8_t
>(filter), IIRFilterStrings::LAST_INDEX);
57 ESP_LOGCONFIG(TAG,
"Chip %s Id 0x%X", LOG_STR_ARG(chip_type_to_str(this->
chip_id_.reg)), this->chip_id_.reg);
60 this->
mark_failed(LOG_STR(
"Wrong chip ID - please check if you are really using a BMP 388 or BMP 390"));
67 this->
mark_failed(LOG_STR(
"Can't read calibration data"));
71 (float) compensation_params_.param_T1 / powf(2.0f, -8.0f);
88 this->
mark_failed(LOG_STR(
"Failed to set IIR filter"));
107 this->
mark_failed(LOG_STR(
"Failed to set oversampling register"));
116 LOG_STR_ARG(chip_type_to_str(this->
chip_id_.reg)), this->chip_id_.reg);
117 ESP_LOGCONFIG(TAG,
" IIR Filter: %s", LOG_STR_ARG(iir_filter_to_str(this->
iir_filter_)));
118 LOG_UPDATE_INTERVAL(
this);
133 ESP_LOGV(TAG,
"Sending conversion request");
134 float meas_time = 1.0f;
140 this->
mark_failed(LOG_STR(
"Failed start forced mode"));
145 ESP_LOGVV(TAG,
"measurement time %" PRIu32, meas_timeout);
146 this->
set_timeout(DATA_TIMEOUT_ID, meas_timeout, [
this]() {
151 ESP_LOGW(TAG,
"Failed to read pressure and temperature - skipping update");
158 ESP_LOGW(TAG,
"Failed to read temperature - skipping update");
162 ESP_LOGD(TAG,
"Got temperature=%.1f°C",
temperature);
180 return event_.bit.por_detected;
197 osr_.bit.osr_p = oversampling;
203 osr_.bit.osr_t = oversampling;
222 ESP_LOGE(TAG,
"Failed to read temperature");
242 ESP_LOGD(TAG,
"Get measurement - data not ready skipping update");
249 ESP_LOGE(TAG,
"Failed to read measurements");
274 osr_.reg = temperature_oversampling << 3 | pressure_oversampling;
282 ESP_LOGD(TAG,
"Not ready - sensor is in sleep mode");
288 ESP_LOGE(TAG,
"Failed to read status register");
292 ESP_LOGVV(TAG,
"data ready status %d",
status);
323 partial_data1 = uncomp_press * uncomp_press;
325 partial_data3 = partial_data1 * partial_data2;
326 float partial_data4 =
328 return partial_out1 + partial_out2 + partial_data4;
BedjetMode mode
BedJet operating mode.
void mark_failed()
Mark this component as failed.
void status_set_warning()
void set_timeout(const char *name, uint32_t timeout, std::function< void()> &&f)
Set a timeout function with a const char* name.
void status_clear_warning()
Oversampling pressure_oversampling_
union esphome::bmp3xx_base::BMP3XXComponent::@24 chip_id_
union esphome::bmp3xx_base::BMP3XXComponent::@28 osr_
struct esphome::bmp3xx_base::BMP3XXComponent::FloatParams compensation_float_params_
bool get_pressure(float &pressure)
Get a pressure measurement.
bool get_measurements(float &temperature, float &pressure)
Get a temperature and pressure measurement.
union esphome::bmp3xx_base::BMP3XXComponent::@26 int_status_
bool start_forced_conversion()
Start a one shot measurement in FORCED_MODE.
sensor::Sensor * temperature_sensor_
bool set_iir_filter(IIRFilter iir_filter)
Set the IIR filter setting: OFF, 2, 3, 8, 16, 32.
union esphome::bmp3xx_base::BMP3XXComponent::@27 pwr_ctrl_
bool set_pressure_oversampling(Oversampling pressure_oversampling)
Set the pressure oversampling: OFF, X1, X2, X4, X8, X16, X32.
bool get_temperature(float &temperature)
Get a temperature measurement.
sensor::Sensor * pressure_sensor_
bool stop_conversion()
Stop the conversion and return to SLEEP_MODE.
float bmp388_compensate_temperature_(float uncomp_temp)
Oversampling temperature_oversampling_
virtual bool write_byte(uint8_t a_register, uint8_t data)=0
virtual bool read_bytes(uint8_t a_register, uint8_t *data, size_t len)=0
union esphome::bmp3xx_base::BMP3XXComponent::@30 config_
uint8_t reset()
Soft reset the sensor.
union esphome::bmp3xx_base::BMP3XXComponent::@25 event_
bool set_oversampling_register(Oversampling pressure_oversampling, Oversampling temperature_oversampling)
Set the BMP388 oversampling register.
bool data_ready()
Checks if a measurement is ready.
virtual bool read_byte(uint8_t a_register, uint8_t *data)=0
bool set_mode(OperationMode mode)
Set the barometer mode.
float bmp388_compensate_pressure_(float uncomp_press, float t_lin)
void dump_config() override
bool set_temperature_oversampling(Oversampling temperature_oversampling)
Set the temperature oversampling: OFF, X1, X2, X4, X8, X16, X32.
void publish_state(float state)
Publish a new state to the front-end.
uint8_t oversampling_to_time(Oversampling over_sampling)
Oversampling
Oversampling bit fields in the control and measurement register.
ESPHOME_LOG_TAG(TAG, "bmp3xx.sensor")
OperationMode
Device mode bitfield in the control and measurement register.
PROGMEM_STRING_TABLE(OversamplingStrings, "None", "2x", "4x", "8x", "16x", "32x", "")
IIRFilter
Infinite Impulse Response (IIR) filter bit field in the configuration register.
constexpr uint32_t encode_uint24(uint8_t byte1, uint8_t byte2, uint8_t byte3)
Encode a 24-bit value given three bytes in most to least significant byte order.
void HOT delay(uint32_t ms)