Temperature, humidity and air

BME680 with ESP32

The BME680 adds a small heated gas sensor to the job of a BME280, so it reports temperature, humidity, pressure and a value for volatile organic compounds. Adafruit lists ±1.0 °C, ±3 % humidity and ±1 hPa. Buy it for the air quality trend, not for a precise gas reading.

The gas output is a single resistance, not a ppm figure. It falls when VOCs rise, and it cannot tell one gas from another, so a spray of deodorant and a spilled solvent look the same. Treat it as 'cleaner or dirtier than earlier today'. An air quality index needs Bosch's BSEC software on top, which this example does not use.

New sensors need about 48 hours of running to burn in, and then about 30 minutes to warm up each time before the reading settles. Plan for that when you test: a value that drifts for the first half hour is normal. The heater also warms the part, so expect its temperature to read a little high. Check your module's address: 0x76 or 0x77, as with the BME280.

BME680 wiring diagram for ESP32
Wiring diagram drawn by LCD Ultra Pro.

Specifications

MeasuresTemperature, humidity, pressure, VOC gas resistance
Temperature accuracy±1.0 °C
Humidity accuracy±3 %
Pressure accuracy±1 hPa
InterfaceI2C or SPI
I2C address0x76 or 0x77
Burn-in48 h new, then about 30 min warm-up

Power and logic levels

3.3 V: safe to connect directly

SupplyChip up to 3.6 V, some modules have a regulator
Signal level3.3 V
On an ESP32Run it from 3V3, so the I2C lines stay at 3.3 V.

ESP32 pins, including those on a display board's connectors, work at 3.3 V and are not 5 V tolerant. Modules differ, so if in doubt, measure the signal before you connect it.

Wiring

BME680Connect toNote
VIN / VCC3V3
GNDGND
SDAGPIO 8Any free pin, set in Wire.begin()
SCLGPIO 9Any free pin, set in Wire.begin()

Arduino code

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME680.h>

const int SDA_PIN = 8, SCL_PIN = 9;   // use your board's I2C pins
Adafruit_BME680 bme(&Wire);

void setup() {
  Serial.begin(115200);
  Wire.begin(SDA_PIN, SCL_PIN);
  if (!bme.begin(0x77) && !bme.begin(0x76)) {
    Serial.println("BME680 not found");
    while (true) delay(1000);
  }
  bme.setGasHeater(320, 150);         // 320 C for 150 ms
}

void loop() {
  if (bme.performReading()) {
    Serial.printf("%.1f C  %.0f %%  %.0f hPa  gas %.1f kOhm\n",
                  bme.temperature, bme.humidity, bme.pressure / 100.0, bme.gas_resistance / 1000.0);
  }
  delay(3000);
}

Needs the Adafruit BME680 library. Compiled for ESP32-S3 with arduino-esp32 3.x. Not yet tested by us on a physical sensor. Change the pins to match your board.

On a display

Read the value in your sketch and pass it to a label, or send it over MQTT and show it with an MQTT value in the editor.

Design a display for BME680

Boards with a ready connector

Only boards whose connectors we have surveyed. Others may still work on free GPIOs.

Elecrow CrowPanel ESP32 HMI 2.4"I2C port: SDA 22, SCL 21Not shared with the touch controller (it is on SPI) — free for sensors
Elecrow CrowPanel ESP32 HMI 2.8"I2C port: SDA 22, SCL 21Not shared with the touch controller (it is on SPI) — free for sensors
Elecrow CrowPanel ESP32 HMI 3.5"I2C port: SDA 22, SCL 21Not shared with the touch controller (it is on SPI) — free for sensors
Elecrow CrowPanel ESP32-S3 HMI 5.0"I2C port: SDA 19, SCL 20Same I2C bus as the GT911 touch (0x14 / 0x5D) and, on V3.0 boards, the PCA9557 touch-reset expander (0x18)
Elecrow CrowPanel ESP32-S3 HMI 7.0"I2C port: SDA 19, SCL 20Same I2C bus as the GT911 touch (0x14 / 0x5D) and, on V3.0 boards, the PCA9557 touch-reset expander (0x18)
LilyGO T-Display-S3-Pro 2.33"QWIIC RIGHT: SDA 5, SCL 6I2C only — same bus as the touch, the PMU (SY6970) and the light sensor
M5Stack AtomS3 0.85"Bottom I2C pins: SDA 38, SCL 39Same I2C bus as the built-in IMU (MPU6886, 0x68)
Makerfabs MaTouch ESP32-S3 Rotary IPS 2.1 RoundMabee I2C (J1): SDA 17, SCL 18Same I2C bus as the touch controller (CST826)
Makerfabs MaTouch ESP32-S3 Parallel TFT 4.3"Mabee I2C: SDA 17, SCL 18Same I2C bus as the touch controller (GT911)
Makerfabs MaTouch ESP32-S3 Parallel TFT with Touch 5.0"Mabee I2C: SDA 17, SCL 18Same I2C bus as the touch controller (GT911)
Makerfabs MaTouch ESP32-S3 Parallel TFT with Touch 7.0"Mabee I2C: SDA 17, SCL 18Same I2C bus as the touch controller (GT911)
Sunton ESP32-4827S043R/C 4.3"I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18.
Sunton ESP32-8048S043C 4.3"I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18.
Sunton ESP32-8048S050C 5.0"I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18.
Sunton ESP32-8048S070C 7.0"I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18.
Waveshare ESP32-S3 Touch LCD 2.1" roundI2C connector: SDA 15, SCL 7Same I2C bus as the touch controller, the IO expander, the RTC and the IMU (addresses 0x15/0x5D, 0x20, 0x51, 0x6B, 0x7E taken)
Waveshare ESP32-S3 Touch LCD 2.8"I2C connector: SDA 11, SCL 10Same I2C bus as the RTC and the IMU (0x51, 0x6B, 0x7E taken) — the touch has its own bus
Waveshare ESP32-S3 Touch LCD 2.8" Type BI2C connector: SDA 15, SCL 7Same I2C bus as the touch controller, the IO expander, the RTC and the IMU (addresses 0x15/0x5D, 0x20, 0x51, 0x6B, 0x7E taken)
Waveshare ESP32-S3-Touch-LCD-2.8CI2C connector: SDA 15, SCL 7Same I2C bus as the touch controller, the IO expander, the RTC and the IMU (addresses 0x15/0x5D, 0x20, 0x51, 0x6B, 0x7E taken)
Waveshare ESP32-S3-LCD-7BI2C connector (H1): SDA 8, SCL 9Same I2C bus as the touch controller (GT911) and the IO expander (CH422G)

Good to know

  • The gas value is resistance, not ppm.
  • Run a new sensor for 48 hours.
  • Allow about 30 minutes to settle at each start.
  • An air quality index needs Bosch BSEC.

What it is good for

  • Air quality trend displays
  • Workshop and kitchen monitors
  • Ventilation reminders

FAQ

Does the BME680 measure CO2?

No. It reports VOC gas resistance. For real CO2, use an SCD40.

Why does the gas value drift?

The sensor needs burn-in and warm-up time.

Can it identify a gas?

No, it gives one value for overall VOCs.

Sources

Related parts

Use this information at your own risk. It is for general guidance only: the example code compiles, but it has not been tested on every part, and modules differ between sellers. Check the manufacturer's data before you build. Product names belong to their owners, and LCD Ultra Pro is not affiliated with them. See our Terms.