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

# BME680 with an Arduino Uno

Adafruit's BME680 breakout takes the Arduino Uno's 5V on VIN and level-shifts its logic pins, so SCK and SDI connect straight to the Uno's SCL and SDA. The Uno reads temperature, humidity, pressure and raw gas resistance well; turning gas resistance into an air-quality index is where it runs out of room.

## Wiring

| BME680 | Arduino Uno | Note |
| --- | --- | --- |
| VIN | 5V |  |
| GND | GND |  |
| SCK | SCL |  |
| SDI | SDA |  |

## What to know on the Arduino Uno

- The BME680 chip runs from 1.71 V to 3.6 V; on Adafruit's board VIN takes 3 V to 5 V and the logic is level-shifted, which is what makes it safe on the Uno's 5 V. (Bosch BME680 datasheet rev 1.9, p. 3; Adafruit BME680 guide, Pinouts)
- The gas heater draws 9 to 13 mA at 320 °C. That is easy for the Uno's 5V pin over USB, but it is the dominant current if the Uno runs on batteries. (Bosch BME680 datasheet rev 1.9, p. 8)
- The Adafruit_BME680 library used here gives raw gas resistance in ohms. Bosch's BSEC library, which turns it into an IAQ index, does not support the Uno's ATmega328P, so IAQ needs a larger board or your own baseline logic on the raw value. (Bosch BSEC Arduino library, supported platforms)
- performReading() waits for the heater's 150 ms plus the conversion, so the Uno is busy for that time on each read; keep the 2 s loop delay or longer. (Adafruit BME680 library, performReading(); Bosch BME680 datasheet rev 1.9, p. 8)

## Code

Libraries: adafruit/Adafruit BME680 Library

```cpp
// BME680 on Arduino Uno: wiring and a free simulation at https://www.tinkered.ai/components/bme680/arduino-uno
#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 arduino:avr:uno on 2026-10-30.

## Questions

### Can I connect the BME680 to an Arduino Uno at 5 V?

Yes on Adafruit's breakout: VIN takes 3 V to 5 V and the logic pins are level-shifted. The chip alone is limited to 3.6 V (Bosch datasheet, p. 3), so a bare module needs 3.3 V and level shifting.

### Can an Arduino Uno compute the BME680's IAQ index?

Not with Bosch's BSEC library, which does not support the ATmega328P. The Uno reads the raw gas resistance; compare it against a baseline in clean air, or use a 32-bit board for BSEC.

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

0x77 by default, which bme.begin() uses; tie SDO to GND for 0x76 (Bosch datasheet, p. 38). Either way it sits on A4 and A5.

## More

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

## Try it

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