Skip to content

V2.3.6 - BMP581 pressure sensor driver

Choose a tag to compare

@MMBytes MMBytes released this 08 May 22:38
· 340 commits to main since this release

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 to bmp390.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's ceil(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