ESP32 · BMP280

ESP32 BMP280 Simulator: Wiring, Code and a Live Circuit

This is a BMP280 barometric pressure and temperature sensor wired to an ESP32 DevKit over I2C, read live with the Adafruit BMP280 library: temperature, pressure and altitude once a second.

Four wires: 3.3 V, GND, SDA to GPIO 21 (D21) and SCL to GPIO 22 (D22). In the editor, drag the sensor’s pressure slider and the altitude moves with it.

  • 3.3 V logic
  • Library: Adafruit_BMP280.h
  • I2C address 0x76
  • SDA 21, SCL 22
ESP32 · BMP280live0.000 s 0.00x
Click to open it in the editor
The circuit itself, running on the simulator with the sketch below. Press what can be pressed; click anything else to open it in the editor.

Wiring the BMP280 to the ESP32

Every connection in the circuit above, with the board’s own pin names.

BMP280 pinESP32 pinWhy
VIN3V3The BMP280 chip is a 3.3 V part; many breakouts have no regulator.
GNDGNDCommon ground.
SCLGPIO 22 (D22)I2C clock.
SDAGPIO 21 (D21)I2C data.

On an ESP32 DevKit, Wire.begin() with no arguments puts SDA on GPIO 21 and SCL on GPIO 22, labeled D21 and D22. The ESP32 and the BMP280 are both 3.3 V parts, so this is the simplest wiring there is: no regulator and no level shifter.

Pins to leave alone on the ESP32

GPIO 34, 35, 36 (VP) and 39 (VN) are input only: they cannot drive a pin or take an internal pull-up. GPIO 0, 2, 5, 12 and 15 are strapping pins, read at power-on, and GPIO 6 to 11 are the flash chip.

On a real bench

The thirty-pin DevKit straddles a breadboard with one row of holes free on each side, which is where the BMP280’s jumpers go. Many ESP32 boards are wider and cover both rows; then use two breadboards side by side. Hold BOOT while uploading if the IDE cannot connect.

The code

The sketch the circuit above runs. Open it in the editor, change a line and press Run: it compiles in your browser.

BMP280 on ESP32 I2C
#include <Wire.h>
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp;   // on I2C: SDA GPIO 21 (D21), SCL GPIO 22 (D22)

void setup() {
  Serial.begin(115200);
  if (!bmp.begin(0x76)) {
    Serial.println("No BMP280 at 0x76");
    for (;;) {}
  }
  Serial.println("BMP280 found");
}

void loop() {
  Serial.print("Temperature: ");
  Serial.print(bmp.readTemperature(), 1);
  Serial.print(" C  Pressure: ");
  Serial.print(bmp.readPressure() / 100.0F, 1);
  Serial.print(" hPa  Altitude: ");
  Serial.print(bmp.readAltitude(1013.25), 0);
  Serial.println(" m");
  delay(1000);
}

bmp.begin(0x76) reads the chip’s ID and its factory calibration, which every reading needs. It returns false when nothing answers at that address; boards with SDO tied high answer at 0x77 instead.

readTemperature() is degrees Celsius and readPressure() is pascals, so dividing by 100 gives hectopascals, the unit weather reports use. readAltitude(1013.25) turns pressure into meters above the level where it would be 1013.25 hPa; give it your local sea-level pressure for a true altitude.

Serial.begin(115200) opens the serial monitor. Serial is UART0 on the USB bridge. ESP32 sketches usually run it at 115200 baud, which this one does.

Common mistakes with the BMP280 on the ESP32

The wrong address

Adafruit’s own board answers at 0x77, the cheap purple ones at 0x76, and bmp.begin() with no argument tries 0x77. If it fails, try the other address before suspecting the wiring.

Powering it from VIN (5 V from USB)

A breakout without a regulator is a bare 3.3 V chip: 5 V on VIN can kill it. Use 3V3, which on this board is also the right level for I2C.

Confusing it with a BME280

The BME280 looks the same and adds humidity. A BMP280 reports a chip ID of 0x58, a BME280 0x60, and each library refuses the other. If begin() fails at both addresses, check which chip you have.

Questions and answers

Can I simulate a BMP280 with an ESP32 DevKit?

Yes. The circuit at the top of this page is an ESP32 DevKit with a BMP280, running in your browser on a simulated ESP32 (Xtensa LX6). The temperature and pressure sliders set what the simulated chip measures, and the library applies the real calibration math to it. Press Run it in the editor to change the wiring or the code; it is free and needs no account.

Where does the BMP280 connect on the ESP32?

On an ESP32 DevKit, Wire.begin() with no arguments puts SDA on GPIO 21 and SCL on GPIO 22, labeled D21 and D22.

How accurate is the altitude?

Pressure changes with the weather by more than it changes over a few floors, so readAltitude() is only as good as the sea-level pressure you give it. Relative changes over a few minutes are accurate to about a meter.

Can I use the BMP280 over SPI?

The chip supports SPI, but this simulated part speaks I2C. Most breakouts are wired for I2C out of the box anyway.

Build your own BMP280 project

Open this circuit in the editor, change the wiring or the code, and keep your version in a free account.