meta data for this page
Differences
This shows you the differences between two versions of the page.
| sensor:ccs811 [2026/04/21 20:47] – created - external edit 127.0.0.1 | sensor:ccs811 [2026/05/07 23:54] (current) – [RP2040-ETH example code] vamsan | ||
|---|---|---|---|
| Line 18: | Line 18: | ||
| * **TVOC (Total Volatile Organic Compounds): | * **TVOC (Total Volatile Organic Compounds): | ||
| * **On-board Processing: | * **On-board Processing: | ||
| + | ==== 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|< | ||
| + | |600 – 1000|< | ||
| + | |1000 – 1500|< | ||
| + | |1500 – 2000|< | ||
| + | |2000 – 5000|< | ||
| + | |||
| + | |||
| + | ==== 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|< | ||
| + | |50 – 220|< | ||
| + | |220 – 660|< | ||
| + | |660 – 2200|< | ||
| + | |Over 2200|< | ||
| ==== Technical Specifications ==== | ==== Technical Specifications ==== | ||
| Line 111: | Line 131: | ||
| * **Accuracy: | * **Accuracy: | ||
| + | ==== RP2040-ETH Micropython example code ==== | ||
| + | |||
| + | I²C settings: i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=100000) | ||
| + | |||
| + | <code python> | ||
| + | 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: | ||
| + | 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(" | ||
| + | | ||
| + | # 1. Eszköz keresése az I2C buszon | ||
| + | devices = i2c.scan() | ||
| + | if CCS811_ADDR not in devices: | ||
| + | raise RuntimeError(" | ||
| + | |||
| + | # 2. Hardver ID ellenőrzése (kötelezően 0x81) | ||
| + | hw_id = i2c.readfrom_mem(CCS811_ADDR, | ||
| + | if hw_id != 0x81: | ||
| + | raise RuntimeError(f" | ||
| + | |||
| + | # 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, | ||
| + | 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, | ||
| + | time.sleep_ms(100) | ||
| + | print(" | ||
| + | |||
| + | def read_air_quality(): | ||
| + | # Állapotregiszter ellenőrzése | ||
| + | status = i2c.readfrom_mem(CCS811_ADDR, | ||
| + | | ||
| + | # 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, | ||
| + | | ||
| + | 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(" | ||
| + | | ||
| + | while True: | ||
| + | eco2, tvoc = read_air_quality() | ||
| + | | ||
| + | if eco2 is not None: | ||
| + | print(f" | ||
| + | else: | ||
| + | # Ha még nem frissült az adatregiszter, | ||
| + | pass | ||
| + | | ||
| + | time.sleep(1) | ||
| + | |||
| + | except Exception as e: | ||
| + | print(f" | ||
| + | </ | ||
| + | |||
| + | **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 ===== | ===== I²C topics on lamaPLC ===== | ||
| {{topic> | {{topic> | ||
| - | {{tag> | + | {{tag> |
| This page has been accessed for: Today: {{counter|today}}, | This page has been accessed for: Today: {{counter|today}}, | ||