После написания
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 выдается значение 55555. Как бы намекая вам о проблемах. Дальше вы сами решаете выводить вам 55555, старое значение или код ошибки последней команды:
uint8_t error = sensorCO2.getCommandStatus();
Забирать библиотеку можно
тут.
Дополнительная информация
Теперь вы сами можете написать себе измеритель качества воздуха ну или подождать пока это сделаю я.
Дополнительная информация
к примеру все хту21 дхт22 умирают при этой влажности через небольшое время
дхт11 работает без проблем но у него температура выводится без десятых в итоге приходится использовать в помещении дхт11 + дс18б20 + MH-Z19
DHT11 сильно врёт по влажности после 50%
Для комнаты остановился на Si7021 (тоже китайском, конечно) — вот уже 2-3 года показывает нормально. Причем, температура до сотых долей — это забавно. Можно поднести палец на сантиметр от датчика и наблюдать, как она медленно идет вверх.
я перешел на китайский AHT10. с равнивал с HTU21D — показания ноздря в ноздрю (с учетом паспортной погрешности).
тот же дс18б20 делает шаг 0,0625 градуса
Тут 0.01 градуса (на самом деле, даже чуть лучше, не помню сколько), полноценные два разряда после запятой. Да, на практике такое разрешение особо не нужно, но с ним можно быстрее определять изменение температуры. Например, вчера утром сотые доли увеличивались прямо на глазах, примерно по 1-й в пол минуты. Стало понятно, что будет жарко )
Ну а так, да — плюсы датчика описал ниже enjoyneering. Этого не отнять. Ну и то, что за 2 или 3 года эксплуатации он все еще показывает более-менее актуальные значения.
Боюсь, на термисторе будет слишком много шума.
Про SenseAir S8 читаем тут ближе к середине.
В абсолютных, как ни удивительно, — 400 миллионных долей (0,04 сотые доли)
P. S. люди с ума посходили с датчиками CO2 — мол как много аренда, надо постоянно дома и на работе мониторить! На самом деле — нет. Да, количество его влияет но далеко не так, как это расписывают.
можно же и на жигулях ездить, но на иномарке приятнее. так и тут, с мониторингом co2 — с ним ты вседа знаешь когда проветривать и почему у тебя голова чугунная, а до этого просто списывал на плохую погоду.
— до 600 ppm вообще никак не ощущается;
— от 600 до 1000 начинает появляться усталость, утомленность;
— после 1200-1300 становится просто тяжело, думать вообще не хочется.
А на счет датчиков — на предыдущей работе поначалу свято верили в то, что при включении кондиционера все окна надо наглухо закрывать, и что холодный воздух не может быть душным (хоть и айти контора). Пришлось нести датчик на работу, показывать цифры, тыкать в ссылки. Примерно за 30 минут с закрытым окном концентрация с 600 поднималась до 1400-1500, становилось просто невыносимо душно. Стали оставлять одно окно приоткрытым, ситуация улучшилась. Потом купили готовый датчик, который еще и пищит при повышении концентрации — стало вообще удобно. Запищал — надо открыть окно, проветрить.
Излишняя проветриваемость зимой может дать осушение воздуха и вирусы в легких, что еще хуже.
А так верно, следить за СО2 в воздухе нужно и не доупускать концентрации выше 30 000 PPM, лучше не более 5 000 PPM. Такое может быть в палатке или под одеялом когда от комаров прячешься.
Другая крайность гнаться за 600 ppm, такие есть, у них вентиляторы гонят в помещение тысячи кубометров воздуха с улицы, если на улице мороз на подогрев воздуха может уйти 10 кВт энергии, а на увлажнение сотни литров воды в сутки.
Датчики СО2 отличный инструмент, по ним можно определить присутствие человека в комнате, оценить приток воздуха достаточно точно. Но низкий СО2 не самоцель. Вот пример у пловцов, они на одном вдохе пол бассейна проплывают, концентрация СО2 на выдохе под 100 000 ppm, и это только на пользу идет всем органам. А у офисных сотрудников условно 600 ppm и уже голова болит, мысль не идет и т.п.
Есть нормы для ОБЫЧНЫХ людей — 400ppm...1000ppm, дальше плохо. И подвоников которые по 3 месяца по водой без свежего воздуха, и плавцов которых отбирают с уникальными данными, сюда мешать не надо. Серой массе, как нам с вами, уже при 1000ppm будет не очень комфортно.
Соответственно даже в обычном режиме на происходящее в легких особо не повлияет, что там на вдохе 0.04% СО2 или 0.08%, на выдохе все равно будет 4.5%. Задерживая дыхание увеличиваем концентрацию, ускоряя дыхание снижаем. Так называемая практика холотропного дыхания, от которой наступают веселые глюки мозга:
Условно человек выделяет СО2 килограммами, а некоторые поднимают панику из-за микрограмм СО2 в воздухе, что нелепо.
На предыдущей работе одна девушка всерьез считала, что вода из кондиционера капать не должна, это некий «аварийный» слив, и что если оттуда она сильно капает, что-то не так. При этом аргументировала она свои слова тем, что несколько лет до этого продавала кондиционеры. А какого-то человека из прошлого, кто открывал окно при кондиционере считала ненормальным.
Может и так, до измерения таких параметров я не доходил ) А может еще дело привычки — дома у меня редко бывает выше 1000, т.к. обычно (даже зимой) чуть открыто окно и оттуда приходит свежий воздух. А если привыкнуть жить при 2500 ppm, но 5К восприниматься будут иначе.
Это вопрос отдельный, поэтому наиболее эффективны рекуперативные системы вентиляции, где выходящий воздух отдает свое тепло и влажность входящему. Правда такие штуки достаточно дорогие и редкие.
Если вентиляция нормально работает, окна открывать незачем.
Ни скорости, ни супер точности.
Но есть полезный i2c вместо кучи проводов с uart.
насамом деле у SCD30 дела не так плохи, силушку там надо хрошо приложить, чтоб все поплыло. просто Sensirion подстраховывается.
опять же и ваш mh-z19b сразу не увидит этого скачка, физику не обманешь. просто китайцы скромно об этом молчат.
в реальнх условиях таких резких изменений аж на 6000ppm сразу не бывает, а на малых скачках CO2, время детектироания у SCD30 уменьшается до 10сек.
Думаю что алгоритм самокалибровки у SCD30 наамного совершеннее чем у Z19B.
У вас в легких на выдохе 50 000 PPM, на этом фоне концентрация СО2 во вдыхаемом воздухе не имеет значения.
Да и машине новый фильтр не нужен, зачем? На выходе же чистый co2.
Никак не инертный он, просто В ТЕХ реакциях не участвует. В основном.
зачем? для нормальной работы катализатора?
Кстати, точно такая же функция лямбда зонда. Измерять концентрацию кислорода. И во всех современных авто есть два зонда — до и после катализатора. И с их помощи блок управления вычисляет, сколько топлива надо. И (почти) всегда ДВГ работает на обедненной смеси, т.е. топливо меньше, чем в стехиометрической. Как следствие — избыток кислорода.
А на чем основано утверждение «лучший из доступных CO2 сенсоров»?
Чем он лучше «народного» S8?
Про автокалиброку, 40ppm и 8 дней я вкурсе. Но судя по написанному в статье у SCD30 тоже показания уплывают. Уплывают кстати как часто и насколько? (про S8 такие данные есть)
Ну и без банального сравнения (хотя бы в месяц в непроветриваемом\проветриваемом помещении) с S8 утверждения про «лучший» выглядят несколько «громкими».
З.Ы. SCD30 в руках не держал, а вот несколько самоделок на S8 (штук так 5-7) есть, + оба Xiaomi + с десяток MH-Z19 в ящике.
З.Ы.Ы. У некоторых моих самоделок на китайском S8 правило в смещение на 40ppm не работает. Через 8 дней легко показания уплывают на 100+. Есть предположение что на али S8 таки несколько «поддельные» или бракованные. По этому сравнивать SCD30 лучше таки с оригинальным S8 купленном не у китайцев.
З.Ы.Ы.Ы. Самоделки на S8 работают 24\7 уже более 3 лет в разных квартирах. Щас вот (чуть больше года) рядом с некоторыми еще и Тионовские девайсы на CM1108 (про сравнение SC30 с ним даже спрашивать не буду...) У меня достаточно данных для анализа поведения в различных условиях. Надо бы SCD30 тоже прикупить и повесить рядом.
— SCD30 двухлучевой, а S8 с одним
— у SCD30 куча компенсации, у S8 ничего нет.
Это все исходя, что оба сенсора сделаны одно фирмой.
Что вы скажете о MH-Z19? Как он по сравнению с S8? Как вам CM1108?
Вместе с ним пришли и менее лучшие SHT40, SHT30 и BMP280. Углекислый газ они не измеряют, но пересекаются с SCD30 по измерениям температуры и влажности.
Так вот, с ходу из коробки у меня эти датчики сошлись друг с другом и термопарой мультиметра, а SCD заметно из них выбивается что смущает. Стоит всё на одной макетке в соседних дырках, нагревательных элементов нет.
Температура выглядит примерно так (сами плавающие показания это ок, я экспериментировал), SCD30 показывает стабильно на градус больше. Влажность же стабильно на 5% выше SHT40.
Это я конечно могу починить программно, но меня всё-равно смущают такое сильное отклонения от консенсуса. А CO2 и не откалибровать особо, не в лес же датчик нести выгуливать.
Кажется по даташиту поправку по температуре можно загнать в датчик.
Относительно повторяемости по СО2 я сравнил его с заводским Autopilot APCEM2, так вот, после 6 часов работы сенсириона показания один в один с заводским. Потому можно доверять.
Я тоже в принципе SCD30 брал не для температуры и если она врёт не так страшно, но он ведь эту температуру использует и в компенсации расчётов CO2. Не очевидно, будет ли заданный оффсет там тоже учитываться.
Температура похоже что не на константу завышена, а разница растет с ростом температуры, то есть дельта = к*T, и при некоторой температуре может быть нулевой.
Или только самому делать?
Либо искать кто сделает готовое на заказ.
Я не спорю, может этот датчик и лучше остальных, но насколько он лучше и в чем совершенно не раскрыто. Может вся его «лучшесть» не несет смысла в бытовом применении, а может несет, но выигрыш от нее настолько мал, что более высокая цена ее напрочь убивает.
SCD30, мне порекомендовали тут на муське пару лет назад. После я ещё отзывы читал. Все отмечали хорошую точность, высокую стабильность и кучность результатов. Из доступных он выглядит самым привлекательным. Тогда его не купил, жаба задушила $50 отдавать. Щас он подешевел и деньги лишние появились.
Говорят, что они показывают попугаи, те то что они выводят не соответствует реальным значениям co2.
Вы их сравнивали хотя-бы с MH-Z19?
— работает медленнее всех конкурентов,
— при опросе раз в 30 секунд примерно каждый десятый ответ — NA,
— требует тип float, что не для всех микроконтроллеров приемлимо,
— склонен к завышению показаний на 100-150ppm, в сравнении с другими, в том числе двухкамерными сенсорами,
— врет по температуре (это можно скомпенсировать), и по влажности (это скомпенсировать не получится).
А вы перед чтением measurement ready status проверяете?
Тогда зачем
и вообще все танцы со стабилизацией и поправками, если всё точно по самокалибровке?
Из опыта знаю, что основная проблема всех газоанализаторов: это правильная калибровка и регулярная поверка дрейфа этой самой калибровки. Обрадовался, что наконец-то увидел двулучевой нормальный датчик СО2 на ИК — и тут такая шляпа.
имелось ввиду, что при всех соблюденных условиях ASC и FRC даст точность измерения CO2 ±(30ppm + 3% от ИВ) в диапазоне 400ppm..10000ppm
условия для FRC:
для ASC читаем в статье, лень копипастить.
Есть такая штука: СанПиН 2.1.3685-21. Там говорится, что в воздухе рабочей зоны максимально разово допускается 27000 ppm углекислого газа, а среднесменно значение не должно превышать 9000 ppm. На 9000 (что в диапазон попадает и очень хорошо) ошибка составит 30+3*9000/100=300 ppm или 3,3%. Это на самом деле неплохо.
Калибровка по воздуху — тоже неплохо, и в принципе 400 ppm — самое то, судя по статистике.
Только анализаторы никто не калибрует по точке в начале измеряемого диапазона. В лучшем случае — середина, а идеально — верх. И я поясню, почему.
На точке 400 ppm анализатор даст ошибку 30 + 3*400/100 = 42 ppm или 10,5%. Эта ошибка в итоге «размажется» по всему диапазону и показывать он будет ерунду. Я уже молчу, что 400 — эта самая первая точка измеряемого диапазона, а что будет, если «повезёт» и в воздухе окажется 380 ppm, а не 400? Ведь по характеристикам датчик ниже 400 не измеряет! Это как откалибровать весы, на которых будем сами взвешиваться, стограммовой гирькой.
Короче говоря, я понял. Идея хороша — но организация от разработчика, как всегда, абсолютно безграмотна. Да, компоненты может и хорошие, но из-за бестолковой реализации получился очередной показометр.
Жаль.
На калибровке в середе газа с концентрацией 400ppm он не даст никакой ошибки, он лишь скопирует ошибку концентрации эталонного газа.
Реализация нормальная, как у всех NDIR датчиков и даже лучше. У вас просто ожидания на счёт датчика не сошлись с действительностью, вот вы и придираетесь.