Documentation

BMP180 I2C IIC Digital Atmospheric Pressure, Temperature, Altitude Sensor
Documentation / BMP180 I2C IIC Digital Atmospheric Pressure, Temperature, Altitude Sensor

BMP180 I2C IIC Digital Atmospheric Pressure, Temperature, Altitude Sensor

Overview

The BMP180 is the classic digital atmospheric pressure and temperature sensor from Bosch — the predecessor to the BMP280 and BME280. It uses I2C, runs on 3.3V or 5V (with on-board level shifting), and delivers ±0.5 hPa pressure accuracy and ±1°C temperature accuracy in a tiny 5-pin breakout.

The BMP180 is most commonly used for altimetry — drones, weather stations, and altitude-aware projects. With 0.06 hPa resolution, you can detect altitude changes as small as half a meter — enough for detecting which floor you're on indoors, drone height-hold, or simple barometric weather forecasting.

This pre-soldered breakout exposes VCC, GND, SCL, SDA, and 3.3V (already-regulated 3.3V output for chaining sensors). Default I2C address is 0x77. Drop-in compatible with the original Adafruit_BMP085 library, which despite the name supports the BMP180 too.

At a Glance

Operating Voltage
3.3V - 5V
Pressure Range
300 - 1100 hPa
Pressure Accuracy
± 0.5 hPa
Interface
I2C
I2C Address
0x77
Pin Count
5 pins

Specifications

Parameter Value
Sensor IC Bosch BMP180
Operating Voltage 3.3V or 5V (on-board regulator)
Operating Current 5 µA @ 1 Hz, 12 µA @ ultra-low-power mode
Pressure Range 300 - 1100 hPa (≈ +9000 m to -500 m altitude)
Pressure Resolution 0.01 hPa (≈ 0.17 m altitude)
Pressure Accuracy ± 0.5 hPa (relative), ± 2 hPa (absolute)
Temperature Range -40°C to +85°C
Temperature Accuracy ± 1.0°C
Communication I2C (up to 3.4 MHz)
I2C Address 0x77 (fixed)
Pin Count 5 (VCC, GND, SCL, SDA, 3.3V output)
Module Dimensions ~14 × 12 mm

Pinout Diagram

BMP180 atmospheric pressure and temperature sensor pinout diagram showing the five pins: VCC (3.3V or 5V power), GND (ground), SCL (I2C clock), SDA (I2C data), and 3.3V (regulated 3.3V output)

Wiring Guide

Arduino Wiring (I2C)

Standard I2C wiring. The breakout has on-board pull-ups, so no external resistors needed.

BMP180 Pin Arduino Pin
VCC 5V
GND GND
SCL A5 (SCL)
SDA A4 (SDA)
3.3V Not connected (regulator output)

ESP32 Wiring (I2C)

ESP32 default I2C is on GPIO 21 (SDA) and GPIO 22 (SCL).

BMP180 Pin ESP32 Pin
VCC 3.3V
GND GND
SCL GPIO 22
SDA GPIO 21

Raspberry Pi Wiring (I2C)

Enable I2C in raspi-config. Default I2C is BCM 2 (SDA) and BCM 3 (SCL).

BMP180 Pin Raspberry Pi Pin
VCC Pin 1 (3.3V)
GND Pin 6 (GND)
SCL Pin 5 (BCM 3)
SDA Pin 3 (BCM 2)
Tip: Verify with i2cdetect -y 1. You should see 0x77.

Raspberry Pi Pico Wiring (I2C)

Default I2C0 on Pico: SDA on GP4, SCL on GP5.

BMP180 Pin Pico Pin
VCC 3V3
GND GND
SCL GP5
SDA GP4

Code Examples

Arduino — Adafruit BMP085/BMP180 Library

bmp180_arduino.ino
// BMP180 - Arduino Example
// Library: Adafruit BMP085 Unified library (works for BMP085 and BMP180)

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);

void setup() {
  Serial.begin(9600);
  if (!bmp.begin()) {
    Serial.println("BMP180 not found!");
    while (1) {}
  }
}

void loop() {
  sensors_event_t event;
  bmp.getEvent(&event);

  if (event.pressure) {
    Serial.print("Pressure: "); Serial.print(event.pressure); Serial.println(" hPa");

    float temperature;
    bmp.getTemperature(&temperature);
    Serial.print("Temp: "); Serial.print(temperature); Serial.println(" C");

    float seaLevelPressure = 1013.25;
    Serial.print("Altitude: ");
    Serial.print(bmp.pressureToAltitude(seaLevelPressure, event.pressure));
    Serial.println(" m");
  }
  Serial.println();
  delay(1000);
}

Raspberry Pi (Python)

bmp180_rpi.py
#!/usr/bin/env python3
# BMP180 - Raspberry Pi Python Example
# Install: sudo pip3 install adafruit-circuitpython-bmp085

import time
import board
import adafruit_bmp085

i2c = board.I2C()
bmp = adafruit_bmp085.Adafruit_BMP085(i2c)

while True:
    print(f"Temp:     {bmp.temperature:.2f} C")
    print(f"Pressure: {bmp.pressure:.2f} hPa")
    print(f"Altitude: {bmp.altitude:.2f} m\n")
    time.sleep(1)

Raspberry Pi Pico (MicroPython)

bmp180_pico.py
# BMP180 - Pico MicroPython
# Library: bmp180.py from Sebastian Wallkoetter (search GitHub).

from machine import Pin, I2C
from bmp180 import BMP180
import time

i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400_000)
bmp = BMP180(i2c)
bmp.oversample_sett = 2
bmp.baseline = 101325   # sea-level pressure in Pa

while True:
    print("Temp:     {:.2f} C".format(bmp.temperature))
    print("Pressure: {:.2f} hPa".format(bmp.pressure / 100))
    print("Altitude: {:.2f} m\n".format(bmp.altitude))
    time.sleep(1)

Frequently Asked Questions

What's the I2C address?
0x77, fixed. Unlike the BMP280 you can't change it. If you need two pressure sensors on the same I2C bus, use one BMP180 and one BMP280, or use an I2C multiplexer like the TCA9548A.
BMP180 or BMP280 — which should I get?
BMP280 is newer and slightly better: ± 0.12 hPa relative accuracy (vs ± 0.5 hPa), lower power, supports SPI as well as I2C. The BMP180 is older but well-supported in legacy libraries. If you're starting fresh, prefer the BMP280. If you have BMP180 code already, this module is a good drop-in.
How do I calculate altitude?
The library converts pressure to altitude using the international barometric formula. For absolute altitude (compared to sea level) you need to know the local sea-level pressure today, which you can get from a weather report (typical = 1013.25 hPa). For relative altitude (your starting point as zero), measure once at startup and subtract that baseline from later readings.
Why are my altitude readings drifting?
Air pressure changes naturally with weather — typical daily variation is 5-10 hPa, equivalent to ± 50-90 m of apparent altitude shift. For absolute altitude, recalibrate every few hours against a known reference. For drone height-hold and similar short-time-scale uses, the relative reading is fine.
Can I run it at 5V?
Yes. The breakout has an on-board 3.3V regulator and level shifters for SDA and SCL, so connecting to a 5V Arduino is safe. Power VCC with 3.3V or 5V — both work.
Does it measure humidity?
No. BMP180 measures only pressure and temperature. For humidity too, you need the BME280 (which is a BMP280 + humidity sensor) or pair this with a separate DHT22.
What library should I use?
Arduino: Adafruit_BMP085 Unified (despite the name, it works with the BMP180). Raspberry Pi: adafruit-circuitpython-bmp085. MicroPython: bmp180 by Sebastian Wallkoetter or other community libraries — search GitHub for "micropython bmp180".

Related Tutorials