BME280 with an Arduino Uno
A Bosch BME280 breakout that measures barometric pressure, temperature, and relative humidity on one small board, talking to a microcontroller over I2C or SPI.

The BME280 chip itself is limited to 3.6 V, so the Uno's 5V only suits a breakout with a regulator: the 5 V version of the GY-BME280 carries one beside the chip, the 3.3 V version has none. SDA and SCL go to the Uno's I2C pins, A4 and A5, and CSB is held high from the Uno's 3.3V pin, not 5V, so the chip stays in I2C mode without that pin passing VDDIO + 0.3 V.
Wiring the BME280 to the Arduino Uno
Pin by pin.
| BME280 | Arduino Uno |
|---|---|
| VCC | 5V |
| GND | GND |
| SCL | SCL |
| SDA | SDA |
| CSB | 3V3 |
- This wiring is for a breakout with a regulator (a 3-pin part beside the chip, as on the 5 V GY-BME280), which shifts only SDA and SCL: CSB goes to 3.3V, since no interface pin may exceed VDDIO + 0.3 V. A board without a regulator is 3.3 V only: wire VCC to 3.3V too, since the chip's absolute maximum is 4.25 V (Bosch BME280 datasheet).
What to know on the Arduino Uno
- The chip runs from 1.71 V to 3.6 V on VDD and 1.2 V to 3.6 V on VDDIO. On the Uno's 5V pin, use a breakout with a regulator; a bare 3.3 V-only BME280 board needs the Uno's 3.3V pin and level shifting on SDA and SCL.Bosch BME280 datasheet rev 1.24, p. 2
- I2C on the Uno is A4 (SDA) and A5 (SCL), also brought out beside AREF; wiring the sensor there leaves A0 to A3 for analog readings.Arduino UNO R3 datasheet, p. 10
- The module holds SDO low, so it answers at 0x76; the Adafruit library's begin() defaults to 0x77, which is why the sketch calls bme.begin(0x76).Bosch BME280 datasheet rev 1.24, p. 32
- The sensor reads above ambient when warmed by its board; keep it on leads away from the Uno's voltage regulator rather than on a shield right above it.Bosch BME280 datasheet rev 1.24, p. 12
BME280 code for the Arduino Uno
Compiled for arduino:avr:uno on 2026-10-30.
// BME280 on Arduino Uno: wiring and a free simulation at https://www.tinkered.ai/components/bme280/arduino-uno
#include <Wire.h>
#include <Adafruit_BME280.h>
Adafruit_BME280 bme;
void setup() {
Serial.begin(9600);
if (!bme.begin(0x76)) { // 0x77 if SDO is tied HIGH
Serial.println("BME280 not found");
while (1) delay(10);
}
}
void loop() {
Serial.print(bme.readTemperature()); Serial.print(" C ");
Serial.print(bme.readHumidity()); Serial.print(" % ");
Serial.print(bme.readPressure() / 100.0); Serial.println(" hPa");
delay(1000);
}
BME280 on the Arduino Uno: questions
Can I power a BME280 from the Arduino Uno's 5V pin?
Only if your breakout has a regulator, as the 5 V version of the GY-BME280 does; the 3.3 V version has none. The chip is rated 1.71 V to 3.6 V (Bosch datasheet, p. 2), so a board without a regulator runs from the Uno's 3.3V pin, and CSB stays on 3.3V either way.
Why does my BME280 say 'not found' on the Uno?
The module answers at 0x76 and the Adafruit library defaults to 0x77, so pass 0x76 to begin(). Also check SDA on A4, SCL on A5, and that CSB is tied high: once CSB is pulled low, I2C stays off until power is cycled (Bosch datasheet, p. 32).
Which Uno pins does the BME280 use?
SDA to A4 and SCL to A5, or the SDA and SCL header pins beside AREF, which carry the same signals.
Keep going
This guide as plain Markdown. /components/bme280/arduino-uno.md