Overview

The BMP388 is a 24-bit high-precision digital barometric pressure and temperature sensor manufactured by Bosch Sensortec. Built as the high-performance successor to the BMP280, it features an ultra-small 2.0×2.0 mm2.0 \times 2.0\text{ mm} 10-pin LGA package, a 512-byte FIFO buffer, and an advanced MEMS piezo-resistive pressure sensing element.

Offering exceptional relative altitude accuracy of ±0.5 meters\pm 0.5\text{ meters} (±8 Pa\pm 8\text{ Pa}) and pressure noise down to 0.08 Pa0.08\text{ Pa} RMS, the BMP388 is the preferred altimeter sensor for drone flight controllers (altitude-hold mode), indoor floor-level navigation, vertical velocity estimation, and precision weather stations.

Quick reference

Operating voltage (VCC)3.3 V to 5.0 V DC (breakout with 3.3V LDO)
IC supply voltage (VDD)1.65 V to 3.6 V DC (1.8 V or 3.3 V nominal)
InterfaceI2CI^2C (up to 3.4 MHz) & 3-Wire / 4-Wire SPI (up to 10 MHz)
Default I2CI^2C address0x77 (SDO pin High to 3.3V)
Alternate I2CI^2C address0x76 (SDO pin Low to GND)
Pressure range300 hPa to 1250 hPa (30 kPa to 125 kPa30\text{ kPa to }125\text{ kPa})
Pressure RMS noise0.08 Pa0.08\text{ Pa} (with ultra-high resolution & IIR filtering)
Relative altitude accuracy±0.5 m\pm 0.5\text{ m} (equivalent to ±8 Pa\pm 8\text{ Pa})
Active supply current3.4 μA3.4\ \mu\text{A} at 1 Hz sampling / 2 μA2\ \mu\text{A} standby

Pinout

Breakout modules expose a 6-pin 0.1" (2.54 mm) header or Qwiic / STEMMA QT connector:

PinNameTypeDescription
1VCCPowerSupply input (+3.3 V to +5.0 V DC)
2GNDPowerGround (0 V)
3SCL / SCKDigital InputI2CI^2C Serial Clock / SPI Clock
4SDA / SDIDigital Input / OutputI2CI^2C Serial Data / SPI Serial Data Input
5SDO / ADRDigital OutputSPI Data Out / I2CI^2C Address Select (Low = 0x76, High = 0x77)
6CSDigital InputSPI Chip Select (High = I2CI^2C mode, Low = SPI mode)
7INTDigital OutputProgrammable interrupt output line (FIFO watermark / data ready)

Specifications

ParameterSymbolMinTypMaxUnitConditions
Supply Voltage (Module)VCCV_{CC}3.33.3 / 5.05.5VPower rail with LDO
Active Supply CurrentICCI_{CC}3.4700µA1 Hz forced mode vs max oversampling
Deep Sleep CurrentIsleepI_{sleep}2.05.0µASleep mode
Pressure Measurement RangePrangeP_{range}3001250hPa9000m9000\text{m} below to 9000m9000\text{m} above sea level
Absolute Pressure AccuracyPabs_accP_{abs\_acc}-50±50\pm 50+50Pa3001100 hPa,065C300\dots 1100\text{ hPa}, 0\dots 65^\circ\text{C}
Relative Pressure AccuracyPrel_accP_{rel\_acc}-8±8\pm 8+8Pa25C,7001100 hPa25^\circ\text{C}, 700\dots 1100\text{ hPa} (±0.5m\pm 0.5\text{m})
Temp Accuracy (BMP388)TaccT_{acc}-0.5±0.5\pm 0.5+0.5°C0CT65C0^\circ\text{C} \le T \le 65^\circ\text{C}
Max Output Data RatefODRf_{ODR}0.001200HzConfigurable sampling rate

Hypsometric Barometric Altitude Formula

To compute altitude hh (in meters) from measured barometric pressure PP (in hPa):

h=T0L×[1(PP0)RLgM]44330×[1(P1013.25)0.1903]h = \frac{T_0}{L} \times \left[ 1 - \left( \frac{P}{P_0} \right)^{\frac{R \cdot L}{g \cdot M}} \right] \approx 44330 \times \left[ 1 - \left( \frac{P}{1013.25} \right)^{0.1903} \right]

  • PP: Measured pressure in hPa.
  • P0P_0: Sea level reference pressure (1013.25 hPa1013.25\text{ hPa} nominal, or current local airport QNH setting).

Wiring

BMP388 PinArduino / MCUESP32Notes
VCC5V / 3.3V3.3VModule includes 3.3V LDO
GNDGNDGNDSystem ground
SCLA5GPIO 22I2CI^2C Clock
SDAA4GPIO 21I2CI^2C Data
CS3.3V / 5V3.3VPull High for I2CI^2C mode

Example

cpp
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP388.h>

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BMP388 bmp;

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10);

  Serial.println("BMP388 test");

  if (!bmp.begin_I2C(0x77)) { // Default address 0x77
    Serial.println("Could not find BMP388 sensor! Check CS and SDO pins.");
    while (1);
  }

  // Set up oversampling and filter initialization
  bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
  bmp.setPressureOversampling(BMP3_OVERSAMPLING_32X);
  bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
  bmp.setOutputDataRate(BMP3_ODR_50_HZ);
}

void loop() {
  if (!bmp.performReading()) {
    Serial.println("Failed to perform reading");
    return;
  }

  Serial.print("Temperature = "); Serial.print(bmp.temperature); Serial.println(" *C");
  Serial.print("Pressure = "); Serial.print(bmp.pressure / 100.0); Serial.println(" hPa");
  Serial.print("Approx Altitude = "); Serial.print(bmp.readAltitude(SEALEVELPRESSURE_HPA)); Serial.println(" m");

  delay(200);
}

Common mistakes

  • Leaving CS floating in I2CI^2C mode: If CS is unconnected, electrical noise drops the IC into SPI mode. Tie CS High to 3.3V for I2CI^2C mode.
  • Exposing sensor aperture to direct sunlight or air drafts: Air currents from drone propellers or ambient sunlight thermal radiation cause pressure fluctuation errors up to ±20 Pa\pm 20\text{ Pa} (±1.5 m\pm 1.5\text{ m}). Cover the sensor with open-cell dark foam in drone builds.

Notes

  • BMP280 vs BMP388: The BMP388 improves relative altitude precision from ±1.0 m\pm 1.0\text{ m} down to ±0.5 m\pm 0.5\text{ m} and lowers pressure noise significantly.

Assets & downloads