Андрей Овчаров

маленькое невинное хобби

Андрей Овчаров

Датчик углекислого газа CCS811

Дополнение:

По случаю приобрёл на алиэкспресс новый датчик концентрации углекислого газа - CJMCU-811. Датчик построен на микросхеме CCS811 производства компании ams.

Судя по описанию - умеет измерять концентрацию углекислого газа, а также концентрацию некоторых органических соединений. Интерфес - IIC, питание - 3.3 вольта, размер корпуса всего 4 на 2.7 миллиметров.

Разумеется, мне стало интересно сравнить его с MH-Z19B, про который я уже писал ранее.

Датчики MH-Z19B и CCS811 рядом

Датчик продаётся в виде уже готового модуля, стоит с доставкой в районе 8 евро, т.е. примерно в два-три раза дешевле, чем MH-Z19B.

Подключение

Подключение к модулю ESP8266 тривиальное, пятью (четырьмя) проводами:

Новый датчик следует оставить работать на 48 часов для достижения какого-то внутреннего просветления и стабильных показаний.

Также можно использовать его вместе с каким-нибудь датчиком температуры и влажности, это позволит вносить поправки и получать ещё более точные значения.

Прошивка

Для Arduino (и PlatformIO) уже написаны библиотеки, так что программирование тоже тривиальное:

#include <Arduino.h>
#include <Wire.h> // I2C library
#include "ccs811.h" // CCS811 library

// Wiring for ESP8266 NodeMCU boards: VDD to 3V3, GND to GND, SDA to D2, SCL to D1, nWAKE to D3 (or GND)
CCS811 ccs811(D3); // nWAKE on D3

void setup()
{
    // Enable serial
    Serial.begin(115200);

    // Enable I2C
    Wire.begin();

    delay(2000);

    // Enable CCS811
    ccs811.set_i2cdelay(50); // Needed for ESP8266 because it doesn't handle I2C clock stretch correctly
    bool ok = ccs811.begin();
    if (!ok)
        Serial.println("setup: CCS811 begin FAILED");

    // Start measuring
    ok = ccs811.start(CCS811_MODE_1SEC);
    if (!ok)
        Serial.println("setup: CCS811 start FAILED");
}

void loop()
{
    // Read
    uint16_t eco2, etvoc, errstat, raw;
    ccs811.read(&eco2, &etvoc, &errstat, &raw);

    // Print measurement results based on status
    if (errstat == CCS811_ERRSTAT_OK)
    {
        Serial.print("CCS811: ");
        Serial.print("eco2=");
        Serial.print(eco2);
        Serial.println();
    }
    else if (errstat == CCS811_ERRSTAT_OK_NODATA)
    {
        Serial.println("CCS811: waiting for (new) data");
    }
    else if (errstat & CCS811_ERRSTAT_I2CFAIL)
    {
        Serial.println("CCS811: I2C error");
    }
    else if (errstat & CCS811_ERRSTAT_ERRORS)
    {
        Serial.print("CCS811: errstat=");
        Serial.print(errstat, HEX);
        Serial.print("=");
        Serial.println(ccs811.errstat_str(errstat));
    }

    // Wait
    delay(1000);
}

Код взят с минимальными изменениями из примера.

Судя по первым опытам - действительно, что-то показывает. Если на него подышать, то цифры увеличиваются и, что интересно, реагирует он гораздо быстрее, чем MH-Z19B.

Теперь интересно положить два датчика рядом и вывести показания на один график для сравнения. Интересно, насколько он точный.

Результаты

Итак, на сегодняшний момент выявлены такие плюсы CCS811:

  • Малый размер
  • Питание 3.3 вольта
  • Низкая цена
  • Интерфейс I2C

Из минусов - из двух купленных модулей один оказался нерабочим. Так что надёжность пока под вопросом.

Ссылки