BMP280 Pressure Sensor with an Arduino Uno
Bosch's barometric pressure and temperature sensor, 300 to 1100 hPa at ±0.12 hPa relative accuracy, over I2C or SPI.

The GY-BMP280 module has no regulator and the chip is rated 3.6 V, so on an Arduino Uno its VCC goes to the 3.3V pin, never 5V. Its SDA and SCL connect to the Uno's I2C pins, A4 and A5, and its 10 kΩ pull-ups hold the bus at 3.3 V.
Wiring the BMP280 Pressure Sensor to the Arduino Uno
Pin by pin.
| BMP280 Pressure Sensor | Arduino Uno |
|---|---|
| VCC | 3V3 |
| GND | GND |
| SCL | SCL |
| SDA | SDA |
What to know on the Arduino Uno
- VDD is 1.71 V to 3.6 V with 4.25 V absolute maximum, so 5 V from the Uno destroys the chip. The Uno's 3.3V pin, rated 50 mA, easily covers the sensor's 720 µA measuring peak.Bosch BMP280 datasheet rev 1.26, pp. 7, 9; Arduino UNO R3 tech specs
- Wire.begin() on the Uno turns on the ATmega328P's internal pull-ups to 5 V on A4 and A5, which lift the 3.3 V bus a little above the module's level. Leave them on: they are what lets the Uno read this bus at all, as the next note explains. To keep the chip strictly within its limits, put a level shifter on SDA and SCL instead.ArduinoCore-avr Wire library, twi.c
- The Uno's I2C input wants 0.7 × VCC (3.5 V) for a clean high, a little above the module's 3.3 V pull-ups; the internal pull-ups make up the difference, so switching them off after begin() leaves the bus short of that threshold. A level shifter is the robust choice on a long bus.Microchip ATmega328P datasheet DS40002061B, TWI characteristics
- Use I2C rather than SPI on the Uno: the Uno's SPI pins (D11, D12, D13) drive 5 V, so SCK, MOSI and CSB would each need a level converter to reach a 3.3 V BMP280.Arduino UNO R3 datasheet, p. 10
BMP280 Pressure Sensor code for the Arduino Uno
Compiled for arduino:avr:uno on 2026-10-30.
// BMP280 Pressure Sensor on Arduino Uno: wiring and a free simulation at https://www.tinkered.ai/components/bmp280/arduino-uno
#include <Wire.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C
void setup() {
Serial.begin(115200);
if (!bmp.begin(0x76)) { // 0x77 with SDO on 3.3 V
Serial.print("BMP280 not found, chip id 0x");
Serial.println(bmp.sensorID(), HEX); // 0x60 = a BME280, 0xFF/0x00 = nothing at that address
while (1) delay(10);
}
// normal mode, ×2 temperature, ×16 pressure, filter ×16, 500 ms standby
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
}
void loop() {
Serial.print("Temperature: ");
Serial.print(bmp.readTemperature());
Serial.println(" C");
Serial.print("Pressure: ");
Serial.print(bmp.readPressure() / 100.0);
Serial.println(" hPa");
Serial.print("Altitude: ");
Serial.print(bmp.readAltitude(1013.25)); // the local sea-level pressure, hPa
Serial.println(" m");
delay(1000);
}
BMP280 Pressure Sensor on the Arduino Uno: questions
Can I connect a BMP280 to the Arduino Uno's 5V pin?
Not the GY-BMP280: it has no regulator and the chip's absolute maximum is 4.25 V (Bosch datasheet, p. 9). Power it from the Uno's 3.3V pin.
Does the BMP280 need a level shifter on the Arduino Uno?
Over I2C it usually works without one: the module holds the bus at 3.3 V, under the Uno's 3.5 V high threshold, and the internal pull-ups to 5 V that Wire.begin() turns on lift it enough. For a strictly in-spec bus, add a level shifter. Over SPI a level shifter is required.
Why does my BMP280 say 'not found' on the Uno?
The module answers at 0x76 and Adafruit's begin() defaults to 0x77, so pass 0x76. If sensorID() prints 0x60, the board is a BME280; 0x58 is a BMP280 (Bosch datasheet, p. 24).
Keep going
This guide as plain Markdown. /components/bmp280/arduino-uno.md