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.

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.
| BME680 | Arduino Uno |
|---|---|
| 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
BME680 code for the Arduino Uno
Compiled for arduino:avr:uno on 2026-10-30.
// 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
This guide as plain Markdown. /components/bme680/arduino-uno.md