meta data for this page
lamaPLC: CJMCU-811 CCS811 Gas Sensor (VOCs TVOC CO2)
The CJMCU-811 is a small, ultra-low-power digital gas sensor module designed to monitor indoor air quality. It is built around the CCS811 sensor from AMS, which uses a metal oxide (MOX) multi-gas sensor to detect a broad range of Volatile Organic Compounds (VOCs).
- This type of digital sensor is used to measure changes in volatile organic compounds, especially carbon dioxide (CO²). The module features a CJMCU-811 CCS811 CO² Air Quality Metal Oxide Gas Sensor.
- The sensor is known for its low power consumption, making it suitable for use in battery-powered devices.
- This device is primarily used to monitor indoor air quality and can be read by microcontrollers through the I²C interface.
- Because of its complex design, the module is highly sensitive and can accurately measure the share of eCO².
- ETVOC measurement range: 0 ~ 32768 ppb
- ECO2 measurement range: 400 ~ 32768 ppm
Key Capabilities
The sensor measures atmospheric conditions and outputs digitized values via an I²C interface:
- eCO² (Equivalent CO²): Calculates carbon dioxide levels based on volatile organic compounds, usually ranging from 400 to 8,192 ppm.
- TVOC (Total Volatile Organic Compounds): Detects a wide array of gases, including alcohols, aldehydes, ketones, organic acids, and amines.
- On-board Processing: Incorporates an integrated 8-bit microcontroller that runs intelligent algorithms to turn raw sensor data into air quality readings, decreasing the processing load on your main controller.
eCO2 (Equivalent Carbon Dioxide) Levels
The CCS811 does not measure actual CO₂. Instead, it estimates it based on hydrogen gas levels. This ppm (parts per million) value accurately reflects how stuffy or occupied a room is.
| eCO2 Value (ppm) | Air Quality | Meaning & Recommended Action |
|---|---|---|
| 400 – 600 | ♦ Excellent | Clean outdoor air level. Ideal baseline. |
| 600 – 1000 | ♦ Good | Standard indoor level. Safe with no health effects. |
| 1000 – 1500 | ♦ Fair | Stale air. May cause slight drowsiness. Open a window. |
| 1500 – 2000 | ♦ Poor | Headaches and fatigue can start. Ventilation required. |
| 2000 – 5000 | X Severe | Heavy lethargy, loss of focus. Immediate fresh air is needed. |
TVOC (Total Volatile Organic Compounds) Levels
TVOC measures airborne chemicals, gases, and toxins (e.g., from cleaning sprays, perfumes, paints, adhesives, or new furniture) in ppb (parts per billion).
| TVOC Value (ppm) | Air Quality | Potential Effects & Actions |
|---|---|---|
| 0 – 50 | ♦ Excellent | Clean, chemical-free air. |
| 50 – 220 | ♦ Good | Normal indoor environment. Low risk of irritation. |
| 220 – 660 | ♦ Moderate | Sensitive individuals may feel eye or throat irritation. |
| 660 – 2200 | ♦ Poor | Headaches, nausea, or chemical odors. Locate source and ventilate. |
| Over 2200 | X Unhealthy | Intense irritation and discomfort. Toxic for long-term exposure. |
Technical Specifications
| Feature | Details |
|---|---|
| Operating Voltage | 1.8V to 3.3V DC (Note: Some modules include a regulator for 5V compatibility) |
| Power Consumption | ~30mA average; extremely low power in idle modes (< 6µW) |
| Interface | I2C (standard address is often 0x5A or 0x5B) |
| Dimensions | Roughly 15mm x 21mm |
| Environment | Operating temperature from -40°C to 125°C |
Usage Considerations
- “Equivalent” Readings: It's important to understand that this isn't a genuine CO2 sensor. Instead, it estimates eCO2 levels from VOC concentrations, which can sometimes lead to inaccuracies compared to industrial-grade NDIR (non-dispersive infrared) sensors.
- Burn-in & Run-in: New sensors need a 48-hour burn-in period to achieve stability. Moreover, after turning on the device, the sensor typically requires about 20 minutes of run-in time to produce accurate readings.
- Baseline Calibration: The sensor automatically adjusts its “clean air” baseline gradually. However, for optimal performance, it should regularly be exposed to fresh outdoor air.
Pin Descriptions
The CJMCU-811 (featuring the CCS811 sensor) is typically an 8-pin breakout board. For basic operation, you must connect VCC, GND, SDA, SCL, and WAKE.
| Pin Name | Function | |
|---|---|---|
| VCC | Power Supply | 1.8V to 3.6V (Some boards include a 5V regulator). |
| GND | Ground | Common ground for power and logic. |
| SCL | I²C Clock | Serial clock line for communication. |
| SDA | I²C Data | Serial data line for communication. |
| WAKE | Wake (Active Low) | Crucial: Must be pulled to GND to enable I²C communication. |
| INT | Interrupt (Active Low) | Optional; indicates when new data is ready, or thresholds are crossed. |
| RST | Reset (Active Low) | Optional; pulling this low resets the sensor. |
| ADDR | I²C Address Select | Connect to GND for 0x5A (default) or VCC for 0x5B. |
Connection Tips
- WAKE Pin: On many CJMCU-811 modules, the sensor will not respond to I2C commands if the WAKE pin is left floating. Connect it directly to a GND pin for continuous operation.
- Voltage Logic: While the sensor chip runs at 3.3V, many breakout boards, such as those from Adafruit or standard CJMCU versions, include level shifters, making them safe for use with 5V microcontrollers like the Arduino Uno.
- I²C Speed: If using a Raspberry Pi, you may need to lower the I²C baud rate to 10kHz because the Pi's hardware sometimes struggles with the “clock stretching” required by the CCS811.
Arduino example code
To use the CJMCU-811 with an Arduino, the most common approach is to use the Adafruit CCS811 Library.
Arduino Wiring
Connect your CJMCU-811 breakout to the Arduino as follows:
- VCC → 3.3V (or 5V if your board has a regulator)
- GND → GND
- SDA → A4 (on Uno/Nano) or Pin 20 (Mega)
- SCL → A5 (on Uno/Nano) or Pin 21 (Mega)
- WAKE → GND (Required to keep the sensor active)
This basic sketch initializes the sensor and prints eCO2 and TVOC levels to the Serial Monitor.
#include "Adafruit_CCS811.h" Adafruit_CCS811 ccs; void setup() { Serial.begin(115200); // Set Serial Monitor to 115200 baud Serial.println("CCS811 test"); // Initialize the sensor if(!ccs.begin()){ Serial.println("Failed to start sensor! Check wiring and WAKE pin."); while(1); } // Wait for the sensor to be ready while(!ccs.available()); } void loop() { if(ccs.available()){ // readData returns false if there is no error 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 sensor!"); while(1); } } delay(1000); // Wait 1 second between readings }
Common Troubleshooting
- I²C Address: If the code fails to start, your board might use address 0x5B instead of the default 0x5A. You can try ccs.begin(0x5B); in the setup.
- Serial Monitor Speed: Ensure the baud rate in your Serial Monitor matches Serial.begin(115200);.
- Accuracy: Remember that this sensor requires a 20-minute warm-up for stable readings and a 48-hour burn-in period when first used.
RP2040-ETH Micropython example code
I²C settings: i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=100000)
from machine import UART, Pin, I2C import machine import time # I2C konfiguráció az RP2040-ETH szabadon használható pinjein # Gyári alapértelmezett I2C cím a CCS811-nél: 0x5A (ha az ADDR pin GND-n van) CCS811_ADDR = 0x5A # Regiszter címek a CCS811 adatlap szerint REG_STATUS = 0x00 REG_MEAS_MODE = 0x01 REG_ALG_DATA = 0x02 REG_HW_ID = 0x20 REG_APP_START = 0xF4 REG_SW_RESET = 0xFF # I2C busz inicializálása i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=100000) def init_ccs811(): print("CCS811 inicializálása...") # 1. Eszköz keresése az I2C buszon devices = i2c.scan() if CCS811_ADDR not in devices: raise RuntimeError("A CCS811 szenzor nem található! Ellenőrizd a WAKE -> GND bekötést.") # 2. Hardver ID ellenőrzése (kötelezően 0x81) hw_id = i2c.readfrom_mem(CCS811_ADDR, REG_HW_ID, 1)[0] if hw_id != 0x81: raise RuntimeError(f"Hibás Hardver ID: {hex(hw_id)} (0x81 helyett)") # 3. Szoftveres indítás (Átváltás Bootloaderből Alkalmazás módba) # Üres adatot kell írni az APP_START regiszterbe i2c.writeto_mem(CCS811_ADDR, REG_APP_START, b'') time.sleep_ms(100) # 4. Mérési mód beállítása (Mód 1: Mérés másodpercenként egyszer) # A 0x10 érték beírja az 1-es módot (Drive Mode 1) és letiltja az megszakításokat i2c.writeto_mem(CCS811_ADDR, REG_MEAS_MODE, b'\x10') time.sleep_ms(100) print("Szenzor sikeresen elindítva Mód 1-ben (1 mp mintavétel).") def read_air_quality(): # Állapotregiszter ellenőrzése status = i2c.readfrom_mem(CCS811_ADDR, REG_STATUS, 1)[0] # A 3-as bit (0x08) jelzi, ha van új adat (DATA_READY) if status & 0x08: # Az ALG_DATA regiszterből 4 byte-ot olvasunk be: # Byte 0-1: eCO2 (ppm) # Byte 2-3: TVOC (ppb) data = i2c.readfrom_mem(CCS811_ADDR, REG_ALG_DATA, 4) eco2 = (data[0] << 8) | data[1] tvoc = (data[2] << 8) | data[3] return eco2, tvoc return None, None # Főprogram futtatása try: init_ccs811() print("Mérés indítása... (Az első értékek beállásához idő kell)\n") while True: eco2, tvoc = read_air_quality() if eco2 is not None: print(f"[{time.ticks_ms() // 1000}s] eCO2: {eco2} ppm | TVOC: {tvoc} ppb") else: # Ha még nem frissült az adatregiszter, várunk pass time.sleep(1) except Exception as e: print(f"Hiba történt: {e}")
Output
[2788s] eCO2: 717 ppm | TVOC: 48 ppb [2789s] eCO2: 665 ppm | TVOC: 40 ppb [2790s] eCO2: 634 ppm | TVOC: 35 ppb [2791s] eCO2: 634 ppm | TVOC: 35 ppb [2792s] eCO2: 634 ppm | TVOC: 35 ppb [2793s] eCO2: 641 ppm | TVOC: 36 ppb [2794s] eCO2: 641 ppm | TVOC: 36 ppb [2795s] eCO2: 657 ppm | TVOC: 39 ppb [2796s] eCO2: 649 ppm | TVOC: 37 ppb [2797s] eCO2: 649 ppm | TVOC: 37 ppb
I²C topics on lamaPLC
This page has been accessed for: Today: 1, Until now: 196