BME280 Breakout Board Pinout: I²C/SPI, Address Jumper, Schematic and ESP32

Detailed BME280 STEMMA QT breakout pinout, solder address jumper 0x76/0x77, I²C/SPI wiring, sensor circuit, voltage safety and Adafruit ESP32 example.

The BME280AliExpress price breakout pinout looks deceptively simple, until you discover that one board calls its I²C pins SCK and SDI, another calls them SCL and SDA, and the address can be either 0x76 or 0x77. This hardware-focused reference covers the Adafruit BME280AliExpress price I²C/SPI STEMMA QT breakout (product #2652) and explains what changes on common third-party modules. It includes the exact seven-hole Adafruit pinout, the rear ADDR solderAliExpress price jumper, a functional schematic, ESP32 wiring and a compact Adafruit-library sketch.

Quick setup (classic ESP32 DevKit, I²C): Connect ESP32 3V3 → VIN, GND → GND, GPIO21 → SDI (SDA), and GPIO22 → SCK (SCL). Leave Adafruit SDO and CS unconnected for the stock STEMMA QT board; use bme.begin(0x77, &Wire). Close its rear ADDR solder jumper to select 0x76 and change the code accordingly. Do not assume this jumper exists or behaves identically on a generic blue module.

Adafruit BME280 STEMMA QT front breakout pinout with VIN 3Vo GND SCK SDO SDI CS
Adafruit BME280 #2652 breakout: exact front header pinout, with the seven pins VIN, 3Vo, GND, SCK, SDO, SDI and CS in left-to-right physical order.

1. Which BME280 breakout board is this guide for?

Bosch makes the BME280 sensor IC; breakout manufacturers choose the regulator, pull-ups, level shifting, connectors and address strap. Those choices determine whether you can use 5 V, where you solder, and which signals are exposed. The reference board in the illustrations is the black Adafruit #2652 version with two STEMMA QT connectors. Older Adafruit header-only versions can differ physically although the chip functions and library are the same.

Board familyRecognisable featuresPower and logic ruleI²C address selection
Adafruit #2652 STEMMA QTTwo white 4-pin JST-SH connectors; seven header holes; regulator and level shiftingVIN accepts 3–5 V; 3Vo is regulator output, not 5 V supplyDefault 0x77; rear ADDR bridge or SDO-to-GND selects 0x76
Typical six-pin blue GY-BME280Often VCC, GND, SCL, SDA, CSB, SDO; board revisions differDo not assume a regulator or 5 V tolerance; verify schematic; 3.3 V is safestUsually SDO low = 0x76, high = 0x77; inspect onboard straps
Typical four-pin BME280 moduleVCC/3V3, GND, SCL, SDA; I²C only on headersSupply only at the documented voltage; 3.3 V for unverified versionsFrequently fixed via underside solder pads or resistor network, may not be changeable

Important: The Bosch chip is not a 5 V part: sensor VDD is 1.71–3.6 V and VDDIO is 1.2–3.6 V. Adafruit makes its breakout board 3–5 V compatible with a regulator and level shifting; this does not apply automatically to anonymous modules. Bosch specifications and Adafruit pinouts are the reference.

2. Adafruit BME280 board layout and exact pinout

With the board upright, BME280 silkscreen across the top and the seven through-holes along the bottom, their physical order from left to right is VIN, 3Vo, GND, SCK, SDO, SDI, CS. The STEMMA QT sockets are the four-wire I²C connectors on the sides. The labels have dual meanings depending on I²C or SPI mode.

Board pinI²C meaningSPI meaningESP32 note
VIN3–5 V breakout power input3–5 V breakout power inputConnect 3V3 for an ESP32
3VoRegulated 3.3 V outputRegulated 3.3 V outputNormally leave unconnected; do not feed 5 V here
GNDGround referenceGround referenceCommon GND required
SCKI²C SCL clockSPI SCK clockGPIO22 for example I²C; GPIO18 example SPI
SDOSensor address bit (high 0x77; low 0x76)SPI MISO (sensor → controller)Leave open on stock Adafruit I²C board
SDII²C SDA bidirectional dataSPI MOSI (controller → sensor)GPIO21 for I²C; GPIO23 for SPI
CSMust be kept high for I²CActive-low SPI chip selectLeave open on stock Adafruit I²C board; GPIO27 for example SPI

The most common pinout error: connect ESP32 SDA to breakout SDI, and ESP32 SCL to breakout SCK. Do not interpret SDO as I²C data-out or confuse 3Vo with VIN. The Adafruit STEMMA QT connectors carry power, ground, SDA and SCL, not SPI.

3. Change BME280 I²C address: 0x77 versus 0x76

The BME280 supports only two native 7-bit I²C addresses. They come from the digital level on Bosch SDO when operating in I²C mode. The chip requires CSB high to stay in I²C mode. On the Adafruit #2652 breakout the default SDO bias gives 0x77; bridging the labelled ADDR solder jumper on the back pulls SDO low for 0x76. Alternatively a wire between the breakout SDO header and GND selects 0x76. Use one method, not unnecessary duplicate straps.

Bosch SDO level7-bit I²C addressAdafruit #2652 board
HIGH / tied to VDDIO0x77Rear ADDR jumper open (factory default)
LOW / tied to GND0x76Rear ADDR jumper bridged, or SDO tied to GND
Adafruit BME280 rear ADDR solder jumper select I2C address 0x77 open 0x76 bridged
Adafruit BME280 back-address configuration: default 0x77 with SDO high; bridge rear ADDR jumper to ground SDO and select 0x76. Include generic module caution.
  1. Disconnect power before soldering; identify ADDR on the actual revision, not a pad guessed from a product picture.
  2. For 0x76, bridge only the documented Adafruit ADDR pads with a small solder joint; avoid nearby traces. For 0x77, keep them open.
  3. Reconnect and run an I²C scanner to confirm which address appears. Update the Arduino BME_ADDR constant.
  4. If using a generic board, read its schematic: an SDO pad may be pulled high, low, or switched by a three-pad resistor/jumper network. Do not solder arbitrarily across labelled VCC or ground pads.

Two BME280 sensors can share the same SDA/SCL pair if one uses 0x76 and the other 0x77. For three or more, use an I²C multiplexer such as TCA9548A, an independent bus, or SPI chip-select lines.

4. Functional BME280 schematic and why the board components matter

The diagram below is an original functional sensor-level I²C schematic, not a claim that every breakout uses exactly these resistors or matches Adafruit routing. The Bosch chip requires both supply domains in their permitted voltage ranges, local decoupling, an I²C pull-up network on SDA and SCL, CSB high for I²C, and a defined SDO logic level to fix the address. Adafruit adds a power regulator, level translators, pull-ups and STEMMA QT connectors; check its published CAD schematic for the exact PCB implementation.

Bosch BME280 functional schematic showing 3.3V VDD VDDIO and I2C pull-up resistors and CSB SDO levels
An original chip-level BME280 functional I²C schematic, with 3.3V VDD/VDDIO, 100 nF decoupling, pull-ups on SDA/SCL, CSB high, SDO high or low for address selection.
  • Power: sensor VDD and VDDIO must stay within Bosch limits. A regulated 3.3 V rail is suitable for a bare chip. Provide local bypass capacitors, placed close to the sensor pins, per the Bosch reference circuit.
  • I²C pull-ups: SDA and SCL need pull-ups to their logic rail. The Adafruit breakout provides pull-ups. Multiple modules with pull-ups in parallel lower the total equivalent resistance.
  • Interface selection: CSB held high is essential for I²C. Bosch documents that pulling CSB low selects SPI; I²C remains disabled until the next power-on reset after SPI selection.
  • Address bit: SDO tied high selects 0x77 and tied low selects 0x76. Do not leave it electrically floating on a self-designed raw-chip circuit.
  • Noise and measurement placement: keep the BME280 vent unobstructed and away from ESP32 voltage regulators, processors and direct sunlight; thermal self-heating can bias reported air temperature.

For the real Adafruit PCB schematic and fabrication views, use the Adafruit Downloads page, which links both the older board and the STEMMA QT CAD source. This distinction matters: a valid functional schematic is not evidence of a specific clone PCB trace.

5. ESP32 wiring: I²C first, SPI when needed

5.1 Recommended four-wire I²C connection

ESP32 DevKit (classic ESP32)Adafruit BME280 #2652Purpose
3V3VIN3.3 V power to breakout regulator input
GNDGNDCommon ground
GPIO21SDII²C SDA data
GPIO22SCKI²C SCL clock
Not connected3Vo, SDO, CSStock Adafruit I²C setup; board straps handle SDO and CS

These GPIOs are a convenient classic ESP32 example, not a universal ESP32-C3/S3/C6 pin assignment. On other ESP32 boards, check the board documentation and change Wire.begin(SDA_PIN, SCL_PIN). Start at 100 kHz I²C while debugging; short leads and correct pull-ups matter more than chasing maximum bus frequency.

5.2 Optional ESP32 hardware SPI

For SPI, connect Adafruit SCK → GPIO18, SDO → GPIO19 (MISO), SDI → GPIO23 (MOSI), and CS → GPIO27, with the same VIN/GND supply. These are explicit example GPIO choices for a classic ESP32. SPI does not use the sensor’s 0x76/0x77 I²C address; chip selection occurs through CS instead. The Bosch IC supports four-wire SPI (modes 0 and 3); the Adafruit driver handles the standard sensor transactions.

BME280 ESP32 wiring diagrams for I2C GPIO21 GPIO22 and optional SPI GPIO18 GPIO19 GPIO23 GPIO27
Two clear wiring diagrams: ESP32 classic to Adafruit BME280 over I²C (GPIO21 SDA to SDI, GPIO22 SCL to SCK) and separately over 4-wire SPI (GPIO18 SCK, GPIO23 MOSI to SDI, GPIO19 MISO from SDO, GPIO27 CS).

Never connect both interfaces casually. Ensure the device stays in the mode you are actually using. On a bare BME280 chip, a CSB transition low can force SPI mode until a power cycle, even if the bus scanner previously detected the device.

6. Arduino IDE: install the Adafruit BME280 library

  1. In Arduino IDE 2, choose Tools → Manage Libraries.
  2. Install Adafruit BME280 Library by Adafruit. Allow its dependencies, including Adafruit Unified Sensor and Adafruit BusIO, to install.
  3. Select the correct ESP32 board and serial port. The code below is intended for the classic ESP32 GPIO21/GPIO22 wiring above.
  4. Upload and open Serial Monitor at 115200 baud; expect one set of measurements every two seconds.

Library: Adafruit_BME280_Library. The sketch uses documented methods begin(), sensorID(), readTemperature(), readHumidity() and readPressure(). The code has been reviewed against the published API; it has not been bench-tested on a physical board for this article.

6.1 Complete ESP32 I²C example

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_BME280.h>

constexpr int I2C_SDA = 21;        // Classic ESP32 DevKit
constexpr int I2C_SCL = 22;
constexpr uint8_t BME_ADDR = 0x77; // Adafruit default; use 0x76 if ADDR closed

Adafruit_BME280 bme;

void setup() {
  Serial.begin(115200);
  delay(500);

  Wire.begin(I2C_SDA, I2C_SCL);
  Wire.setClock(100000);

  if (!bme.begin(BME_ADDR, &Wire)) {
    Serial.println("BME280 not found. Check power, SDA/SCL and address.");
    while (true) { delay(1000); }
  }

  Serial.print("Sensor chip ID: 0x");
  Serial.println(bme.sensorID(), HEX); // 0x60 for genuine BME280
}

void loop() {
  Serial.print("Temperature: ");
  Serial.print(bme.readTemperature(), 2);
  Serial.print(" C | Humidity: ");
  Serial.print(bme.readHumidity(), 1);
  Serial.print(" %RH | Pressure: ");
  Serial.print(bme.readPressure() / 100.0F, 1); // Pa to hPa
  Serial.println(" hPa");
  delay(2000);
}

Example serial values vary with the room; values below are illustrative, not a recorded sensor test:

Sensor chip ID: 0x60
Temperature: 24.30 C | Humidity: 47.1 %RH | Pressure: 1010.8 hPa

Pressure from readPressure() is in pascals; divide by 100 for hPa. Pressure is measured at the sensor location, not automatically corrected to mean sea level. If you display altitude, you must supply an appropriate sea-level reference pressure; 1013.25 hPa is only a standard example, not today’s local weather.

6.2 Optional complete ESP32 hardware SPI example

Choose this standalone sketch instead of the I²C program when using the four SPI signals from section 5.2. This sketch does not use an I²C address; BME_CS selects the sensor.

#include <Arduino.h>
#include <SPI.h>
#include <Adafruit_BME280.h>

constexpr int BME_CS = 27;
Adafruit_BME280 bme(BME_CS); // Hardware SPI

void setup() {
  Serial.begin(115200);
  delay(500);
  SPI.begin(18, 19, 23, BME_CS); // SCK, MISO, MOSI, SS

  if (!bme.begin()) {
    Serial.println("BME280 SPI init failed. Check wires and chip select.");
    while (true) { delay(1000); }
  }
}

void loop() {
  Serial.print("Temp: ");
  Serial.print(bme.readTemperature(), 2);
  Serial.print(" C | RH: ");
  Serial.print(bme.readHumidity(), 1);
  Serial.print(" % | Pressure: ");
  Serial.print(bme.readPressure() / 100.0F, 1);
  Serial.println(" hPa");
  delay(2000);
}

Adafruit provides both SPI and I²C constructors in the same library. Do not connect an I²C-only four-pin clone using this SPI sketch; it lacks exposed SPI data and chip-select pins. The GPIO mapping above is specific to classic ESP32 DevKit wiring.

7. How to detect a BMP280 sold as a BME280

One of the most useful troubleshooting checks is Bosch register 0xD0, which holds the sensor chip ID. A real BME280 reads 0x60; a production BMP280 typically reads 0x58 and cannot measure humidity. Both might acknowledge the same I²C address, so an I²C scanner alone does not prove that the purchased module is a BME280.

Result at register 0xD0InterpretationAction
0x60Bosch BME280Use Adafruit BME280 library
0x58Production Bosch BMP280Use an appropriate BMP280 driver; no relative humidity measurement
0x56 / 0x57Early BMP280 sample chip IDsVerify device identity; not BME280
No response / 0xFFNot proof of a sensor typeCheck address, wiring, CSB state and supply
BME280 two I2C addresses 0x76 and 0x77 with chip ID 0x60 versus BMP280 0x58 diagnostic
A troubleshooting infographic: two BME280 boards on shared I²C bus at 0x76 and 0x77, Bosch chip-ID register 0xD0 reads 0x60 for BME280 versus 0x58 for production BMP280.

If a board was sold as BME280 but reports ID 0x58, see our dedicated BMP280 vs BME280 comparison. Do not “repair” the issue by changing the humidity formula: the BMP280 lacks the BME280 humidity sensing function.

7.1 Simple I²C scanner for 0x76 and 0x77

#include <Wire.h>
void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22); // Classic ESP32 DevKit
  delay(500);
  for (uint8_t addr = 0x76; addr <= 0x77; ++addr) {
    Wire.beginTransmission(addr);
    if (Wire.endTransmission() == 0) {
      Serial.print("Device at 0x");
      Serial.println(addr, HEX);
    }
  }
}
void loop() {}

A responding 0x76 or 0x77 confirms only that an I²C device acknowledged there. Initialise the sensor and read its ID for a second check. Other devices may share these addresses, including some BMP280 modules.

8. Common faults and fixes

SymptomMost likely explanationPractical check
BME280 not found at 0x77Module is strapped to 0x76; SDA/SCL reversed; CSB lowRun scanner, check rear ADDR pad and I²C pin mapping
No devices on busWrong supply, missing GND, incorrect GPIO mapping or module stuck in SPI modeMeasure 3.3 V/GND, recheck pins, then power-cycle with CSB high
Scanner sees device but BME280 library failsDevice is actually a BMP280 or another chipRead ID register 0xD0; 0x60 is BME280
Humidity returns NaN / absentWrong sensor or corrupt communicationVerify ID and use correct library; do not assume a software bug
Pressure looks about 100× too largePa treated as hPaDivide readPressure() by 100.0
Temperature consistently highSensor warmed by ESP32/voltage regulator/enclosureMove board away from heat and provide airflow
Multiple boards intermittently failToo many I²C pull-ups, long leads or mismatched logic levelsReview effective pull-up resistance and shorten wires
Works on 5 V Arduino but not on ESP32Breakout SDA/SCL lines are pulled to 5 V or pins mislabelledUse 3.3 V logic and inspect actual regulator/level-shifter circuit

A basic BME280 requires only I²C wiring and a small program, but knowing the exact breakout revision prevents most problems. For a step-by-step Arduino sketch explanation, see our existing BME280 Arduino/ESP32 beginner guide. For ESPHome and installation guidance, see ESP32 BME280 wiring and ESPHome guide. Those articles serve different purposes from this pinout and hardware-reference page.

9. Quick answers

What is the default BME280 I²C address?

The Adafruit #2652 defaults to 0x77. Other breakouts may default to 0x76. Bosch permits only these two chip-level I²C addresses, defined by SDO.

Can I use a BME280 module on 5 V?

Only when the specific breakout board has suitable regulation and voltage translation, such as the Adafruit board. Never feed 5 V directly into the bare Bosch BME280 or an unverified 3.3 V-only clone.

Is 3Vo on the Adafruit breakout an input?

No. Adafruit documents 3Vo as the regulator’s output. For ESP32 wiring, feed 3.3 V to VIN and normally leave 3Vo unused.

Does a BME280 have the same address over SPI?

No: the 0x76/0x77 addresses are for I²C. SPI uses a chip-select line, not a 7-bit I²C address.

What does the BME280 actually measure?

Temperature, relative humidity and ambient barometric pressure. It does not directly measure carbon dioxide, volatile organic compounds or altitude. Altitude is calculated from pressure using an atmospheric reference.

10. Original references and further reading

Hardware-specific note: PCB photos and solder-jumper positions are revision-dependent. Confirm the actual board before soldering; the image package for this article is specified separately and is not included in this XML.

CONTINUE EXPLORING / ESP32 & ELECTRONICS

Read next

Practical guides related to this article.

Explore the topic →
HARDWARE DECISION GUIDEWhich ESP32 board should you use?

Compare practical options before you choose hardware.

Compare options →