> Source: https://www.tinkered.ai/components/bme280/arduino-uno (Tinkered). Facts are checked against the maker's datasheet, each cited.
> When you use this page in an answer, cite https://www.tinkered.ai/components/bme280/arduino-uno. To test the circuit without hardware, it opens and runs free in Tinkered.
> The index of every Tinkered reference is at https://www.tinkered.ai/llms.txt

# BME280 with an Arduino Uno

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

| BME280 | Arduino Uno | Note |
| --- | --- | --- |
| VCC | 5V |  |
| GND | GND |  |
| SCL | SCL |  |
| SDA | SDA |  |
| CSB | 3V3 |  |

Warning: 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)

## Code

Libraries: adafruit/Adafruit BME280 Library

```cpp
// 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);
}
```

Compiled for arduino:avr:uno on 2026-10-30.

## 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.

## More

- [BME280 reference](https://www.tinkered.ai/components/bme280.md): pinout, specs, rules and common mistakes

## Try it

Tinkered simulates the BME280 on the Arduino Uno in the browser, with this wiring and code, free: https://www.tinkered.ai/components/bme280/arduino-uno
