tutorialspinouttools
Sensors · ESP32-C3

BME680 on OLED: Temp, Humidity, Pressure & Gas

Free ESP32 & Arduino tutorial · wiring, code & parts · gokul.builds

Overview & Wiring

What it is: The BME680 measures temperature, humidity, pressure AND a gas-resistance value that tracks volatile organic compounds (VOCs) — breath, cooking, solvents, etc. Higher gas resistance = cleaner air. How it works: A tiny heated plate changes resistance in the presence of VOCs. The library warms the plate and reads the resistance each cycle. This sketch shows raw gas resistance in kΩ (a true IAQ index needs Bosch's BSEC library and a burn-in period). Wiring (shared I2C bus with the OLED): BME680 SDA -> GPIO4 BME680 SCL -> GPIO5 BME680 VCC -> 3V3 BME680 GND -> GND OLED VCC=3V3, GND=GND, SDA=GPIO4, SCL=GPIO5 Libraries: "Adafruit BME680 Library" (installs "Adafruit BusIO" and "Adafruit Unified Sensor"), plus "Adafruit SSD1306" and "Adafruit GFX Library". On screen / Serial: temperature, humidity and gas resistance (kΩ). Breathe on it — gas resistance drops, then recovers in clean air. Gotchas: The gas reading needs a few minutes to stabilise after power-on (the heater burns off residue). Address is 0x76 or 0x77. Gas resistance is a relative trend, not an absolute pollution number.

Circuit Diagram

BME680 on OLED: Temp, Humidity, Pressure & Gas wiring diagram for ESP32-C3

Parts You Need

ESP32-C3 SuperMiniBuy →
0.96" SSD1306 OLEDBuy →

Source Code (Arduino / ESP32)

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BME680.h>

Adafruit_SSD1306 display(128, 64, &Wire, -1);
Adafruit_BME680 bme(&Wire);

void setup() {
  Serial.begin(115200);
  Wire.begin(4, 5);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  if (!bme.begin(0x76) && !bme.begin(0x77)) {
    Serial.println("BME680 not found");
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, 28); display.println("BME680 not found");
    display.display();
    while (1) delay(10);
  }
  // configure oversampling + gas heater (320 °C for 150 ms)
  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_4X);
  bme.setGasHeater(320, 150);
}

void loop() {
  if (bme.performReading()) {
    float t = bme.temperature;               // °C
    float h = bme.humidity;                  // %
    float gas = bme.gas_resistance / 1000.0; // ohm -> kohm

    display.clearDisplay();
    display.setTextColor(SSD1306_WHITE);
    display.setTextSize(1);
    display.setCursor(0, 0);  display.println("BME680");
    display.setCursor(0, 16); display.printf("Temp: %.1f C", t);
    display.setCursor(0, 32); display.printf("Hum : %.0f %%", h);
    display.setCursor(0, 48); display.printf("Gas : %.0f kO", gas);
    display.display();

    Serial.printf("T %.1fC  H %.0f%%  Gas %.0f kOhm\n", t, h, gas);
  }
  delay(1500);
}
Browse all tutorials ESP32-C3 pinout Calculators