Telaire T6703

sadman41
Offline
Зарегистрирован: 19.10.2016

Есть ли альтернатива Winsen MH-Z19B? Проверяем...

sadman41
Offline
Зарегистрирован: 19.10.2016
Большая просьба не комментировать этот пост, так как возможны дополнение и актуализация сведений, приведенных в нем.
 
Думаю не сильно ошибусь, если напишу, что сразу же после измерения уличных, комнатных и собственных температуры, влажности и давления каждый ардуинщик, считающий себя приличным, начинает анализировать какой-нибудь газ, летающий вокруг него. И чаще всего под руку попадается диоксид углерода, в простонародье называемый Co2.
 
Случается это, как минимум, по двум причинам: во-первых - данная процедура кажется простой и доступной, во-вторых - на каждом углу интернетах пишут, что без fart-o-meter'a никакая метеостанция не может считаться завершённой, вследствие чего жизнь должна быть серой и унылой. Посему не буду подробно расписывать, что такое Co2 и с чем его едят - до меня уже многие постарались.
 
Впрочем, как показывает практика, простому или продвинутому мигателю неонкой достаточно знать ответ на два вопроса: при каком значений метрики полагается включать аварийную сирену и откуда эту метрику выудить.
 
Ответ на первый находим, например, в статье Тион-а"В российском ГОСТ 30494–2011 «Здания жилые и общественные. Параметры микроклимата в помещениях» указаны четыре класса помещений, в зависимости от уровня СО2. В двух словах эти классы выглядят так:
 
1 класс: СО2 до 400 ppm – отличный воздух, дышите на здоровье!
2 класс: СО2 от 400 до 600 ppm – хороший воздух, дышать легко.
3 класс: СО2 от 600 до 1 000 ppm – на нижней границе воздух еще нормальный, на верхней уже так себе.
4 класс: СО2 больше 1 000 ppm – недопустимое качество воздуха, срочно проветривать!"
 
Второй же вопрос может быть рассмотрен только в экспериментальном порядке, что я и попытаюсь проделать.
 
Варианты
 
Следом за возникновением желания измерить что-нибудь газообразное, витающее вокруг нюхательной области головы, либо же в теплице с огурцами, грибами и прочей флорой, у пытливого самодельщика немедля возникает вопрос - какие датчики по сходной цене он может раздобыть? Отвечаю:
 
1) Самые простые, дешёвые и, на мой взгляд, абсолютно бесполезные - из серии MQ, например MQ-135. Это электрохимические датчики, эксплуатирующие принцип изменения сопротивления проводника, покрытого оксидом олова (SnO2), при контакте с обнаруживаемым газом. Требуют предварительного прокаливания перед эксплуатацией (24 часа минимум), относительно длительного прогрева перед замерами, при этом не имеют никакой коррекции по температуре/влажности в точке замера, контактируют с чем попало - бензином, алкоголем и дымом, вследствие чего спиваю... деградируют с неприличной скоростью. Единственный видимый плюс такового датчика: простота считывания значений с него - обычным analogRead();
 
2) Поначалу вызывающие доверие своей стоимостью и подкупающие остальными параметрами MEMS(MOX)-датчики, разработанные для контроля качества воздуха (Air quality sensors) - AMS CCS811, Sensirion SGP-30 (о котором я уже писал) либо схожие. В сущности же они являются миниатюрными эквивалентами представителей семейства MQ, но уже снабжены цифровым интерфейсом (I2C/UART/PWM/etc). Так же в них применены продвинутые методы самоконтроля, калибровки и коррекции показаний в зависимости от иных параметров окружающей среды. Однако, селективность MOX-датчиков, как и у их прародителей, оставляет желать лучшего - они точно так же измеряют концентрацию множества летучих (ЛОС / VOC) органических соединений, хитроумным способом выводя из них эквивалент CO2 (а это не то же самое, что настоящий CO2). Более подробно см. в посте про Sensirion SGP-30;
 
3) Считающиеся наиболее точными на данный момент NDIR-сенсоры, об одном из которых и пойдёт речь далее. 
 
Внутренний мир NDIR-сенсора
 
Формулируя кратко можно описать его так: заключенная в корпус инфракрасная лампа периодически светит на детектор через фильтр, а некая микросхема превращает показания фотоэлемента в значения концентрации целевого газа (Co2).
 
single_beam.jpg
 
Любители науки могут просветиться тут"Недисперсионные инфракрасные (NDIR) датчики представляют собой простые спектроскопические устройства, часто используемые для анализа газов. Ключевыми компонентами являются инфракрасный источник (лампа), измерительная камера или световая трубка, фильтр длины волны и инфракрасный детектор. Газ накачивается или попадаем естественным образом в измерительную камеру, затем концентрация газа измеряется электрооптическим путем, благодаря поглощению определенной длины волны в инфракрасном спектре (ИК)."
 
Одним из неоспоримых достоинств датчиков, основанных на оптическом принципе измерения, является их долгая жизнь. Впрочем, в каждом справочном листе по датчику из семейства MQ так же приведена фраза "Stable and long life". Однако, мне с ходу не удалось найти время этой долгой и стабильной жизни...
 
Производители же NDIR-датчиков открыто заявляют о годах: Winsen MH-Z19B - 5 лет и более, Telaire 67xx - порядка 15 лет.  Однако, они не скрывают, что проблема деградации измерительной части существует и пытаются с ней бороться. Одним из таких способов является применение второго, контрольного, луча: "A dual channel sensor is made by two separate emitters, where one main emitter is doing the continuous measurements and the reference emitter will measure at lesser time intervals (e.g. once/day). The idea is that the wear and deterioration in the reference emitter will be negligible compared to the main one so that the sensor for the reference emitter can assume a fixed reference state from its factory calibration. The main emitter could light up about 40,000 more times than the reference emitter over the NDIR sensor lifespan. Receiving energy from the reference emitter, and comparing it to the main one, can then be used to predict and offset the resulting deterioration in the signal strength of the main emitter. "
 
Подробнее с вопросом можно ознакомиться в статье SINGLE BEAM VS. DUAL BEAM, из которой наверняка можно узнать о том, почему стоимость некоторых похожих друг на друга сенсоров может отличается в разы (Single channel T6703-5K стоит $25, а dual channel T6615-5K уже $85).
 
Во избежание совершения эмоциональных покупок и неоправданных растрат обращаю ваше внимание на заключение: "However, this does not work very well in practice, since there are many more causes to drift and ageing than only from emitter signal deterioration. Additionally, this setup comes with a higher price and makes for more cramped electronics or larger total sensor size."
 
T6703
 
Два года назад я, в режиме 24/7, начал эксплуатировать датчик MH-Z19B от компании Winsen. До сих пор этот датчик жив и показывает что-то похожее на правду (сверять не с чем, кроме своих собственных ощущений). На время покупки Z19B был, пожалуй, единственным приемлемым по цене (~$30) предложением на Aliexpress.
 
Сейчас его цена ниже примерно на треть ($18), что позволяет сенсору от Winsen сохранить лидерство среди NDIR-датчиков начального уровня. Тем не менее, определённые недостатки не давали ему стать моим кумиром и заставляли меня искать альтернативы. И, похоже, на рынке появился неплохие варианты для замены старичка Z19 - Senseair S8 и Telaire T6703. Стоимость обоих изделий в районе $25-$28, но, при этом, пользователь получает более совершенный в технологическом плане сенсор. 
 
Изучив справочные материалы и подкинув монетку, я решил начать испытания с T6703-5K (модификация с пределом измерения в 5000 PPM) . В ходе которых выяснил, что он, так же, как и MH-Z19B:
 
- Является одноканальным (single beam) датчиком;
- Питается от 5V и потребляет 200mA в пике;
- Выдаёт данные по интерфейсу UART/PWM;
- Имеет механизм самокалибровки (ABC logic);
- Выпускается в разных исполнениях: с пределом измерения 2000PPM, 5000PPM. 
 
При этом ещё и отличается в лучшую сторону:
 
- Подтверждённой службой поддержки и экспериментом толерантностью к 5V на цифровом интерфейсе. MH-Z19 таковым свойством официально не обладает, в datasheet приведён TTL level - 3.3V. Для модификации MH-Z19B в справочном листе есть примечание "Compatible with 5V", но я не рискнул палить свой единственный датчик;
- Дополнительными цифровыми интерфейсами I2C и UART с поддержкой RS-485 приёмопередатчиков;
- Полноценным ModBus протоколом;
- PWM 25kHz, позволяющим формировать аналоговое представление концентрации Co2;
- Статусными регистрами, отражающими "здоровье" датчика;
- Улучшенной ABC logic - самокалибровка производится на основании данных за 7 дней, а не за сутки, как у MH-Z19B. За счёт этого прибор должен выдавать более точные показания в редко вентилируемых помещениях;
- Выравниванием в течении первых 24-х часов работы функцией ABC "сдвига калибровки", вызываемого монтажными работами (например, пайкой);
- Увеличенным временем жизни. "15 years typical"  против "> 5 years" у MH-Z19B;
- Способностью работать до -10 градусов Цельсия;
- Чуть меньшим размером;
- Нормальной посадкой на сетку 2.54мм. У MH-Z19B приходилось подгибать выводы для закрепления на макетной плате.
- Отличной документацией от производителя;
 
Получение данных
 
В связи с тем, что датчик поддерживает протокол ModBus и имеет интерфейс UART, любой разумный человек имеет шанс за пять минут приделать его к переходнику USB-TTL и опросить чем-то вроде modpoll. Опытные ардуинщики легко подключат к делу библиотеку ModbusRTU и вытащат с сенсора всё, что душе заблагорассудится. 
 
Неопытным же предлагаю простенькую функцию, взаимодействующую с сенсором по протоколу I2C.
 
#include <Wire.h>

#define T67XX_I2C_ADDRESS                                       (0x15)

#define T67XX_I2C_REQUEST_SIZE                                  (0x05)
#define T67XX_I2C_RESPONSE_SIZE                                 (0x04)

#define T67XX_I2C_RESPONSE_DELAY                                (0x0A)

#define T67XX_I2C_FIELD_FUNCTION_CODE                           (0x00)
#define T67XX_I2C_FIELD_BYTES_COUNT                             (0x01)
#define T67XX_I2C_FIELD_DATA_MSB                                (0x02)
#define T67XX_I2C_FIELD_DATA_LSB                                (0x03)


uint8_t getT67XXMetric(uint8_t _i2cAddress, uint16_t* _value) {
  uint8_t rc = false;
  uint8_t rawData[T67XX_I2C_REQUEST_SIZE] = {0x04, 0x13, 0x8B, 0x00, 0x01};

  // Take PPM
  Wire.beginTransmission(_i2cAddress);
  Wire.write(rawData, T67XX_I2C_REQUEST_SIZE);
  Wire.endTransmission();

  delay(T67XX_I2C_RESPONSE_DELAY);

  if (T67XX_I2C_RESPONSE_SIZE != Wire.requestFrom(_i2cAddress, T67XX_I2C_RESPONSE_SIZE)) {
    goto finish;
  }

  for (uint8_t i = 0x00; T67XX_I2C_RESPONSE_SIZE > i; i++) {
    rawData[i] = Wire.read();
  }

  if (0x04 != rawData[T67XX_I2C_FIELD_FUNCTION_CODE] || 0x02 != rawData[T67XX_I2C_FIELD_BYTES_COUNT]) {
    goto finish;
  }

  *_value = ((uint16_t) rawData[T67XX_I2C_FIELD_DATA_MSB] << 8) | rawData[T67XX_I2C_FIELD_DATA_LSB];

  rc = true;

finish:
  return rc;
}


void setup() {
  uint8_t rc;
  uint16_t co2ppm = 0x00;

  Wire.begin();

  Serial.begin(115200);
  Serial.println("Telaire T6703 demo\n----------------------");

  while (true) {
    rc = getT67XXMetric(T67XX_I2C_ADDRESS, &co2ppm);
    if (rc) {
      Serial.print("["); Serial.print(millis()); Serial.print("] "); Serial.print("Co2 PPM: "); Serial.println(co2ppm);
    } else {
      Serial.println("Sensor failure");
    }
    delay(5000);
  }
}

void loop() { }

 

Всякие сравнительные графики будут размещены позднее, после первоначального накопления статистики.

sadman41
Offline
Зарегистрирован: 19.10.2016

Эксперимент #1. Жилая комната

MH-Z19B работал в составе "станции наблюдения", т.е. находился в боксе, который принудительной вентиляции не имел. T6703 стоял рядом с этим боксом, на открытом бредборде, и обдувался естественным образом при циркуляции воздушных масс по комнате. Днём я оставлял балконную дверь приоткрытой. Газового "застоя" не происходило и были созданы все условия для срабатывания ABC (Automatic Baseline Correction). Это можно видеть на втором графике - коррекция произошла где-то через сутки после первого включения. Как сенсор это отсчитал - для меня загадка, потому что часть этого времени он был обесточен.

График за 2 дня, на котором видно, что показания MH-Z19B и T6703 сначала различались на некоторую константу, затем сошлись.

Момент срабатывания ABC (Automatic Baseline Correction) в ~15:00

За 4 часа (с уже сработавшей ABC) - показания отличаются на пренебрежимо малую величину.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Надеюсь не испорчу тему. Потом удалю, если что. Просто факты. У меня станция Netatmo с измерением в т.ч. CO2. Читал в описаниях где то, что за "ноль" считается объем CO2 на улице и это считается значением около 400ppm (точно не помню). Вполне возможно "датчик", увидев, что примерно 500ppm было достаточно длительное время (явное дно на графике, а оно просто так (минимальное значение) вряд ли возможно), посчитал это "нулем" и внёс коррекцию. Я на своей станции этот процесс не наблюдал, впрочем и не был нужды. Работает вполне нормально, в openHab графики сохраняю, температуры, СО2. Так, иногда анализирую. CO2 - очень полезная информация для меня. Всё жалею, что не смог принудительную вентиляцию сделать в хате, временами дышать не чем, а окна не откроешь.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Вообще, все эти ABC logic - штуки "секретные" и патентованные, но в общем всё работает примерно так: есть некоторый период сбора данных, по прошествии которого из ряда семплов (конечно, наверняка не по единственному выбросу) выбирается наименьший и на основании его вычисляется поправочный коэффициент, который приводит то самое наименьшее значение к 400 PPM. Данный коэффициент действует на все выдаваемые наружу значения до очередной коррекции. 400 PPM - это некая договорная величина, которая в какой-то там год соответствовала "средепланетарному" уровню CO2. Этот "нормальный" уровень, конечно, мотает туда-сюда (см. https://www.climatecentral.org/news/world-passes-400-ppm-threshold-permanently-20738)... Дополнительной остроты в проблему реальности уровня Co2 добавляет факт того, что не у всех пользователей датчиков за период сбора нижняя граница будет 400PPM.

Поэтому всякие S8 с периодом сбора данных для ABC в 21 день, Telaire с периодом в 7 дней и пр. при определённых условиях будут несколько точнее, чем MH-Z19B. Однако, для пользователей, которые не живут в ямах с CO2 или около мусоросжигательных заводов и, хотя бы ненадолго, открывают окна (либо используют советские, "с естественным притоком") проблема занижения показаний является незначительной. У меня, к примеру, даже с закрытым окном, в течении рабочего дня, пока дома только кошка пукает, вполне себе наблюдается ~400PPM. Так что сенсору есть на что ориентироваться.

Ещё один способ борьбы с завышениями - принудительная калибровка в чистой среде и отключение ABC. В домашних условиях: попроветривал хорошенечко, дождался коррекции (или сам дёрнул сенсор за ногу), да ABC отключил.

Есть аппнота от Telaire по ABC logic, можно углубиться в алгоритм работы при наличии желания: http://www.powerandsignal.com/images/pdfs/AASTelaireABCLogic.pdf

ev3658
ev3658 аватар
Offline
Зарегистрирован: 25.04.2019

Создал простую программу для MH-Z19B для калибровки и проверки датчика: https://yadi.sk/d/Ih0MGx6P7D5rRQ

Надеюсь всё работает, вложил не задокументируемые функции. У меня датчик меньше 400 ни разу не показал.

sadman41
Offline
Зарегистрирован: 19.10.2016

Для пользователей опишите подключение к ПК.

ABC logic умеет отключать утилита?

ev3658
ev3658 аватар
Offline
Зарегистрирован: 25.04.2019

Я её особо не проверил. По ссылке буду обновлять если чего найду, хотелось бы по быстрей её допилить, так как позже придётся опять вкуривать в код.

Переключения диапазона в двух вариантах:

По поводу калибровки, тут есть вопросы, собственно и хочется это допилить:

 

Подключение простое, 5в. RX в TX и TX в RX - толерантен к ТТЛ уровню, но если переходник USB-RS232 имеет возможность переключение в 3.3в., грех ей не воспользоваться.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Это я к тому, что для MH-Z19B толерантность к 5V заявлена, а вот для MH-Z19 - нет. 

Насколько я читал - калибровкой можно угробить датчик (не "физически", а в смысле "способность к адекватному замеру"), так что неплохо бы предупреждение подвесить, думаю. Вкл/выкл ABC Logic безопасно, а вот остальное...

ev3658
ev3658 аватар
Offline
Зарегистрирован: 25.04.2019

MH-Z19 уже считается устаревшим продуктом и в продаже уже редко встречается, ему на смену пришел MH-Z19B. Думаю если кто приобрёл этот датчик испытает скорей  трудности в калибровке, для этого и написал простую программу, которую достаточно запустить, ну и спасибо мне за это))) Извините за глюки, мне она помогла, надеюсь и вам поможет, проверить нет возможности, но есть возможность в ближайшее время (несколько дней) внести коррекцию, что-то добавить или изменить.

В предупреждении нет смысла, но всё-же рассмотрю вариант. Добавил сброс, вроде у меня его сбросило после спонтанных калибровок.

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Так и калибровать его надо "в среде" - вот где засада.

ev3658
ev3658 аватар
Offline
Зарегистрирован: 25.04.2019

Добавил предупреждения, заодно и сообщение об отправленной команде.

Новая версия сама может калиброваться в комнатной среде, но думаю точней надо как-то в азотной среде, скоро проверю. 

sadman41
Offline
Зарегистрирован: 19.10.2016

MH-Z14 имеет такой же протокол, к слову... Можете расширить диапазон датчиков. Но он, по даташиту, не толерантен к 5V.

ev3658
ev3658 аватар
Offline
Зарегистрирован: 25.04.2019

Азот не нашел, аргон есть или можно гелий? Просто азот есть в атмосфере в большом объеме, по нему точнее калибровать.

sadman41
Offline
Зарегистрирован: 19.10.2016

Я, конечно, не химик, но если датчик должен измерять CO2, то зачем его калибровать по гелию?

ev3658
ev3658 аватар
Offline
Зарегистрирован: 25.04.2019

Сам смысл откалибровать на отсутствие СО2, лучше для этого использовать азот, его в воздухе полно.
Может я чего путаю, но у датчика при замыкании контакта калибровки на 7 сек.-калибровка на 400, при замыкании от 22 сек. калибровка на ноль СО2.
Автокалибровка не позволяет точно калибровать для использования вне жилого помещения.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, если на ноль, тогда логика прослеживается.

Я подумал, что в отсутствии CO2 на "нормальный" уровень (400PPM) планируется вывести.

ev3658
ev3658 аватар
Offline
Зарегистрирован: 25.04.2019

Если его использовать в домашней обстановке, то точная калибровка не нужна. 

А вот если в теплице или на улице (в подготовленной атмосфере), то тут уже нужно отключать автокалибровку и заранее откалибровать датчик, там в документаци написано.