> Source: https://www.tinkered.ai/components/bme680/esp32 (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/esp32. 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 an ESP32 DevKit V1

The BME680 breakout's VIN takes the ESP32 DevKit V1's 3V3, and its SCK and SDI pins act as SCL and SDA on GPIO22 and GPIO21. Its gas heater runs from that same rail, a load the 3V3 pin carries easily.

## Wiring

| BME680 | ESP32 DevKit V1 | Note |
| --- | --- | --- |
| VIN | 3V3 |  |
| GND | GND |  |
| SCK | GPIO22 (D22) |  |
| SDI | GPIO21 (D21) |  |

## What to know on the ESP32 DevKit V1

- The heater at 320 °C draws 9 to 13 mA while it is on, against 3.7 µA without gas measurement, so on a battery-powered ESP32 the gas reading, not the temperature, sets the sensor's budget. (Bosch BME680 datasheet rev 1.9, pp. 3, 8)
- Keep the board's 3V3 output pin unconnected: it is the breakout's regulator output, not an input. VIN alone takes the ESP32's 3V3. (Adafruit BME680 guide, Pinouts)
- Place the sensor away from the ESP32. The module draws about 240 mA when transmitting 802.11b, and its heat reaches both the temperature and the gas readings. (Espressif ESP32 Series Datasheet v5.3, p. 52)

## Code

Libraries: adafruit/Adafruit BME680 Library

```cpp
// BME680 on ESP32 DevKit V1: wiring and a free simulation at https://www.tinkered.ai/components/bme680/esp32
#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 esp32:esp32:esp32 on 2026-10-30.

## Questions

### What address does the BME680 use on the ESP32?

0x77 by default, which bme.begin() asks; tie SDO to GND for 0x76 (Bosch datasheet, p. 38). A BME280 at 0x76 can share the same two ESP32 pins.

### Can I run the BME680 heater from the ESP32's 3V3 pin?

Yes. The heater takes 9 to 13 mA at 320 °C (Bosch datasheet, p. 8), well within what the DevKit's 3.3 V rail supplies to external parts.

## More

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

## Try it

Tinkered simulates the BME680 on the ESP32 DevKit V1 in the browser, with this wiring and code, free: https://www.tinkered.ai/components/bme680/esp32
