Датчик углекислого газа CCS811
Дополнение:
По случаю приобрёл на алиэкспресс новый датчик концентрации углекислого газа — CJMCU-811. Датчик построен на микросхеме CCS811 производства компании ams.
Судя по описанию — умеет измерять концентрацию углекислого газа, а также концентрацию некоторых органических соединений. Интерфес — IIC, питание — 3.3 вольта, размер корпуса всего 4 на 2.7 миллиметров.
Разумеется, мне стало интересно сравнить его с MH-Z19B, про который я уже писал ранее.
Датчик продаётся в виде уже готового модуля, стоит с доставкой в районе 8 EUR, т. е. примерно в два-три раза дешевле, чем 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
Из минусов — из двух купленных модулей один оказался нерабочим. Так что надёжность пока под вопросом.