Overview

The CCS811 is an ultra-low power digital metal-oxide (MOX) gas sensor solution manufactured by ams OSRAM for monitoring indoor air quality (IAQ). It integrates a micro-hotplate sensor element along with a dedicated 8-bit microcontroller that processes raw sensor resistance values and calculates Total Volatile Organic Compounds (TVOC in parts per billion, ppb) and equivalent carbon dioxide (eCO2\text{eCO}_2 in parts per million, ppm).

Communicating over I2CI^2C, the CCS811 supports environmental temperature and humidity compensation inputs (from external sensors like the BME280 or HDC1080) to improve baseline stability. It is widely incorporated into home automation systems, air purifiers, ESPHome nodes, and indoor environment monitors.

Quick reference

Operating voltage (VCC)3.3 V to 5.0 V DC (breakout module with LDO)
IC supply voltage (VDD)1.8 V to 3.6 V DC (3.3 V nominal)
InterfaceI2CI^2C (up to 400 kHz)
Default I2CI^2C address0x5A (ADDR pin Low / un-connected)
Alternate I2CI^2C address0x5B (ADDR pin High to VCC)
eCO2\text{eCO}_2 measurement range400 ppm to 8192 ppm
TVOC measurement range0 ppb to 1187 ppb
Power modesMode 0 (Idle), Mode 1 (1s), Mode 2 (10s), Mode 3 (60s), Mode 4 (250ms)
Active current draw26 mA (Mode 1 continuous) / 1.2 mA (Mode 3 low power)

Pinout

Breakout modules feature a 7-pin or 8-pin 0.1" (2.54 mm) header:

PinNameTypeDescription
1VCCPowerSupply input (+3.3 V to +5.0 V DC)
2GNDPowerGround (0 V)
3SCLDigital InputI2CI^2C Serial Clock
4SDADigital Input / OutputI2CI^2C Serial Data
5WAK / WAKEDigital InputActive-Low wake pin (MUST be tied to GND for active I2CI^2C)
6INTDigital OutputActive-Low interrupt output (goes Low when new data ready)
7RST / RESETDigital InputActive-Low hardware reset pin (pull High to VCCV_{CC} if unused)
8ADD / ADDRDigital InputI2CI^2C Address select (Low = 0x5A, High = 0x5B)

Specifications

ParameterSymbolMinTypMaxUnitConditions
Supply Voltage (Module)VCCV_{CC}3.33.3 / 5.05.5VModule with 3.3V regulator
Operating Current (Mode 1)Imode1I_{mode1}2630mA1-second pulse measurement interval
Operating Current (Mode 3)Imode3I_{mode3}1.22.0mA60-second pulse measurement interval
eCO2\text{eCO}_2 Measurement RangeeCO2eCO_24008192ppmEquivalent CO2\text{CO}_2 based on VOCs
TVOC Measurement RangeTVOCTVOC01187ppbTotal Volatile Organic Compounds
Initial Sensor Burn-Intburnint_{burnin}48hoursRecommended initial burn-in time
Warm-Up Timetwarmupt_{warmup}20minutesWarm-up time after cold start
Operating TemperatureToprT_{opr}-550°CAmbient operating temperature

Register map

AddressRegisterAccessResetDescription
0x00STATUSRead0x00Status register (bit 3: DATA_READY, bit 4: APP_VALID)
0x01MEAS_MODER/W0x00Measurement mode and interrupt control
0x02ALG_RESULT_DATARead4-byte payload: eCO2\text{eCO}_2 (bytes 0–1), TVOC (bytes 2–3)
0x05ENV_DATAWrite4-byte payload for temperature and relative humidity compensation
0xF4APP_STARTWriteWrite to transition from bootloader into Application mode
0xFFSW_RESETWriteReset sequence (0x11 0xE5 0x72 0x8A)

Wiring

CCS811 PinArduino / MCUESP32Notes
VCC5V / 3.3V3.3VModule onboard LDO
GNDGNDGNDSystem ground
SCLA5GPIO 22I2CI^2C Clock
SDAA4GPIO 21I2CI^2C Data
WAKEGNDGNDConnect to GND to enable I2CI^2C communications
RESET5V3.3VTie to VCCV_{CC} or leave floating (internal pull-up)
Warning

Floating WAKE pin hazard:

  • The WAKE pin is Active-Low. If left floating or connected to VCCV_{CC}, the onboard MCU remains in ultra-low power sleep and will not respond to I2CI^2C address 0x5A.
  • Always connect WAKE to GND (or control it via MCU GPIO).

Example

cpp
#include <Wire.h>
#include "Adafruit_CCS811.h"

Adafruit_CCS811 ccs;

void setup() {
  Serial.begin(115200);
  Serial.println("Initializing CCS811 Air Quality Sensor...");

  if (!ccs.begin(0x5A)) {
    Serial.println("Failed to start CCS811! Ensure WAKE pin is connected to GND.");
    while (1);
  }

  // Wait for sensor to become ready
  while (!ccs.available());
  Serial.println("CCS811 ready.");
}

void loop() {
  if (ccs.available()) {
    if (!ccs.readData()) {
      Serial.print("CO2: ");
      Serial.print(ccs.geteCO2());
      Serial.print(" ppm | TVOC: ");
      Serial.print(ccs.getTVOC());
      Serial.println(" ppb");
    } else {
      Serial.println("Error reading CCS811 data!");
    }
  }
  delay(1000);
}

Common mistakes

  • Leaving WAKE floating: The sensor ignores all I2CI^2C commands unless WAKE is grounded.
  • Conflating eCO2\text{eCO}_2 with true NDIR CO2\text{CO}_2: The CCS811 estimates equivalent CO2\text{CO}_2 (eCO2\text{eCO}_2) by measuring hydrogen and volatile organic gas levels, assuming human breath correlates with VOCs. It does not contain an NDIR optical absorption cell and will not measure pure CO2\text{CO}_2 accurately in non-human-occupied spaces.
  • Skipping initial 48-hour burn-in: MOX sensor materials undergo initial resistance stabilization. Readings during the first 48 hours of power-on exhibit drift.
  • Forgetting temperature/humidity compensation: Supplying live temperature and humidity values to ENV_DATA significantly improves accuracy in changing ambient environments.

Notes

  • CCS811 vs SGP30: Sensirion SGP30 and ams CCS811 are direct competitors in the metal-oxide indoor air quality market.

Assets & downloads