- Цена: 30.78
После написания MatrixClock и tthRelay зачесались у меня руки сделать измеритель качества воздуха. Выбор пал на двухлучевой CO2 сенсор SCD30 от фирмы Sensirion. В этой статье вы узнаете все о SCD30 и научитесь пользоваться моей библиотекой, которая поддерживает все плюшки сенсора и даже больше. Если интересно прошу под cut…
Основные характеристики SCD30:
— двухлучевой оптический NDIR CO2 датчик
— встроенный датчик температуры и влажности для компенсации самонагрева воздуха в оптической камере
— напряжение питания +3.3в..+5.5в
— средний ток потребления 19мА, пиковый ток 75мА
— рабочий диапазон температур 0°C..+50°C
— диапазон измерения CO2 0ppm..40000ppm (I²C, UART) и 0..5000ppm (PWM)
— точность измерения CO2 ±(30ppm + 3% от ИВ) в диапазоне 400ppm..10000ppm
— повторяемость измерений ±10ppm в диапазоне 400ppm..10000ppm
— температурная стабильность ±2.5ppm/°C в диапазоне 0°C..+50°C
— диапазон измерения влажности 0%..100%
— точность измерения влажности ±3%
— диапазон измерения температуры -40°C..+70°C
— точность измерения температуры ±0.1°C
— время загрузки < 2сек
— интерфейсы I²C, UART, Modbus или PWM
— срок службы 15 лет
Принцип работы двухлучевых оптических NDIR (Non-Dispersive Infrared Detection) CO2 датчиков очень прост. Молекулы CO2 непрозрачны для ИК волны длинной 4.26 микрон, в то время как остальная часть газов проходит через него без препятствий. Первый фотодетектор измеряет интенсивность инфракрасного излучения после прохождения через воздух. Второй детектор является эталонным и закрыт оптическим фильтром с длинной волны, при котором поглощение CO2 отсутствует. Примерно раз в сутки датчик снимает показания c эталона. Любое изменение интенсивности во втором канале указывает на деградацию источника инфракрасного излучения. Датчик автоматически корректирует показания CO2 первого канала, чтобы предотвратить дрейф.
Датчик SCD30 имеет аж три интерфейса, мне для проекта был интересен только I²C. Чтобы его активировать нужно контакт «SEL» никуда не подключать или соединить с «GND». Бонусом идет внутренняя подтяжка 45кОм к 3в. Это значит, что скорее всего SCL и SDA не толерантны к 5в, будьте осторожны.
У сенсора SCD30 очень хрупкая оптическая система. Для получения паспортной точности его двухлучевая камера не должна соприкасаться с посторонними предметами и подвергаться сильным механическим воздействиям. Если по какой-то причине этого избежать не удалось, нужно перекалибровать сенсор (о том как это сделать читай ниже).
При размещении сенсора в корпусе нужно учитывать несколько факторов:
1. Для уменьшения время отклика на изменение CO2, датчик лучше располагать как можно ближе к вентиляционному отверстию. Если это не возможно, то внутренний открытый объем устройства должен быть как можно меньше.
2. Датчик нужно располагать как можно дальше от источников тепла. Если это не возможно вводим коррекцию температуры (об этом смотрите ниже).
3. Воздействие на сенсор прямого солнечного света может привести к колебаниям температуры, неправильным показаниям концентрации и преждевременному старению SCD30.
4. Любой поток воздуха вокруг датчика вызывает перепады давления и динамические колебания, что приводит к увеличению шума датчика и снижению точности.
Команды сенсору можно передавать в любой последовательности, но если хотите немного сэкономить на электричестве, то делать это надо строго по инструкции:
1. установить желаемый интервал измерения, если нужно
2. установить тип калибровки, если нужно
3. установить коррекцию температуры, если нужно
4. включить режим непрерывного измерения
1. Длительные интервалы измерения снижают энергопотребление, но делают датчик не способным отслеживать быстро изменяющихся концентраций CO2. На графике показана ситуация когда концентрация CO2 мгновенно увеличилась с 4000ppm до 10000ppm. Датчики с интервалами измерения 2сек и 5сек увидят это изменение меньше чем за 2 минуты. Датчик с интервалом 60сек аж за 7 минут и дальше только хуже. Это экстремальный пример, в реальной жизни CO2 меняется медленно и отклик сенсора намного быстрее.
С завода в датчик зашит интервал 2сек. Нам доступен диапазон 2сек..1800сек. Фирма Sensirion рекомендует избегать больших значений и не выходить за рамки 2сек..60сек.
sensorCO2.setMeasurementInterval(5);
2a. У сенсора предусмотренно два типа калибровки: ASC (automatic self-calibration) и FRC (forced re-calibration). Оба метода дают одинаковую точность измерения. Главное отличие в том, что для FRC нужен газ с известной концентраций CO2, а ASC находит эталонное значение CO2 сам. Обычно автоматическая самокалибровка ASC используется в зданиях где демонтаж датчика, для последующей калибровки с помощью FRC, затруднен. Идея метода в том, что если вентиляционная система здания спроектирована правильно, то хотя бы на 1 час в день уровень CO2 в комнате, где установлен сенсор, опускается до 400ppm. Датчик достаточно умён и может игнорировать высокие концентрации за последние пару дней. Однако высокий уровень CO2 в течении недель рано или поздно приведёт к дрейфу и искажению измерений с активной ASC. В этом случае выход только один — FRC калибровка. Фирма Sensirion не указывает интервалы FRC, но в других источниках пишут от 6 месяцев до 1 года. Насколько это правда не знаю, статистики пока нет. Вот так выглядит строчка вызова ASC в библиотеке:
sensorCO2.setAutoCalibration(true);
2b. Калибровку FRC можно проводить неограниченное число раз и она вступает в силу немедленно. Диапазон коррекции 400ppm..2000ppm. Последовательность действий следующая:
— активировать режим непрерывного измерения с интервалом измерения 2сек..5сек
— поместить сенсор в закрытую среду с известной концентрацией CO2. Самый доступный способ — вынести сенсор на свежий воздух, концентрация которого в нормальных условиях колеблется в диапазоне 350ppm…480ppm.
— убедится, что температура окружающей среды в пределах 0°C..+50°C, на сенсор не светит солнце и не дует ветер.
— после 2-х минут акклиматизации, установить значение FRC равное 400ppm.
sensorCO2.setManualCalibration(400);
3. Датчик SCD30 компенсирует само нагрев измерительной камеры с помощью встроенного сенсора SHT31. В случае когда в приборе рядом с сенсором присутствует дополнительный источник тепла одного SHT31 уже не достаточно для измерения CO2 с паспортной точностью. Для этого в сенсоре предусмотренна корректировка температуры. Последовательность действий следующая:
— включаем прибор, устанавливаем требуемую частоту измерения и даём прогреться всем компонентам в течении 10 минут.
— берём эталонный термометр и измеряем температуру окружающего воздуха возле прибора.
— находим разность температур снаружи и внутри и вводим коррекцию. Диапазон значений 0°C..+70°C с шагом +0.01°C.
sensorCO2.setTemperatureOffset(0.01);
4. Одним из недостатков измерения CO2 на основе принципа NDIR — зависимость от давления окружающей среды. Для этого в сенсоре предусмотрен механизм ее компенсации. Диапазон коррекции 700mBar..1400mBar или 0mBar если коррекция не нужна. Среднегодичное давление в моей местности 1013mBar. Постоянно увлекаться новыми значениями не стоит тк сенсор сохраняет все на флеш память, а она имеет ограниченный ресурс циклов записи.
sensorCO2.startContinuousMeasurement(1013);
В тех случаях когда данных по давлению нет, можно применить менее точную коррекцию по высоте над уровнем моря (altitude). Диапазон значений -3100m..+3300m. Для этого сначала отключаем коррекцию по давлению посылая 0mBar и шлем значение высоты над уровнем моря. Вот так это выглядит:
sensorCO2.startContinuousMeasurement(0);
sensorCO2.setAltitude(150);
Библиотека умеет читать версию прошивки. Мне прислали с 3.66
String version = sensorCO2.readFirmwareVersion();
Если сенсор завис, можно пробовать его оживить подав команду сброса. Сенсор перезапускается, загружает все сохраненные калибровки и включает режим непрерывного измерения если он был активен до сброса.
sensorCO2.reset();
Библиотека написана так, что при любой ошибке на шине I²C или не совпадении контрольной суммы во время обмена, вместо CO2, T, RH выдается значение 99999. Как бы намекая вам о проблемах. Дальше вы сами решаете выводить вам 99999, старое значение или код ошибки последней команды:
uint8_t error = sensorCO2.getCommandStatus();
Забирать библиотеку можно тут.
Теперь вы сами можете написать себе измеритель качества воздуха ну или подождать пока это сделаю я.