> Source: https://www.tinkered.ai/components/bme680/raspberry-pi-pico (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/bme680/raspberry-pi-pico. 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

# BME680 with a Raspberry Pi Pico

The Adafruit BME680 breakout takes its VIN from the Raspberry Pi Pico's 3V3 pin and talks on I2C0, SCK to SCL on GP5 and SDI to SDA on GP4. Its gas heater is the one load here that matters for the Pico's 3.3 V budget.

## Wiring

| BME680 | Raspberry Pi Pico | Note |
| --- | --- | --- |
| VIN | 3V3 |  |
| GND | GND |  |
| SCK | GP5 |  |
| SDI | GP4 |  |

## What to know on the Raspberry Pi Pico

- With the heater at 320 °C the BME680 draws 9 to 13 mA, against 3.7 µA without gas sensing. That still sits well within the 300 mA Raspberry Pi recommends for loads on 3V3. (Bosch BME680 datasheet rev 1.9, pp. 3, 8; Raspberry Pi Pico datasheet, release 21, p. 8)
- The breakout's 3V3 pin is its regulator's output: leave it unconnected and feed the board through VIN only. (Adafruit BME680 guide, Pinouts)
- bme.begin() with no argument looks at 0x77, the board's default. Tie SDO to GND for 0x76 if another part already uses 0x77. (Bosch BME680 datasheet rev 1.9, p. 38)

## Code

Libraries: adafruit/Adafruit BME680 Library

```cpp
// BME680 on Raspberry Pi Pico: wiring and a free simulation at https://www.tinkered.ai/components/bme680/raspberry-pi-pico
#include <Wire.h>
#include <Adafruit_BME680.h>

Adafruit_BME680 bme;

void setup() {
  Serial.begin(9600);
  if (!bme.begin()) {                 // default I2C address 0x77
    Serial.println("BME680 not found");
    while (1) delay(10);
  }
  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_4X);
  bme.setGasHeater(320, 150);         // 320 C for 150 ms
}

void loop() {
  if (bme.performReading()) {
    Serial.print(bme.temperature); Serial.print(" C  ");
    Serial.print(bme.humidity);    Serial.print(" %  ");
    Serial.print(bme.pressure / 100.0); Serial.print(" hPa  ");
    Serial.print(bme.gas_resistance / 1000.0); Serial.println(" kOhm");
  }
  delay(2000);
}
```

Compiled for rp2040:rp2040:rpipico on 2026-10-30.

## Questions

### Should I power the BME680 breakout from 3V3 or VBUS on a Pico?

3V3. VIN takes 3 V to 5 V (Adafruit guide, Pinouts), and powering it at the Pico's logic level keeps its I2C level-shifted lines at 3.3 V. VBUS also drops to 0 V when the Pico runs without USB (Pico datasheet, p. 8).

### Why do my BME680 gas readings start high on the Pico?

The metal-oxide gas sensor needs its heater cycles to settle; the first readings after power-up drift. Keep the sketch running and compare readings over time, not single values.

### Which I2C address does the BME680 use with the Pico?

0x77 by default, or 0x76 with SDO tied to GND (Bosch datasheet rev 1.9, p. 38).

## More

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

## Try it

Tinkered simulates the BME680 on the Raspberry Pi Pico in the browser, with this wiring and code, free: https://www.tinkered.ai/components/bme680/raspberry-pi-pico
