И снова датчик углекислого газа (CO2) "MH-Z19B". Обзор - предостережение


Было куплено 2 одинаковых (MH-Z19B) датчика в разное время в разных магазинах с интервалом в 3 месяца.
После недели мучений и разного рода тестов пришел к неутешительным выводам — в DIY можно использовать эти датчики только при условии покупки оных в количествах 10 штук в разным магазинах и последующей отборке.

Этот обзор — скорее обзор предостережение + рабочий скетч для чтения датчиков по всем 3м каналам. Поэтому фоток тут не будет, немного текста и сухих выводов.
Для желающих именно обзора датчика — оставлю пару ссылок на достойные статьи — обзоры:
РАЗ
ДВА
Итак, вначале был куплен один датчик (хотел собрать монитор воздуха по статьям на Хабре и на Муське) и пока ехали все остальные детали немного с ним поигрался. Потом не было время, позже появились еще идеи для использования второго датчика в другом устройстве и в итоге был заказан второй датчик. После получения второго датчика я его проверил (чтоб в случае фэйла открыть диспут). Датчик так же «правильно» работал, как и первый.
Спустя пару недель выдалось свободное время и я решил поиграться с датчиками и своим вторым проектом в котором хотел его использовать. Меня насторожило то, что играясь то с одним, то со вторым датчиком я получал разные показания ppm в комнате. Причем не в пределах погрешности, а весьма разные, доходило до двойной разницы. При этом на улице оба датчика нормально показывали 400ppm. Калибровка по «уличному» воздуху ситуацию не изменила.
Опустим мои почти недельные метания с этими датчиками — я перепробовал всё! но дело с мертвой точки не сдвинулось — они тупо по-разному считают концентрацию и выводят разные значения. Дело не в калибровке, а в их внутреннем «коэффициенте пересчета» Причем по всем 3м выходам (UART, PWM, Analog) данные коррелируют между собой. При этом напряжение с аналогового вывода тоже не решает ситуации — оно точно так же жестко соответствует показаниям UART. И если 2 датчика находятся в одинаковой среде, 1 показывает 940ppm имея на аналоговом выходе 700мВ, а второй 1300ppm с выходом 820мВ, то если при повышении концентрации первый насчитает свои 1300ppm -то его аналоговый выход точно так же будет отдавать 820мВ (при этом второй датчик будет показывать уже порядка 1900ppm/990мВ)
Что я пробовал (по отдельности и совмещая несколько или все из ниже перечисленного):
1) калибровку (многократную) по «уличному воздуху» методом замыкания пина Hd на время >7сек
2) калибровку по воздуху «чуть более 400ppm» — т.е. одновременно заношу датчики с улицы в дверной проём и как только один из них начинает регистрировать повышение СО2 — оба одновременно калибрую на 400
*** (п1. конечно соответственно датащиту только после >20 минут работы на улице, п2. сначала 20+ мин работы на улице, потом в дверной проём, ну и как только регистрирую рост — обнуление). Дабы не вносить «свой СО2» от кожного или легочного дыхания — калибровал датчики через закрытую балконную дверь, для чего от датчиков протянул 2 кнопки на шлейфах под дверью, дверь конечно закрывал.
3) команду запрета ABC (самокалибровки) при инициализации датчиков
4) команду принудительной работы в диапазоне 5000ppm
5) питание напрямую от павербанка
6) конвертеры уровня 5V<=>3.3V и обычные резистивные делители.
7) монтаж делал плоскими шлейфами минимально комфортной длинны.
8) множество разных скетчей, 3 разных ардуины (последнее скорее просто так вышло, а не специально)

В итоге что мы имеем:
1) Стартуют датчики после калибровки в 400 ppm все равно не равномерно, запаздывание одного из них порядка 50 ppm (т.е. когда первый уже начал показывать 450+, второй только начал регистрировать изменения). Это первый минус этих датчиков — они не показывают значения меньше 400 ppm, ни по UARТ, ни по PWM, ни по Analog. Точнее они отдают минимально возможные значения (длительность ШИМ вывода пропорционально снижается до 400ppm, после чего остаётся на этом уровне, точно так же и с напряжением — оно снижается до 400мВ, после чего остаётся на этом значении).
2) Дальнейшая регистрация ppm идет с нелинейным разбросом, если на старте отличие показаний около 10%, то к 1300ppm разбег составляет 30%, и дальше растет еще сильнее, аж до 100% при значениях около 3000ppm.
3) Я не нашел способа это исправить…

ИТОГО — если купить 1 датчик — он выглядит порядочно и создает впечатление нормальной работы. Если тестировать датчики в диапазоне 400-800ppm то тоже можно сказать что в принципе показания соответствуют регламентированным допускам (50ppm+5%), но как показала практика — реально эти датчики могут показывать что угодно. Для использования в сколько нибудь ответственных проектах нужно покупать много датчиков (а еще лучше много датчиков разных производителей) и выбирать из них те, что выдают правдоподобные, одинаковые значения на всем диапазоне их работы.

Бонусом под спойлер прячу скетч для ардуины для одновременного тестирования 2х датчиков с выводом показаний по всем трем каналам на 1602 дисплей. НЕ делал вывод на монитор, поскольку для калибровки на балконе «тестовый стенд» должен быть мобильным. Скетч можно масштабировать при наличии 2004 или бóльшего дисплея. Сам код скетча проверен и 100% работоспособен. Другие «рабочие скетчи или модули» обрабатывали данные так же.

Надеюсь кому то эта информация будет полезна.

PS. Извиняюсь за слегка сумбурное повествование, не было в планах писать обзор, это скорее сухая выжимка фактов для тех, кто захочет использовать эти и подобные датчики в своих самоделках. Очень мало свободного времени, поэтому «не причесывал» текст. Спасибо за понимание.

Дополнительная информация
// Подключение LCD (1602 с контроллером HD44780)
// LCD RS pin to digital pin 7
// LCD Enable pin to digital pin 6
// LCD D4 pin to digital pin 5
// LCD D5 pin to digital pin 4
// LCD D6 pin to digital pin 3
// LCD D7 pin to digital pin 2
// LCD R/W pin to ground
// LCD VSS pin to ground
// LCD VCC pin to 5V
// 10K resistor: ends to +5V and ground, wiper to LCD VO pin

/*
— Подключение датчиков-------------
первый подключается к: второй подключается к:
Arduino | 1 CO2 sensor MH-Z19B Arduino | 2 CO2 sensor MH-Z19B
pin A0 | RX pin A2 | RX
pin A1 | TX pin A3 | TX
pin A4 | Vo pin A5 | Vo
pin 10 | PWM pin 11 | PWM
GND и Vcc (земля и питание) датчиков подключаем соответственно к массе и к +5В ардуины
ВНИМАНИЕ! UART шину данных к Ардуино подключаем только через конвертер уровней 5V <=> 3.3V
*/

#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
#define zm1_pwm_pin 10
#define zm1_a_pin A4
#define zm2_pwm_pin 11
#define zm2_a_pin A5
SoftwareSerial zm1(A0, A1); // RX, TX
SoftwareSerial zm2(A2, A3); // RX, TX

int zm1_t = 0;
int zm1_ss = 0;
int zm1_co2 = 0;
int zm2_t = 0;
int zm2_ss = 0;
int zm2_co2 = 0;
byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
byte abc[9] = {0xFF,0x01,0x79,0x00,0x00,0x00,0x00,0x00,0x86};
unsigned char response2[9];
unsigned char response1[9];
int ppm1 = 0;
int ppm2 = 0;
int anlg1 = 0;
int anlg2 = 0;

void setup() {
// Serial.begin(9600); // нужно только для дебага, в этом скетче нету вывода в консоль, не спользуется.
lcd.begin(16, 2);
pinMode(zm1_pwm_pin, INPUT);
pinMode(zm1_a_pin, INPUT);
pinMode(zm2_pwm_pin, INPUT);
pinMode(zm2_a_pin, INPUT);
while(zm1_pwm_pin == LOW || zm2_pwm_pin == LOW ){
lcd.setCursor(0, 0);
lcd.print("*Now Warming Up*");
lcd.setCursor(0, 1);
lcd.print("**Please wait!**");
}
//----------- конфигурируем 1 датчик
zm1.begin(9600);
delay(100);
zm1.write(abc, 9); // запрещаем автокалибровку
//-------- Задаем принудительно работу в диапазоне 5000ppm
byte setrangeA_cmd[9] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x13, 0x88, 0xCB};
unsigned char setrangeA_response[9];
zm1.write(setrangeA_cmd,9);
zm1.readBytes(setrangeA_response, 9);
int setrangeA_i;
byte setrangeA_crc = 0;
for (setrangeA_i = 1; setrangeA_i < 8; setrangeA_i++) setrangeA_crc+=setrangeA_response[setrangeA_i];
setrangeA_crc = 255 — setrangeA_crc;
setrangeA_crc += 1;
lcd.setCursor(0, 0);
if ( !(setrangeA_response[0] == 0xFF && setrangeA_response[1] == 0x99 && setrangeA_response[8] == setrangeA_crc) ) {
lcd.print(«RangeERR» + String(setrangeA_crc) + "/"+ String(setrangeA_response[8]));
} else {
lcd.print("*Range was set!*");
}
zm1.end();
delay(100);
//----------- конфигурируем 2 датчик
zm2.begin(9600);
delay(100);
zm2.write(abc, 9); // запрещаем автокалибровку
//-------- Задаем принудительно работу в диапазоне 5000ppm
byte setrangeB_cmd[9] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x13, 0x88, 0xCB};
unsigned char setrangeB_response[9];
zm2.write(setrangeB_cmd,9);
zm2.readBytes(setrangeB_response, 9);
int setrangeB_i;
byte setrangeB_crc = 0;
for (setrangeB_i = 1; setrangeB_i < 8; setrangeB_i++) setrangeB_crc+=setrangeB_response[setrangeB_i];
setrangeB_crc = 255 — setrangeB_crc;
setrangeB_crc += 1;
lcd.setCursor(0, 1);
if ( !(setrangeB_response[0] == 0xFF && setrangeB_response[1] == 0x99 && setrangeB_response[8] == setrangeB_crc) ) {
lcd.print(«RangeERR» + String(setrangeB_crc) + "/"+ String(setrangeB_response[8]));
} else {
lcd.print("*Range was set!*");
}
zm2.end();
delay(2000);
}

void loop() {
// ***** узнаём концентрацию CO2 через UART: *****
zm1.begin(9600);
zm1.write(cmd, 9);
memset(response1, 0, 9);
zm1.readBytes(response1, 9);
int i;
byte crc = 0;
for (i = 1; i < 8; i++) crc+=response1[i];
crc = 255 — crc;
crc++;
if ( !(response1[0] == 0xFF && response1[1] == 0x86 && response1[8] == crc) ) {
lcd.setCursor(0, 0);
lcd.print(«zm1 ERR: » + String(crc) + "/"+ String(response1[8]));
} else {
unsigned int responseHigh = (unsigned int) response1[2];
unsigned int responseLow = (unsigned int) response1[3];
unsigned int responseTT = (unsigned int) response1[4];
unsigned int responseSS = (unsigned int) response1[5];
zm1_t = responseTT-40;
zm1_ss = responseSS;
zm1_co2 = (256*responseHigh) + responseLow;
};
// ***** узнаём концентрацию CO2 через PWM: *****
unsigned long th, tl;
do {
th = pulseIn(zm1_pwm_pin, HIGH, 1004000) / 1000;
tl = 1004 — th;
ppm1 = 5000 * (th-2)/(th+tl-4); // расчёт для диапазона от 0 до 5000ppm
} while (th == 0);

// ***** читаем по аналогу: *****
anlg1 = analogRead(zm1_a_pin); // показания на экране отображаются в АЦП «попугаях», а точнее в 5/1024 В, для вывода в вольтах не хватило разрешения дисплея.
zm1.end();
delay(1000);
// ***** узнаём концентрацию CO2 через UART: *****
zm2.begin(9600);
zm2.write(cmd, 9);
memset(response2, 0, 9);
zm2.readBytes(response2, 9);
crc = 0;
for (i = 1; i < 8; i++) crc+=response2[i];
crc = 255 — crc;
crc++;
if ( !(response2[0] == 0xFF && response2[1] == 0x86 && response2[8] == crc) ) {
lcd.setCursor(0, 1);
lcd.print(«zm2 ERR: » + String(crc) + "/"+ String(response2[8]));
} else {
unsigned int responseHigh = (unsigned int) response2[2];
unsigned int responseLow = (unsigned int) response2[3];
unsigned int responseTT = (unsigned int) response2[4];
unsigned int responseSS = (unsigned int) response2[5];
zm2_t = responseTT-40;
zm2_ss = responseSS;
zm2_co2 = (256*responseHigh) + responseLow;
};
// ***** узнаём концентрацию CO2 через PWM: *****
unsigned long th2, tl2;
do {
th2 = pulseIn(zm2_pwm_pin, HIGH, 1004000) / 1000;
tl2 = 1004 — th2;
ppm2 = 5000 * (th2-2)/(th2+tl2-4); // расчёт для диапазона от 0 до 5000ppm
} while (th2 == 0);

// ***** читаем по аналогу: *****
anlg2 = analogRead(zm2_a_pin); // показания на экране отображаются в АЦП «попугаях», а точнее в 5/1024 В, для вывода в вольтах не хватило разрешения дисплея.
zm2.end();

//---------------------- Выводим на дисплей — // первое значение на экране «u» юзначает данные полученные по UART, второе — «w» по PWM, третье — «a» по Analog портам.

lcd.clear();
lcd.setCursor(0, 0);
lcd.print(«u»); lcd.print(zm1_co2);
lcd.setCursor(5, 0);
lcd.print(" w"); lcd.print(ppm1);
lcd.setCursor(11, 0);
lcd.print(" a"); lcd.print(anlg1);
lcd.setCursor(0, 1);
lcd.print(«u»); lcd.print(zm2_co2);
lcd.setCursor(5, 1);
lcd.print(" w"); lcd.print(ppm2);
lcd.setCursor(11, 1);
lcd.print(" a"); lcd.print(anlg2);

delay(5000);
}

Планирую купить +21 Добавить в избранное +62 +86
+
avatar
  • metsys
  • 26 октября 2019, 16:33
0
а кроме обозреваемых, есть в продаже датчики, показаниям которых можно доверять? Возможно их стоимость выше, но вопрос в плане реальности существования онных. Если к примеру 90% измерителей из бытового сектора построены на ещё более худших датчиках, то чем тогда достоверно мерять в принципе?
+
avatar
+5
Я не особо копал в эту сторону, из того что знаю — достоверно — только хроматографическая спектрометрия газов… Что естественно нереально в DIY проектах. А так — все NDIR датчики сделаны на одном и том же принципе, у всех одни и те же «детские болячки», как, например, путание СО2 и водяного пара, т.к. они имеют одинаковую волну поглощения ИК спектра. Поэтому в NDIR датчиках применен костыль — термометр и гигрометр для математической компенсации показаний.
Хорошая новость в том, что Infenion обещает в 2020 году новый тип датчиков основанный на акустической спектрометрии. Посмотрим что это будет…
+
avatar
+2
На днях должен прийти CCS811. У него не оптический датчик, а «integrates metal oxide (MOX) gas sensor».
Придет — сделаю обзор на этот датчик CO2 и летучих загрязнений воздуха.

В доках на CCS811 не скрывается, что есть зависимость от температуры и влажности. Сказано, что если есть данные от внешнего датчика температуры и влажности — запишите в специальный регистр чипа для компенсации. Если данных нет — по умолчанию 50% влажности и 25 градусов цельсия.
+
avatar
+4
MOX это вообще рандомный попугаеметр. Он реагирует вообще на всё. На парфюмерию, спирты, эфиры, ароматические углеводороды… легче перечислить то, на что он НЕ реагирует ) Соответственно в роли избирательного датчика СО2 он совершенно не применим…
+
avatar
+2
А где вы вообще избирательные датчики в дешевом сегменте видели? Тут и в лаборатории бывает замучишься газ очищать.
Для летучих — действительно «показометр». А по СО2 — в принципе для дома очень высокой точности не нужно.
+
avatar
+2
А по СО2 — в принципе для дома очень высокой точности не нужно.
Если бы все было так просто ;)
Я читал отчеты, то ли на Муське, то ли на Хабре, как такого плана датчик СО2 реагировал на парфюм девушки, причем на столько яростно реагировал, что на обычный нормальный запах сигнализировал двойной передоз СО2 :D А когда этот товарищ воспользовался освежителем в туалете — датчик зашкалило :D
Очевидно, что в обоих случаях СО2 не повышалось (ну ОК, в первом девушка что-то там надышала, но явно не на столько).
+
avatar
0
Вот и проверю. Освежитель и жена с косметикой в наличии.
+
avatar
  • Um-ka
  • 28 октября 2019, 09:56
0
Уже проверил год назад. Один 811 сам помер через 2 часа работы, второй совершенно странное выдает. Не советую брать. Игрушка.
+
avatar
0
CCS811 это датчик летучих органических соединений в первую очередь, а что касается CO2, он просто отображает некоторое сферическое в вакууме эквивалентное значение. Плюс желательно этому датчику передавать значения влажности и температуры, чтобы он на основании этих данных делал поправку.
Я CSS811 использовал в тандеме с MH-Z19 и если верить графикам — эти датчики замеряют совершенно разные вещи. Мне даже показалось что CSS811 куда больше подходит для оценки качества воздуха в помещении.
+
avatar
  • Artik555
  • 11 февраля 2021, 19:33
0
о, так это получается CCS811 отлично покажет если всякие крашенные поверхности в комнате выделяют в воздух вредные вещества?
+
avatar
  • xtmp
  • 29 октября 2019, 01:07
0
пробовал такой, и с компенсацией и без. Показывает «погоду на марсе»
+
avatar
  • 644052
  • 26 октября 2019, 16:54
-11
+
avatar
  • led178
  • 26 октября 2019, 17:10
0
Купил я недавно Uni-T A37, первую неделю все было вроде хорошо, а потом он начал очень резко показания поднимать. Зашел в комнату, через десять минут уже орет. Калибровал, загородный дом. Вот и сейчас стоя в полутора метрах от открытого окна показывает 770.

(Про прибор было здесь mySKU.me/blog/china-stores/74329.html, датчик CM1106, производитель Wuhan Cubic Optoelectronics Co., Ltd.)
+
avatar
  • 2gusia
  • 26 октября 2019, 17:22
0
У него не отключаемая автокалибровка. После калибровки по свежему воздуху тоже врет?
+
avatar
  • led178
  • 26 октября 2019, 18:29
0
Знаю. А врет ли? Сравнивать то не с чем. Сейчас 930, окно открыто, один человек, из окна дует.
На улицу вынести будет 400.
+
avatar
  • 2gusia
  • 26 октября 2019, 18:41
0
Я бы сказал, что цифры в пределах возможного. А проверить только сравнением. Где вот только эталон взять…

Я в принципе даже думал над экспериментом. Взять канистру-бочку свежего воздуха, убедиться, что в ней показывает как свежий, ничего из стен (металлической?) канистры не набежало. Добавить туда заранее взвешенное кол-во сухого льда.

Но это раньше сухой лед был у любой мороженщицы, ща искать надо…
+
avatar
  • rx3apf
  • 26 октября 2019, 22:57
0
Но сейчас есть баллончики для сифонов и пневматики (8 и 12 гр).
+
avatar
  • 2gusia
  • 26 октября 2019, 23:33
0
Я могу довольно точно взвесить сухой лед. А вот понять сколько азота в том баллончике не смогу.да и дозировать труднее.

Зы написал и стал считать

8 гр хватит как раз добавить 400ppm к 10000 литрам воздуха. Комната 3*5*2 это 30тыс литров. То есть берем баллончик и вентилятор и можно бы калибровать — кабы знать сколько там примесей :)
+
avatar
  • rx3apf
  • 26 октября 2019, 23:43
0
Теоретически там сжиженный CO2. Азот при таких давлениях не сжижается, так что если и присутствует, то в мизерном количестве. Соглашусь, что с твердым вариантом было бы точнее, но нынче доступность стала меньше, да. А баллончики — везде есть.
+
avatar
  • 2gusia
  • 26 октября 2019, 23:47
0
Жидкая? Я взглянул, при 20 С для этого надо 60 атмосфер. Думаю, при таком давлении и азот много места не займет. Да и для баллончика вроде многовато, запас же нужен
+
avatar
0
для калибровки по «баллончику» его надо в герметичном ангаре вскрывать… Для примера в выдохе человека примерно 4.5% СО2, что соответствует 45.000ppm, что в 9 раз выше шкалы датчика. Концентрация от вскрытого баллончика будет на порядки выше.
Впрочем с сухим льдом та же история… + к тому же пока взвесишь, пока в гермокамеру донесешь, пока дверь закроешь — часть уже испарится. Что опять же исказит результаты опыта
+
avatar
  • rx3apf
  • 26 октября 2019, 23:59
+1
Вариант — отстреляться газобаллонным пистолетом, У меня, например, тратил 0.1 гр на выстрел, с хорошей точностью и стабильностью. Можно дискретно дозировать, что еще удобнее, чем навеска сухого льда.
+
avatar
  • mrBrown
  • 27 октября 2019, 09:54
+1
0.1 гр на выстрел
Откуда эти цифры? В этих пистолетах настолько примитивная конструкция, что говорить о какой-то точности и стабильности просто смешно!
12 г./0,1 г. = 120 выстрелов. Ага! Щаз!
+
avatar
  • rx3apf
  • 27 октября 2019, 11:04
0
У меня SP2022, обойма с шариками и баллон это одно целое. Вес шарика знаю исходно. Взвесил, отстрелял, опять взвесил. Поскольку обойма тяжелая, не смог воспользоваться весами с разрешением 10 мг, но 100-мг весы тоже дают неплохую точность, если не один выстрел, а 10-20.

Да, 120 выстрелов с одного баллона, шесть обойм. Последняя обойма идет уже слабее.
+
avatar
  • Listian
  • 26 октября 2019, 18:28
0
заказал T6703 вместо MH-Z19B. есть i2c, обещают большой срок службы, более вменяемый ABC. на днях дойдет.
+
avatar
0
не, я уже PAS210 ждать буду )
+
avatar
0
Есть ещё SCD40 на том же принципе. Но почему-то мне кажется, что они будут уступать нормальным NDIR.
Хочется точности и отсутствия необходимости калибровки — купите двухканальный датчик. А вообще Т6703 и S8 — вполне достойные варианты.
P.S. Имею в коллекции десяток разных СО2 датчиков, в том числе три варианта двухканальных. После тестов выбрал Т6703 для серийных изделий (комбинированныз датчиков).
+
avatar
0
дороговат он… а судя по обзорам, которые были на Муське и Хабре (как впрочем и вообще в Сети) MZ19 не уступал ему по качеству. По сути мой обзор чуть ли не единственный из негативных в рунете на эти датчики. И, честно, если бы датчик у меня был 1 а не 2, или если бы «разбег» был не таким огромным — всё было бы иначе, и это был бы очередной «хороший» отзыв )
Надеюсь эта информация будет кому-то полезна.
+
avatar
  • E_g_o_r
  • 26 октября 2019, 22:14
-1
А у обоих датчиков диапазоны на 5000ppm установлены? Может у одного 2000ppm диапазон стоит?
+
avatar
+1
Да. Я писал об этом отдельным пунктом, к тому же в скетче прямо комментарием указано
//-------- Задаем принудительно работу в диапазоне 5000ppm
с последующим проверкой/подтверждением на экране, что команда принята. Если не принята (на старте датчики тормозят) нужно ткнуть ресет на ардуине
+
avatar
  • batal
  • 26 октября 2019, 22:20
+5
А можно вопрос? Почему вы на основании имеющихся 2 датчиков делаете какие-то статистические выводы? Откуда цифра что надо взять как минимум 10 для отборки? Почему не 5? Не 100?

Имею 2 19B и 4 S8. Все показывают одно и тоже (до 2000 примерно) в рамках заявленной погрешности. Как это соотносится с вашей статистикой?

Я ни в коем случае не утверждаю что 19B хороший\плохой. Я лишь о том что делать выводы по 2 датчиком — это не очень корректно.
+
avatar
+2
Понимаю и в чем-то согласен.
Но есть прецендент. Где гарантия того, что 2-3 купленных из одной партии датчиков не будут одинаково врать?.. потому и выборка больше.
Ну и конечно не стоит воспринимать так добуквенно, про «10 штук» это скорее оборот речи, означает что нужна выборка и сравнение купленного с последующей отбраковкой, и чем больше будет пул для выборки тем больше шансов «выиграть в лотерею по отбору честных датчиков» без поверочных мероприятий на эталонных средах (которых у нас нету)
+
avatar
  • Q2W
  • 26 октября 2019, 23:13
0
Я покупал датчик k30. Он вроде не страдает вышеописанными проблемами, но раз в сколько-то дней он должен видеть свежий воздух. И к качеству питания он привередлив.
+
avatar
0
Все они такие. У этого самокалибровка раз в 24 часа. В скетче я её отключал
+
avatar
  • wormer
  • 27 октября 2019, 01:49
0
Я отключал калибровку у b19 в алгоритме в конце суток, если минимальное значение ppm за истекшие сутки не опускалось ниже 480. Затем сразу снова включал. Несколько дней датчик без калибровки нормально показывал, а за это время обычно удается проветрить комнату до 450, чтобы датчик откалибровался. Эталоном в параллели стоял k-30. Вот такой алгоритм я определил как наиболее подходящий для этого датчика и не требующий ежедневного проветривания до 400ppm.
+
avatar
  • boll069
  • 27 октября 2019, 11:31
0
Покупал подобный для метеостанции от Алекса Гайвера, парень просто молодец (https://alexgyver.ru/meteoclock/). Брал здесь «aliexpress.com/item/32946106807.html»
Работает замечательно, пока была отладка и апгрейд, с питанием и фоторезистором ну и обновы софта, все хозяйство лежало на столе в виде мотка проводов в кабинете, 8 квадратов, при микро проветривании показывало 400-450. После начала работы через 30-40 минут 800-900. В период часа полтора когда все устаканилось при заходе второго человека, через 5-10 минут уже кричал проветри. Считаю достаточно точным для бытовых нужд. Сейчас проект живет дома, жена очень довольна, зачастую глядя на показания проветривает. Хотя окно вроде всегда приоткрыто. И прогноз погоды тоже вполне устраивает. Всем добра.
+
avatar
0
Немного моих наблюдений:
1. Внутри датчиков стоит микроконтроллер и у него есть прошивка. И эта прошивка бывает разной. У меня есть два датчика с разными версиями прошивки, так вот более новая версия более адекватна, но реализация измерений и там и там вызывает вопросы.
2. Два датчика из одной партии (по крайней мере, с одной и той же прошивкой и датой изготовления) тестировались одновременно, но на одном был включен ABC, на другом — отключен. Сначала между ними была приличная разница показаний, но постепенно их показания стали выравниваться и спустя неделю они более-менее сравнялись. Это как будто бы говорит о том, что датчики исходно калибруют.
3. На «официальные» выводы датчик не выдаёт значения меньше 400ppm: в коде стоит проверка, что если насчиталось меньше 400, то выдаём 400. Но есть возможность получить значение CO2 до этого обрезания (команда 0x85).
4. Здесь я описал список всех поддерживаемых команд: revspace.nl/MH-Z19B
5. Насколько я понимаю, такому датчику для точных измерений в идеале нужна информация о давлении. В MH-Z19B нет ничего, что могло бы это давление измерить.
6. Внутри стоят регуляторы на 3.3В. То есть, если подать на питание 3.3 вместо 5 вольт, то напряжение на регуляторах уже будет меньше.
+
avatar
0
Блин, как я мог пропустить Ваш комментарий…
А можно подробности про команду 0x85? как выглядит полная строка с контрольной суммой и что она отдаёт? в идеале полный кусок Вашего кода бы посмотреть…
Я опрашивал RAW значения с помощью библиотеки с Хабра, но результат был совсем не в ппм-ах, полученный мной ответ это около 46.000 и 40.000 для 1 и 2 датчика соответственно.
+
avatar
+1
Вот пример запросов и ответов к датчику:
send ff018400000000007b
recv ff8496797d000004ec
INFO: cmd84: 38521 32000 4

send ff018500000000007a
recv ff8506150359000004
INFO: cmd85: 1557 857 0

send ff0186000000000079
recv ff8603593d000000e1
INFO: cmd86: 857 61 0 0 0

Здесь значение, полученное из команды 0x85 совпадает со значением из команды 0x86, но иногда бывает вот так:
[INFO ] cmd85: 1837 398
[INFO ] cmd86: 400 65 0 33 1

Видно, что финальное значение получилось 400, но значение чуть раньше по цепочке преобразований равно 398.
Это не сырое значение, а значение в ppm, но более сырое значение тоже можно получить, командой 0x84. Первое число в ответе (в моём случае 38521) — половина значения интеграла, вычисленного по измерениям датчика. Это значение (без половины) используется дальше для вычисления концентрации CO2 в ppm. И это значение интеграла вычисляется по-разному в разных прошивках, со всеми вытекающими… Это значение между двумя «одинаковыми датчиками» отличалось где-то на сотню (21149 vs 21028), между разными датчиками отличается в 1.8 раза (21000 vs 38000). Это нормально, тут имеет смысл сравнивать только значения из одинаковых прошивок.
+
avatar
0
Спасибо! Будет время — посмотрю что он там выдаёт по 0х85
+
avatar
  • Sanja
  • 28 октября 2019, 18:02
0
4. Здесь я описал список всех поддерживаемых команд: revspace.nl/MH-Z19B
Это значит я вас назвал «неизвестным голландцем»? :)
+
avatar
0
Нет, у меня там страница про MH-Z19B, она буквально недавно появилась.
+
avatar
  • Ammo1
  • 27 октября 2019, 12:31
0
Попробуйте включить автокалибровку и оставить их на пару недель. Вполне возможно, что значения уровняются.
+
avatar
0
Вы видимо плохо прочитали написанное… ну или я плохо объяснил… наверное второе… попробую еще раз.
Оба датчика корректно отрабатывают 400ррм порог, т.е. при интенсивном проветривании оба покажут близкое к 400 значение, проблема в ошибке подсчета концентрации после 400 ппм. Т.е. на одинаковую концентрацию они реагируют по разному, и расхождение в показаниях тем больше, чем больше концентрация, расхождение в геометрической прогрессии. Ни автокалибровка, ни принудительная, ни переключение диапазонов — ни-че-го в данном случае не поможет.
.
PS. Вчера муськовчанин в личку подсказал способ снятия RAW значений с датчиков, т.е. сырых «попугаев», без калибровок, без обработки, то, что «видит» сам сенсор. Так вот, при ± одинаковых условиях 1 датчик отдаёт в порт RAW около 46000, второе около 40000. Выводы я думаю очевидны.
.
PS2. Так же для спокойствия и гарантии от «китайской ошибки» я разобрал оба датчика, протер сенсоры от разводов (были какие-то странные разводы как от плохой отмывки после пайки), зеркала и призмы так же протер от пыли (правда эту пыль скорее я внёс при вскрытии датчиков). Но картины это не изменило ни на йоту.
+
avatar
  • robosku
  • 27 октября 2019, 15:27
0
А если привести показания одного датчика к другому (умножить/поделить/отнять и так далее), то они начнут одинаково показывать во всём диапазоне или нет? Если да, то этот самый муськовчанин советует взять где-либо третий датчик, чтобы понять, какой из двух врёт, и сделать просто для врущего поправку/множитель, раз он 400 ппм нормально видит :)
+
avatar
0
я сейчас каким то чудом привел показания датчиков в одно русло, т.е. уже нету такого лютого разбега, но сомневаюсь что их показаниям можно верить… Впрочем для попугаеметра пойдет…
Что было сделано — калибровал не на улице а в комнате, которую долго проветривал.
первый датчик дошел до 400 примерно через полчаса проветривания, второй в это время показывал еще около 600. Через примерно еще полчаса второй стабилизировался на около 500, первый естественно был на 400 по дисплею, и гораздо ниже по факту. В этот момент я их оба сбросил в новую «точку 400». Сейчас, спустя полтора часа с закрытыми окнами в квартире оба показывают около 800.
RAW значения по прежнему отличаются на примерно 6000
Почему точно так же не происходило при «уличной калибровки» — понятия не имею, хотя и подозреваю, что китайцы перепутали с «нулевой точкой отсчета», применяя формулу подсчета концентрации в одном случае к 400ппм, а в другом, например, к 450… Сейчас диапазон 400...800 они оба идут очень ровно. Посмотрим что будет дальше, но, повторюсь, это уже не прибор, это «показометр»…
.
UPD. на диапазоне 1400 уже снова появился разбег (один из них показывает 1400, второй 1250)
+
avatar
  • robosku
  • 27 октября 2019, 17:33
0
Я думаю им надо дать поработать самостоятельно постоянно (24х7), со включенной родной автокалибровкой и регулярным проветриванием. Хотя бы несколько дней. У меня так показания выравнивались.
+
avatar
0
сомневаюсь что ABC поможет, калибрует то стартовую точку оно нормально, проблема в коэффициенте пересчета концентрации, и чем дальше от начала шкалы — тем сильнее ошибка.
Ладно, не важно, много времени уже угроблено на эти датчики, есть идеи как их пристроить в оба моих проекта, но на этом с ними (и вообще с NDIR) я пока попрощаюсь, выйдет PAS210 — пощупаю его. А пока время на игрушки с ними закончилось.
+
avatar
  • robosku
  • 27 октября 2019, 19:17
0
Видимо, мне просто повезло и через некоторое время датчики стали показывать одно и то же

+
avatar
  • vkozloff
  • 28 октября 2019, 16:09
0
Судя по статье метод примененный в PAS отличается только тем, что фотоприемник заменен на микрофон, а так-то все равно метод основан на измерении интенсивности ИК-луча, проходящего через газ.
+
avatar
  • Berlin
  • 27 октября 2019, 18:05
0
:) видимо брак. Может у прода компенсацию попросить?
+
avatar
  • DainB
  • 28 октября 2019, 04:57
0
У вас в квартире выращиваются плодовые растения которым рекомендуются повышенные уровни CO2? Если нет то зачем он вам нужен? Hint — до 5000 ppm вы даже не заметите, в парнике с 1200 ppm вы прекрасно можете работать целый день и даже без кислородной маски.
+
avatar
0
Я выше писал для чего ;)
+
avatar
  • MadOrc
  • 28 октября 2019, 06:20
0
Подтверждаю. Есть какая-то лажа с этими датчиками с Али.
На фото внизу партия 5шт купленная на али. Формально продавцу не предъявишь, работают. Но врут неадекватно и нелинейно.

Вверху 1 остался, уже кончились почти, те же датчики но прямо с завода WinSen — никаких проблем. Показания в рамках погрешности совпадают с поверенными CO2-метрами сделанными на других датчиках.

Вобщем, если Вам не просто «поиграться» не надо брать на Али совсем. Непонятно где продавцы Али их берут, возможно выбраковка с завода…
+
avatar
0
Внизу даже на QR коде на наклейке сэкономили :D Выглядят не очень убедительно.
+
avatar
0
Можно попробовать перелить прошивку с одних датчиков на другие, благо защиты там вообще никакой нет.
+
avatar
  • vkozloff
  • 28 октября 2019, 16:02
0
Есть еще швейцарский Sensirion SCD30, дорогой но параметры обещают интересные.
+
avatar
  • Fakel63
  • 29 октября 2019, 19:52
0
мои наблюдения:
запускал Z19 и S8 на одинаковых модулях (с одинаковой прошивкой espeasy). гонял месяц, из него 2 недели — открытый балкон, 2 недели квартира — z19 стабильно завышал показания на 400-450 ед.
потом случайно спалил. оба сразу (
+
avatar
0
Как спалили?
+
avatar
  • Fakel63
  • 30 октября 2019, 19:55
0
как начинающий радиолюбитель )
подал 12в на обе esp8266 и подключенные к ним сенсоры. есп выжили а датчики нет(
больше всего жаль S8. на него кстати в инете почему то не нашел даташита
верхний ряд 4 деталь справа
+
avatar
  • makks
  • 29 августа 2021, 22:40
0
чем отличается версия С?