BMP180
A Bosch BMP180 breakout that measures barometric pressure and temperature over I2C, for weather stations and altimeters.
- Chip supplyVDD 1.8 V to 3.6 V, VDDIO 1.62 V to 3.6 V
- Absolute maximum-0.3 V to 4.25 V on all pins
- I2C address0x77 (0xEE write, 0xEF read), fixed; chip ID 0x55 in register 0xD0
- I2C clockUp to 3.4 MHz

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).
BMP180 pinout
| Pin | Function | Type |
|---|---|---|
| VIN | VIN3.3 V to 5 V | power in |
| 3Vo | 3Vo3.3 V | power out |
| GND | GND | power in |
| SCL | I2C SCL3.3 V or 5 V logic | input |
| SDA | I2C SDA3.3 V or 5 V logic | bidirectional |
How to wire the BMP180
Pin by pin, for the board you have.
| BMP180 | Arduino Uno | Note |
|---|---|---|
| VIN | 5V | |
| GND | GND | |
| SCL | A5 | |
| SDA | A4 |
- 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.
| BMP180 | ESP32 DevKit V1 | Note |
|---|---|---|
| VIN | 3V3 | |
| GND | GND | |
| SCL | GPIO22 (D22) | |
| SDA | GPIO21 (D21) |
- 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.
| BMP180 | Raspberry Pi Pico | Note |
|---|---|---|
| VIN | 3V3(OUT) | |
| GND | GND | |
| SCL | GP5 | |
| SDA | GP4 |
- Use 3V3(OUT), not VBUS, so the I2C lines can never reach 5 V on the Pico.
BMP180 code
Every example here compiles for its board.
// 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// 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// 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-30Before you wire it
- Check for the regulator before powering from 5 V: the chip's absolute maximum is 4.25 V (datasheet, p. 8).
- 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).
- Plan for one sensor per bus: the address 0x77 is fixed (p. 20).
- 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.
- 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).
Specifications
- Chip supply
- VDD 1.8 V to 3.6 V, VDDIO 1.62 V to 3.6 VBosch BMP180 datasheet rev 2.5 (BST-BMP180-DS000-09), p. 6
- Absolute maximum
- -0.3 V to 4.25 V on all pinsBosch BMP180 datasheet rev 2.5 (BST-BMP180-DS000-09), p. 8
- I2C address
- 0x77 (0xEE write, 0xEF read), fixed; chip ID 0x55 in register 0xD0Bosch BMP180 datasheet rev 2.5 (BST-BMP180-DS000-09), pp. 18, 20
- I2C clock
- Up to 3.4 MHzBosch 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 °CBosch 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 resolutionBosch 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 standbyBosch 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 logicAdafruit BMP085/BMP180 guide (PDF), pp. 3, 6
From the BMP180 data sheet rev 2.5 (BST-BMP180-DS000-09), published by Bosch Sensortec.
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.
BMP180 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.
Build something with the BMP180
- Build this
Pocket barometer
Show pressure and a rising or falling trend arrow on an LCD.
- Build this
Stair altimeter
Zero at the ground floor and count the floors you climb.
- Build this
Weather logger
Log temperature and pressure every ten minutes over USB.
This page as plain Markdown, for ChatGPT, Claude or your own agent. /components/bmp180.md