BME680 with an Arduino Uno

A Bosch 4-in-1 environmental sensor that measures temperature, humidity, barometric pressure, and gas (VOC) air quality over I2C or SPI.

BME680, A Bosch 4-in-1 environmental sensor that measures temperature, humidity, barometric pressure, and gas (VOC) air quality over I2C or SPI.
In short

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 the BME680 to the Arduino Uno

Pin by pin.

BME680Arduino Uno
VIN5V
GNDGND
SCKSCL
SDISDA

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

BME680 code for the Arduino Uno

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

Libraries: adafruit/Adafruit BME680 Library
// 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);
}

BME680 on the Arduino Uno: 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.

Keep going

For AI assistants

This guide as plain Markdown. /components/bme680/arduino-uno.md

What will you build with it?