BME680 Explained: How It Measures Air Quality, and How to Wire It to an Arduino Uno

The BME680 is a four-in-one digital environmental sensor from Bosch Sensortec that measures temperature, relative humidity, barometric pressure, and gas resistance (used to estimate volatile organic compounds, or VOCs) from a single chip. It communicates over I2C or SPI, is small enough to fit on a breakout board the size of a fingernail, and is the standard sensor used in DIY indoor air quality monitors, smart home environmental stations, and weather stations that also report on air quality rather than just temperature and pressure.

What does the BME680 measure?

The BME680 reports four separate environmental values from one package:

  • Temperature — from -40°C to +85°C.
  • Relative humidity — 0 to 100% RH.
  • Barometric pressure — 300 to 1100 hPa, the same range used for altitude estimation on sensors like the BMP280.
  • Gas resistance — a measurement of the electrical resistance of an internal metal-oxide element, which changes in the presence of VOCs and is used to derive a relative indoor air quality (IAQ) index.

The first three measurements (temperature, humidity, pressure) are the same categories of data you would get from a BME280. What makes the BME680 a different sensor entirely is the fourth measurement — gas.

How does the BME680's gas sensor detect air quality?

Inside the BME680 is a small heated plate coated with a metal-oxide (MOx) sensing layer. When the plate is heated to operating temperature, its electrical resistance shifts depending on the concentration of volatile organic compounds in the surrounding air — things like alcohol vapor, cooking fumes, solvents, and other airborne organic gases. The sensor reports this as a raw gas resistance value, typically in the sensor's internal units, which then needs to be interpreted rather than read as an absolute gas concentration.

This is an important distinction: the BME680 does not tell you "12 ppm of benzene" or name a specific gas. It gives you a relative signal that goes up or down as VOC levels change, and libraries like Bosch's BSEC (Bosch Sensortec Environmental Cluster) convert that raw resistance into a more usable IAQ index after a calibration period. Simpler libraries, such as Adafruit's BME680 library, expose the raw gas resistance value directly (typically in ohms) and leave interpretation to you.

The sensor's internal heater also needs time to reach a stable operating point. Datasheets and most implementation guides recommend a burn-in period — often cited as 5 minutes or more on first power-up — before gas readings settle into a consistent baseline. This is why an air quality project built around the BME680 will usually show erratic gas numbers for the first few minutes after power-on before the readings become meaningful for tracking trends.

How do you wire the BME680 to an Arduino Uno?

Most BME680 breakout modules default to I2C mode and expose four pins: VCC, GND, SCL, and SDA. On an Arduino Uno, the I2C bus is fixed to two specific analog pins, so no pin configuration is required in code — you only need to connect the wires correctly.

Arduino Uno pin BME680 pin Signal
5V (or 3.3V, depending on your module) VCC Power
GND GND Ground
A4 SDA I2C data
A5 SCL I2C clock

The BME680's sensing chip itself runs on 3.3V logic. Many breakout boards include an onboard voltage regulator that makes the module tolerant of a 5V supply, which is why 5V-to-VCC is a common wiring pattern with these modules on a 5V board like the Uno — but breakout designs vary, so it is worth checking your specific module's markings or datasheet before assuming 5V tolerance, and using the 3.3V pin instead if there's any doubt. The default I2C address is usually 0x76, though some breakouts use 0x77 — if your code cannot find the sensor at 0x76, that is the first thing to check.

BME680 vs BME280 — what's the difference?

The BME280 and BME680 look similar, share the same Bosch environmental sensor lineage, and both measure temperature, humidity, and pressure over I2C or SPI. The difference is the BME680's fourth channel: gas/VOC resistance for air quality sensing, which the BME280 does not have. If a project only needs temperature, humidity, and pressure — a weather station or a basic climate logger, for example — the BME280 covers that at a lower cost. If the project needs to react to or report on air quality (VOCs, general "stuffiness," or air freshness), the BME680 is the sensor that adds that capability.

Watch it built live

We typed this into Compoden's storefront assistant, Soldr, exactly as a customer would:

"I want to build an indoor air quality monitor project using a BME680 and an Arduino Uno"

Compoden storefront AI assistant Soldr building a BME680 indoor air quality monitor parts tray with Arduino Uno

Soldr picked a four-part tray — an Arduino Uno board, the BME680 sensor module, connecting wire, and a USB-C power adapter — and explained the reasoning in plain language: "This build lets you measure the air quality inside a room. It uses a sensor to detect different things in the air and sends that information to a small computer." It went on to describe the BME680 specifically: "The BME680 Sensor Module is a sensor that measures several aspects of air quality. It can detect temperature, humidity (how much water vapor is in the air), pressure, and gas (specifically volatile organic compounds, or VOCs)." It also flagged the build as easy overall, noting the one thing to expect: "one part must be calibrated before it reads correctly" — a direct reference to the BME680's gas-sensor burn-in.

Watch the firmware get generated

We then took the same project to Compoden's VoltIQ code assistant and asked it to write working firmware:

"I want to build an indoor air quality monitor using a BME680 and an Arduino Uno. Write the full Arduino firmware to read temperature, humidity, pressure and gas resistance and print it to the serial monitor."

VoltIQ PWA generated Arduino firmware for BME680 temperature humidity pressure and gas sensor using Adafruit BME680 library

The generated sketch pulls in the Adafruit sensor libraries (Adafruit_Sensor.h and Adafruit_BME680.h), which is the standard library path for reading a BME680 over I2C without implementing BSEC calibration yourself. The firmware panel opens with a wiring comment block spelling out the exact connections it assumed — SDA to A4, SCL to A5, VCC and GND — so the code and the physical wiring stay in sync, and it explicitly calls out that the default I2C address is 0x76 with 0x77 as the fallback for boards that use the alternate address. The build log on the left shows the assistant matching all five parts (including the wiring accessory and power adapter) before compiling the sketch, and the instructions above the code panel remind you to install the "Adafruit BME680" library from the Arduino Library Manager before flashing.

What is the BME680 good for?

Because it reports temperature, humidity, pressure, and gas resistance from one small board, the BME680 shows up most often in indoor air quality monitors, smart home environmental dashboards, weather stations that also want to flag "stuffy room" conditions, and DIY air-purifier or ventilation-fan triggers that need a rough signal for when air quality is degrading. It is not a substitute for a certified gas-concentration sensor in a safety-critical application, but for a hobbyist or a home project that wants a general sense of air freshness alongside standard weather data, it covers all four measurements without needing a separate sensor for each.

Get everything in this build

These are the exact parts Soldr selected for this build, with live prices and direct add-to-cart links.

Part Price Add to cart
Arduino Uno R3 CH340G ATmega328P Board Rs.230 Add to cart
BME680 Sensor Module - Temp Humidity Pressure Gas, I2C/SPI Rs.780 Add to cart
23 AWG Multi-Strand Breadboard Wire Rs.10 Add to cart
USB-C 5V 3A Power Supply Adapter Rs.180 Add to cart
Total Rs.1,200 Add all 4 to cart

A solderless breadboard and a set of male-to-male/male-to-female jumper wires are not included in this list — Soldr flagged jumper wires as needed but not automatically added, so add a jumper wire kit and a breadboard from Compoden's prototyping section if you don't already have them on hand.

Built and Backed by Compoden

Every part listed above ships from Compoden's India stock, so there's no long international shipping wait on a sensor module. Parts are checked for compatibility with the boards they're paired with before they're listed together in a build like this one. Orders typically arrive in 3-7 days, Cash on Delivery and UPI are both supported at checkout, and Compoden's support team is available if you run into wiring or firmware issues while building.

Frequently asked questions

Does the BME680 need calibration?
The temperature, humidity, and pressure readings are usable right away. The gas/VOC reading needs a burn-in period — the internal heater needs time to reach a stable operating point, and Bosch's BSEC library uses an ongoing calibration process to convert raw gas resistance into a more meaningful indoor air quality (IAQ) index over time.

Can the BME680 tell me exactly which gas is in the air?
No. It reports a general gas resistance value that shifts with the overall concentration of volatile organic compounds nearby, not a reading for a specific named gas. It's useful for tracking relative changes in air quality, not for identifying or quantifying a particular chemical.

Is the BME680 the same as the BME280?
No. Both measure temperature, humidity, and pressure, but the BME680 adds a fourth measurement — gas resistance for VOC/air-quality sensing — that the BME280 does not have.

Can I use the BME680 with an ESP32 instead of an Arduino Uno?
Yes. The BME680 communicates over I2C or SPI, both of which are available on ESP32 boards. Since the ESP32 runs at 3.3V logic natively, it avoids any question about the sensor's 5V tolerance that comes up when using a 5V board like the Arduino Uno.

Back to blog