ESPHome 2026.4.0-dev
Loading...
Searching...
No Matches
bmp581_base.h
Go to the documentation of this file.
1// All datasheet page references refer to Bosch Document Number BST-BMP581-DS004-04 (revision number 1.4)
2
3#pragma once
4
7
8namespace esphome::bmp581_base {
9
10static const uint8_t BMP581_ASIC_ID = 0x50; // BMP581's ASIC chip ID (page 51 of datasheet)
11static const uint8_t BMP585_ASIC_ID = 0x51;
12static const uint8_t RESET_COMMAND = 0xB6; // Soft reset command
13
14// BMP581 Register Addresses
15enum {
16 BMP581_CHIP_ID = 0x01, // read chip ID
17 BMP581_INT_SOURCE = 0x15, // write interrupt sources
19 0x1D, // read measurement registers, 0x1D-0x1F are temperature XLSB to MSB and 0x20-0x22 are pressure XLSB to MSB
20 BMP581_INT_STATUS = 0x27, // read interrupt statuses
21 BMP581_STATUS = 0x28, // read sensor status
22 BMP581_DSP = 0x30, // write sensor configuration
23 BMP581_DSP_IIR = 0x31, // write IIR filter configuration
24 BMP581_OSR = 0x36, // write oversampling configuration
25 BMP581_ODR = 0x37, // write data rate and power mode configuration
26 BMP581_COMMAND = 0x7E // write sensor command
27};
28
29// BMP581 Power mode operations
31 STANDBY_MODE = 0x0, // no active readings
32 NORMAL_MODE = 0x1, // read continuously at ODR configured rate and standby between
33 FORCED_MODE = 0x2, // read sensor once (only reading mode used by this component)
34 NONSTOP_MODE = 0x3 // read continuously with no standby
35};
36
37// Temperature and pressure sensors can be oversampled to reduce noise
48
49// Infinite Impulse Response filter reduces noise caused by ambient disturbances
60
62 public:
63 void dump_config() override;
64
65 void setup() override;
66 void update() override;
67
68 void set_temperature_sensor(sensor::Sensor *temperature_sensor) { this->temperature_sensor_ = temperature_sensor; }
69 void set_pressure_sensor(sensor::Sensor *pressure_sensor) { this->pressure_sensor_ = pressure_sensor; }
70
71 void set_temperature_oversampling_config(Oversampling temperature_oversampling) {
72 this->temperature_oversampling_ = temperature_oversampling;
73 }
74 void set_pressure_oversampling_config(Oversampling pressure_oversampling) {
75 this->pressure_oversampling_ = pressure_oversampling;
76 }
77
78 void set_temperature_iir_filter_config(IIRFilter iir_temperature_level) {
79 this->iir_temperature_level_ = iir_temperature_level;
80 }
81 void set_pressure_iir_filter_config(IIRFilter iir_pressure_level) { this->iir_pressure_level_ = iir_pressure_level; }
82
83 void set_conversion_time(uint8_t conversion_time) { this->conversion_time_ = conversion_time; }
84
85 protected:
86 virtual bool bmp_read_byte(uint8_t a_register, uint8_t *data) = 0;
87 virtual bool bmp_write_byte(uint8_t a_register, uint8_t data) = 0;
88 virtual bool bmp_read_bytes(uint8_t a_register, uint8_t *data, size_t len) = 0;
89 virtual bool bmp_write_bytes(uint8_t a_register, uint8_t *data, size_t len) = 0;
90
91 // Interface activation function. Only used for SPI interface; no-op for I2C.
92 virtual void activate_interface() {}
93
96
99
102
103 // Stores the sensors conversion time needed for a measurement based on oversampling settings and datasheet (page 12)
104 // Computed in Python during codegen
106
107 // Checks if the BMP581 has measurement data ready by checking the sensor's interrupts
109
110 // Flushes the IIR filter and primes an initial reading
111 bool prime_iir_filter_();
112
113 // Reads temperature data from sensor and converts data to measurement in degrees Celsius
114 bool read_temperature_(float &temperature);
115 // Reads temperature and pressure data from sensor and converts data to measurements in degrees Celsius and Pa
117
118 // Soft resets the BMP581
119 bool reset_();
120
121 // Initiates a measurement on sensor by switching to FORCED_MODE
122 bool start_measurement_();
123
124 // Writes the IIR filter configuration to the DSP and DSP_IIR registers
125 bool write_iir_settings_(IIRFilter temperature_iir, IIRFilter pressure_iir);
126
127 // Writes whether to enable the data ready interrupt to the interrupt source register
128 bool write_interrupt_source_settings_(bool data_ready_enable);
129
130 // Writes the oversampling settings to the OSR register
131 bool write_oversampling_settings_(Oversampling temperature_oversampling, Oversampling pressure_oversampling);
132
133 // Sets the power mode on the BMP581 by writing to the ODR register
135
144
145 // BMP581's interrupt source register (address 0x15) to configure which interrupts are enabled (page 54 of datasheet)
146 union {
147 struct {
148 uint8_t drdy_data_reg_en : 1; // Data ready interrupt enable
149 uint8_t fifo_full_en : 1; // FIFO full interrupt enable
150 uint8_t fifo_ths_en : 1; // FIFO threshold/watermark interrupt enable
151 uint8_t oor_p_en : 1; // Pressure data out-of-range interrupt enable
153 uint8_t reg;
154 } int_source_ = {.reg = 0};
155
156 // BMP581's interrupt status register (address 0x27) to determine ensor's current state (page 58 of datasheet)
157 union {
158 struct {
159 uint8_t drdy_data_reg : 1; // Data ready
160 uint8_t fifo_full : 1; // FIFO full
161 uint8_t fifo_ths : 1; // FIFO fhreshold/watermark
162 uint8_t oor_p : 1; // Pressure data out-of-range
163 uint8_t por : 1; // Power-On-Reset complete
165 uint8_t reg;
166 } int_status_ = {.reg = 0};
167
168 // BMP581's status register (address 0x28) to determine if sensor has setup correctly (page 58 of datasheet)
169 union {
170 struct {
171 uint8_t status_core_rdy : 1;
172 uint8_t status_nvm_rdy : 1; // asserted if NVM is ready of operations
173 uint8_t status_nvm_err : 1; // asserted if NVM error
174 uint8_t status_nvm_cmd_err : 1; // asserted if boot command error
175 uint8_t status_boot_err_corrected : 1; // asserted if a boot error has been corrected
176 uint8_t : 2;
177 uint8_t st_crack_pass : 1; // asserted if crack check has executed without detecting a crack
179 uint8_t reg;
180 } status_ = {.reg = 0};
181
182 // BMP581's dsp register (address 0x30) to configure data registers iir selection (page 61 of datasheet)
183 union {
184 struct {
185 uint8_t comp_pt_en : 2; // enable temperature and pressure compensation
186 uint8_t iir_flush_forced_en : 1; // IIR filter is flushed in forced mode
187 uint8_t shdw_sel_iir_t : 1; // temperature data register value selected before or after iir
188 uint8_t fifo_sel_iir_t : 1; // FIFO temperature data register value secected before or after iir
189 uint8_t shdw_sel_iir_p : 1; // pressure data register value selected before or after iir
190 uint8_t fifo_sel_iir_p : 1; // FIFO pressure data register value selected before or after iir
191 uint8_t oor_sel_iir_p : 1; // pressure out-of-range value selected before or after iir
193 uint8_t reg;
194 } dsp_config_ = {.reg = 0};
195
196 // BMP581's iir register (address 0x31) to configure iir filtering(page 62 of datasheet)
197 union {
198 struct {
199 uint8_t set_iir_t : 3; // Temperature IIR filter coefficient
200 uint8_t set_iir_p : 3; // Pressure IIR filter coefficient
202 uint8_t reg;
203 } iir_config_ = {.reg = 0};
204
205 // BMP581's OSR register (address 0x36) to configure Over-Sampling Rates (page 64 of datasheet)
206 union {
207 struct {
208 uint8_t osr_t : 3; // Temperature oversampling
209 uint8_t osr_p : 3; // Pressure oversampling
210 uint8_t press_en : 1; // Enables pressure measurement
212 uint8_t reg;
213 } osr_config_ = {.reg = 0};
214
215 // BMP581's odr register (address 0x37) to configure output data rate and power mode (page 64 of datasheet)
216 union {
217 struct {
218 uint8_t pwr_mode : 2; // power mode of sensor
219 uint8_t odr : 5; // output data rate
220 uint8_t deep_dis : 1; // deep standby disabled if asserted
222 uint8_t reg;
223 } odr_config_ = {.reg = 0};
224};
225
226} // namespace esphome::bmp581_base
BedjetMode mode
BedJet operating mode.
This class simplifies creating components that periodically check a state.
Definition component.h:589
bool read_temperature_(float &temperature)
union esphome::bmp581_base::BMP581Component::@42 iir_config_
bool write_interrupt_source_settings_(bool data_ready_enable)
void set_temperature_sensor(sensor::Sensor *temperature_sensor)
Definition bmp581_base.h:68
void set_temperature_oversampling_config(Oversampling temperature_oversampling)
Definition bmp581_base.h:71
bool write_oversampling_settings_(Oversampling temperature_oversampling, Oversampling pressure_oversampling)
virtual bool bmp_read_byte(uint8_t a_register, uint8_t *data)=0
void set_conversion_time(uint8_t conversion_time)
Definition bmp581_base.h:83
virtual bool bmp_read_bytes(uint8_t a_register, uint8_t *data, size_t len)=0
union esphome::bmp581_base::BMP581Component::@41 dsp_config_
bool write_iir_settings_(IIRFilter temperature_iir, IIRFilter pressure_iir)
struct esphome::bmp581_base::BMP581Component::@38::@45 bit
union esphome::bmp581_base::BMP581Component::@39 int_status_
union esphome::bmp581_base::BMP581Component::@38 int_source_
virtual bool bmp_write_bytes(uint8_t a_register, uint8_t *data, size_t len)=0
union esphome::bmp581_base::BMP581Component::@44 odr_config_
union esphome::bmp581_base::BMP581Component::@40 status_
enum esphome::bmp581_base::BMP581Component::ErrorCode NONE
void set_pressure_sensor(sensor::Sensor *pressure_sensor)
Definition bmp581_base.h:69
virtual bool bmp_write_byte(uint8_t a_register, uint8_t data)=0
void set_pressure_iir_filter_config(IIRFilter iir_pressure_level)
Definition bmp581_base.h:81
void set_pressure_oversampling_config(Oversampling pressure_oversampling)
Definition bmp581_base.h:74
bool read_temperature_and_pressure_(float &temperature, float &pressure)
void set_temperature_iir_filter_config(IIRFilter iir_temperature_level)
Definition bmp581_base.h:78
bool write_power_mode_(OperationMode mode)
union esphome::bmp581_base::BMP581Component::@43 osr_config_
Base-class for all sensors.
Definition sensor.h:47
std::string size_t len
Definition helpers.h:1045
uint16_t temperature
Definition sun_gtil2.cpp:12
uint8_t pressure
Definition tt21100.cpp:7