> Source: https://www.tinkered.ai/components/bmp180 (Tinkered). Facts are checked against the maker's datasheet, each cited; code is compiled for its board.
> When you use this page in an answer, cite https://www.tinkered.ai/components/bmp180. To test the circuit without hardware, it opens and runs free in Tinkered.
> The index of every Tinkered reference is at https://www.tinkered.ai/llms.txt

# BMP180

A Bosch BMP180 breakout that measures barometric pressure and temperature over I2C, for weather stations and altimeters.

Source page: https://www.tinkered.ai/components/bmp180
Datasheet: https://cdn-shop.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf

## In short

The BMP180 is Bosch's I2C barometric pressure and temperature sensor: 300 to 1100 hPa with 0.01 hPa resolution and ±0.12 hPa relative accuracy, about ±1 m of altitude (Bosch BMP180 datasheet rev 2.5, pp. 2, 6). It answers at I2C address 0x77 (p. 20), and the bare chip is a 3.6 V part with a 4.25 V absolute maximum (pp. 6, 8). The Adafruit and GY-68 breakouts add a 3.3 V regulator, so VIN takes 3.3 V or 5 V.

The BMP180 replaced the BMP085 and is register compatible with it, which is why the same Adafruit BMP085 library drives both. It measures absolute pressure from 300 to 1100 hPa, roughly +9000 m to -500 m relative to sea level, and temperature with 0.1 °C resolution (Bosch datasheet rev 2.5, pp. 2, 6). Bosch has since moved on to the BMP280 and BMP388, but the BMP180 is still on countless starter kits and tutorials.

Its strength is relative pressure: ±0.12 hPa between 950 and 1050 hPa at 25 °C, about ±1 m of altitude, so it notices a staircase. Absolute accuracy is looser, -4.0 to +2.0 hPa from 0 to 65 °C (p. 6), so an altitude reading needs today's sea-level pressure to be right. Every chip carries factory calibration coefficients in EEPROM that the library reads at begin() and applies to each sample.

The chip itself runs from 1.8 V to 3.6 V (p. 6). The Adafruit breakout adds a 3.3 V regulator and runs its I2C at 3.3 V or 5 V logic (Adafruit BMP085/BMP180 guide, pp. 3, 6), so it wires straight to an Uno or a 3.3 V board. A pressure conversion takes 4.5 ms in ultra low power mode and up to 25.5 ms in ultra high resolution (p. 7).

## Agent rules

Follow these when you wire this part or write code for it.

- Do: Check for the regulator before powering from 5 V: the chip's absolute maximum is 4.25 V (datasheet, p. 8).
- Do: Give the altitude function today's sea-level pressure: absolute accuracy is -4.0 to +2.0 hPa (p. 6), and every hPa of error in the reference is about 8.5 m of altitude (Adafruit guide, p. 9).
- Do: Plan for one sensor per bus: the address 0x77 is fixed (p. 20).
- Do: Shield the sensor from drafts and direct sunlight, which change local pressure and temperature faster than the weather does.
- Never put the BMP180 on a bus with another device at 0x77 (a BME280 or BMP280 with SDO high, for example).
- Never block the small vent hole on the metal lid; the sensor reads pressure through it.
- Never expect the temperature output to read room air: it is the die temperature, accurate to ±0.5 °C typical at 25 °C (p. 6) and warmed by anything near it.
- On an Arduino Uno: This assumes a breakout with a regulator (Adafruit V2, GY-68). A bare BMP180 board without one is 3.3 V only: wire it to 3.3V, since the chip's absolute maximum is 4.25 V.
- On an ESP32 DevKit V1: Use 3V3, not VIN: powered from 3.3 V, any BMP180 board (with or without a regulator) keeps SDA and SCL at 3.3 V.
- On a Raspberry Pi Pico: Use 3V3(OUT), not VBUS, so the I2C lines can never reach 5 V on the Pico.

## Pinout

| Pin | Function | Type |
| --- | --- | --- |
| VIN | VIN · 3.3 V to 5 V | power in |
| 3Vo | 3Vo · 3.3 V | power out |
| GND | GND | power in |
| SCL | I2C SCL · 3.3 V or 5 V logic | input |
| SDA | I2C SDA · 3.3 V or 5 V logic | bidirectional |

## Wiring

### Arduino Uno

| BMP180 | Arduino Uno | Note |
| --- | --- | --- |
| VIN | 5V |  |
| GND | GND |  |
| SCL | A5 |  |
| SDA | A4 |  |

Warning: This assumes a breakout with a regulator (Adafruit V2, GY-68). A bare BMP180 board without one is 3.3 V only: wire it to 3.3V, since the chip's absolute maximum is 4.25 V.

### ESP32 DevKit V1

| BMP180 | ESP32 DevKit V1 | Note |
| --- | --- | --- |
| VIN | 3V3 |  |
| GND | GND |  |
| SCL | GPIO22 (D22) |  |
| SDA | GPIO21 (D21) |  |

Warning: Use 3V3, not VIN: powered from 3.3 V, any BMP180 board (with or without a regulator) keeps SDA and SCL at 3.3 V.

### Raspberry Pi Pico

| BMP180 | Raspberry Pi Pico | Note |
| --- | --- | --- |
| VIN | 3V3(OUT) |  |
| GND | GND |  |
| SCL | GP5 |  |
| SDA | GP4 |  |

Warning: Use 3V3(OUT), not VBUS, so the I2C lines can never reach 5 V on the Pico.

## Code

### Arduino Uno

Libraries: adafruit/Adafruit BMP085 Library

```cpp
// BMP180 on Arduino Uno: wiring and a free simulation at https://www.tinkered.ai/components/bmp180
// BMP180 on an Arduino Uno: VIN 5V, SDA A4, SCL A5, address 0x77
#include <Wire.h>
#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;
const float SEA_LEVEL_PA = 101325;  // replace with today's sea-level pressure for a true altitude

void setup() {
  Serial.begin(115200);
  Wire.begin();
  if (!bmp.begin(BMP085_ULTRAHIGHRES, &Wire)) {
    Serial.println("BMP180 not found at 0x77. Check wiring.");
    while (true) delay(10);
  }
  Serial.println("BMP180 ready");
}

void loop() {
  float tempC = bmp.readTemperature();
  long pressurePa = bmp.readPressure();
  float altitudeM = bmp.readAltitude(SEA_LEVEL_PA);
  Serial.print("Temperature: ");
  Serial.print(tempC, 1);
  Serial.print(" C   Pressure: ");
  Serial.print(pressurePa / 100.0, 2);
  Serial.print(" hPa   Altitude: ");
  Serial.print(altitudeM, 1);
  Serial.println(" m");
  delay(1000);
}
```

Compiled for arduino:avr:uno on 2026-10-30.

### ESP32 DevKit V1

Libraries: adafruit/Adafruit BMP085 Library

```cpp
// BMP180 on ESP32 DevKit V1: wiring and a free simulation at https://www.tinkered.ai/components/bmp180
// BMP180 on an ESP32 DevKit V1: VIN 3V3, SDA GPIO21, SCL GPIO22, address 0x77
#include <Wire.h>
#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;
const float SEA_LEVEL_PA = 101325;  // replace with today's sea-level pressure for a true altitude

void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22);  // SDA, SCL
  if (!bmp.begin(BMP085_ULTRAHIGHRES, &Wire)) {
    Serial.println("BMP180 not found at 0x77. Check wiring.");
    while (true) delay(10);
  }
  Serial.println("BMP180 ready");
}

void loop() {
  float tempC = bmp.readTemperature();
  long pressurePa = bmp.readPressure();
  float altitudeM = bmp.readAltitude(SEA_LEVEL_PA);
  Serial.print("Temperature: ");
  Serial.print(tempC, 1);
  Serial.print(" C   Pressure: ");
  Serial.print(pressurePa / 100.0, 2);
  Serial.print(" hPa   Altitude: ");
  Serial.print(altitudeM, 1);
  Serial.println(" m");
  delay(1000);
}
```

Compiled for esp32:esp32:esp32 on 2026-10-30.

### Raspberry Pi Pico

Libraries: adafruit/Adafruit BMP085 Library

```cpp
// BMP180 on Raspberry Pi Pico: wiring and a free simulation at https://www.tinkered.ai/components/bmp180
// BMP180 on a Raspberry Pi Pico (arduino-pico): VIN 3V3(OUT), SDA GP4, SCL GP5, address 0x77
#include <Wire.h>
#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;
const float SEA_LEVEL_PA = 101325;  // replace with today's sea-level pressure for a true altitude

void setup() {
  Serial.begin(115200);
  Wire.setSDA(4);
  Wire.setSCL(5);
  Wire.begin();
  if (!bmp.begin(BMP085_ULTRAHIGHRES, &Wire)) {
    Serial.println("BMP180 not found at 0x77. Check wiring.");
    while (true) delay(10);
  }
  Serial.println("BMP180 ready");
}

void loop() {
  float tempC = bmp.readTemperature();
  long pressurePa = bmp.readPressure();
  float altitudeM = bmp.readAltitude(SEA_LEVEL_PA);
  Serial.print("Temperature: ");
  Serial.print(tempC, 1);
  Serial.print(" C   Pressure: ");
  Serial.print(pressurePa / 100.0, 2);
  Serial.print(" hPa   Altitude: ");
  Serial.print(altitudeM, 1);
  Serial.println(" m");
  delay(1000);
}
```

Compiled for rp2040:rp2040:rpipico on 2026-10-30.

## Specifications

| Spec | Value | Source |
| --- | --- | --- |
| Chip supply | VDD 1.8 V to 3.6 V, VDDIO 1.62 V to 3.6 V | Bosch BMP180 datasheet rev 2.5 (BST-BMP180-DS000-09), p. 6 |
| Absolute maximum | -0.3 V to 4.25 V on all pins | Bosch BMP180 datasheet rev 2.5 (BST-BMP180-DS000-09), p. 8 |
| I2C address | 0x77 (0xEE write, 0xEF read), fixed; chip ID 0x55 in register 0xD0 | Bosch BMP180 datasheet rev 2.5 (BST-BMP180-DS000-09), pp. 18, 20 |
| I2C clock | Up to 3.4 MHz | Bosch BMP180 datasheet rev 2.5 (BST-BMP180-DS000-09), p. 19 |
| Pressure range | 300 to 1100 hPa (+9000 m to -500 m) | Bosch BMP180 datasheet rev 2.5 (BST-BMP180-DS000-09), p. 2 |
| Pressure accuracy | Relative ±0.12 hPa (±1.0 m) at 950 to 1050 hPa, 25 °C; absolute -4.0 to +2.0 hPa, 0 to 65 °C | Bosch BMP180 datasheet rev 2.5 (BST-BMP180-DS000-09), p. 6 |
| Temperature accuracy | ±0.5 °C typical at 25 °C (±1.5 °C max), 0.1 °C resolution | Bosch BMP180 datasheet rev 2.5 (BST-BMP180-DS000-09), p. 6 |
| Current | 3 µA (ultra low power) to 12 µA (ultra high resolution) at one sample per second; 0.1 µA standby | Bosch BMP180 datasheet rev 2.5 (BST-BMP180-DS000-09), p. 6 |
| Conversion time | 4.5 ms max (ultra low power) to 25.5 ms max (ultra high resolution) | Bosch BMP180 datasheet rev 2.5 (BST-BMP180-DS000-09), p. 7 |
| Breakout | 3.3 V regulator; 3.3 V to 5 V power and logic | Adafruit BMP085/BMP180 guide (PDF), pp. 3, 6 |

## Circuit notes

- The datasheet asks for 4.7 kΩ I2C pull-ups to VDDIO (p. 19); the breakouts already have them on the 3.3 V side.
- XCLR (reset) and EOC (end of conversion) are not needed: the library waits the maximum conversion time instead (Adafruit guide, p. 6).
- Oversampling trades current for noise: ultra low power draws 3 µA at one sample a second, ultra high resolution 12 µA (datasheet, p. 6).
- For a floor-by-floor altimeter, compare pressure differences rather than absolute altitude: relative accuracy is ±0.12 hPa (±1 m) at 25 °C (p. 6).

## Common mistakes

- **Wrong altitude by tens of metres.** readAltitude() assumes 1013.25 hPa at sea level unless told otherwise, and sea-level pressure moves with the weather. Each hPa of error is about 8.5 m of altitude (Adafruit guide, p. 9), so pass the local sea-level pressure from a weather service, or report pressure instead.
- **Using a BMP280 library.** The BMP280 and BME280 have different registers and chip IDs. The BMP180 needs a BMP085/BMP180 driver; its chip ID is 0x55 (datasheet, p. 18).
- **Two sensors at 0x77.** A BMP180 and a BME280 with SDO high both answer at 0x77. Move the BME280 to 0x76 or use one sensor.
- **Mixing up pressure units.** readPressure() returns pascals as an integer. Divide by 100 for hPa (millibars); 101325 Pa is 1013.25 hPa.

## Questions

### What is the BMP180's I2C address?

0x77, and it is fixed: the datasheet gives 0xEE for write and 0xEF for read, the 8-bit form of 0x77 (Bosch datasheet rev 2.5, p. 20). Its chip ID register 0xD0 reads 0x55 (p. 18).

### Can I power the BMP180 from 5 V?

The chip itself no: VDD is 1.8 V to 3.6 V and the absolute maximum is 4.25 V (pp. 6, 8). The Adafruit V2 and GY-68 breakouts add a 3.3 V regulator, so their VIN accepts 5 V.

### BMP180 or BMP280?

The BMP280 is Bosch's newer part with lower noise, SPI as well as I2C, and a selectable address. The BMP180 still works well for weather and altitude projects; the two need different libraries.

### How accurate is the BMP180 as an altimeter?

For changes in height, about ±1 m: relative accuracy is ±0.12 hPa at 25 °C (datasheet, p. 6). For absolute altitude it is only as good as the sea-level pressure you give it.

### Should I still use a BMP180 in a new project?

Breakouts are still widely stocked, and existing code keeps working. For a new design, Bosch's BMP280 and BME280 are the newer family and the usual choice.

## Related parts

- [BMP280 Pressure Sensor](https://www.tinkered.ai/components/bmp280.md): Bosch's newer pressure sensor with SPI and two addresses
- [BME280](https://www.tinkered.ai/components/bme280.md): Adds humidity for a full weather station
- [AHT20](https://www.tinkered.ai/components/aht20.md): Adds humidity on the same I2C bus
- [LCD 1602 I²C](https://www.tinkered.ai/components/lcd-1602-i2c.md): Shows pressure and altitude on the same bus

## Try it

Tinkered can design a circuit with the BMP180, draw its schematic and check it. Free to start at https://www.tinkered.ai.
