V2.3.6 - BMP581 pressure sensor driver
What's new
Adds a native ESP-IDF driver for the Bosch BMP581 6th-generation
barometric pressure sensor, slotted into env_sensor as the
highest-priority pressure source.
Why
BMP581 lives at I2C address 0x46/0x47 -- completely independent of the
0x77 Bosch family (BMP390 / BME688 / BME280) that fight for one slot --
so it can coexist with any of them on the same bus. Combined with the
factory-trimmed digital output (no NVM coefficient dance), it delivers
+/-0.4 Pa relative accuracy at 0.21 PaRMS noise, which is roughly 3x
quieter than BME280 in the same enclosure.
What it adds
- New
main/bmp581.[ch]-- ~150 LOC, parallel tobmp390.c. Probes
0x46 (Adafruit #6407 default) first, falls back to 0x47 (SparkFun
default). Verifies chip ID 0x50 and rejects 0x51 (BMP585, a different
Bosch product) with a wrong-part warning. - Operating profile: pressure x16 oversampling, temperature x1, IIR
BYPASS, FORCED mode. Matches Bosch's "high resolution" preset
(datasheet Table 9) and ESPHome's documented default. Conversion wait
is 12 ms (ESPHome'sceil(1.05 * (tconv_p + tconv_t))formula). env_sensor_read()priority chain: SHT45 > BMP581 > BMP390 >
BME688 > BME280. New combo name "SHT45+BMP581" exposed via
env_sensor_name().- Auto DEEP_STANDBY (0.55 uA) between forced cycles -- our flag set
(forced + IIR bypass + FIFO off + ODR<5Hz) qualifies for it.
What it does NOT change
- DSP_CONFIG (0x30) and DSP_IIR (0x31) reset values are already exactly
what we need (P+T compensation enabled, IIR bypassed both channels),
so the driver doesn't touch them -- saves two writes per init. - Sensor.community / Madavi / openSenseMap / aqi.eco upload paths are
agnostic to which Bosch chip supplied the pressure; existing payload
builders work unchanged.
Build sizes
- heltec_v2: 1,178,752 bytes (+~3 KB vs V2.3.5)
- feathers3_d: 1,181,296 bytes (+~3 KB vs V2.3.5)
Hardware target
Tested against the Adafruit BMP581 breakout board #6407 (3.3 V regulator,
level shifter, STEMMA QT) connected via the J_I2C/Qwiic bus. Default
0x46 address; SparkFun's 0x47 default also works without configuration
change.
Artefacts (5 per board, 10 total)
| File | Purpose |
|---|---|
geiger_v2_<board>.bin |
OTA image |
geiger_v2_merged_<board>.bin |
Full-flash image (initial cable flash) |
bootloader_<board>.bin |
Bootloader |
partition-table_<board>.bin |
Partition table |
ota_data_initial_<board>.bin |
OTA selector seed |