Проблема с MH-Z19

kalapanga
Offline
Зарегистрирован: 23.10.2016

Добрый день! Ситуация такая. Есть датчик CO2 MH-Z19 подключенный через аппаратный последовательный порт к Arduino Leonardo. И есть у этой схемы какая-то проблема с инициализацией. Скетч (он ниже) уже залит. Я подключаю плату к USB компа и вижу в мониторе порта бесконечную ошибку CRC. Ждать можно долго - ошибка не пропадает. Нажимаю кнопку Reset - плата перезагружается и датчик начинает прекрасно работать! В мониторе я вижу вполне себе красивые данные. Дальше может работать сколь угодно долго без сбоев. И так каждый раз после включения питания требуется ещё и ресет. В чём может быть проблема? Есть какие идеи?

Пример работы с датчиком взят кажется с Гиктаймса. Там использовался программный сериал, я заменил на аппаратный. Вот тестовый скетч, на котором воспроизводится проблема:

byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; 
unsigned char response[9];

void setup() {
  Serial1.begin(9600);
}

void loop() {
  Serial1.write(cmd, 9);
  memset(response, 0, 9);
  Serial1.readBytes(response, 9);
  int i;
  byte crc = 0;
  for (i = 1; i < 8; i++) crc+=response[i];
  crc = 255 - crc;
  crc++;

  if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) {
    Serial.println("CRC error: " + String(crc) + " / "+ String(response[8]));
  } else {
    unsigned int responseHigh = (unsigned int) response[2];
    unsigned int responseLow = (unsigned int) response[3];
    unsigned int ppm = (256*responseHigh) + responseLow;
    Serial.println(ppm);
  }
  delay(10000);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы пытаетесь его запускать ДО того, как он полность инициализировался. Нужно подать на него питание и выждать какое-то время, чтобы он раскочегарился, а потом уже насиловать. Сколько выжидать? По даташиту - 3 минуты, но это для точности показаний. А так, работать он и раньше нанёт. Поставьте задрежку в начале setup и поэкспериментируйте с нею.

Кстати, Вы в курсе, что

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

2. он умеет работать по MODBUS если нужно?

kalapanga
Offline
Зарегистрирован: 23.10.2016

Спасибо, помогло! Про то что показания корректные только через минуту-другую будут это я помнил, а вот что ему "завестись" ещё нужно хоть какое-то время дать - как-то упустил, ну или ожидал, что через некоторое время связь между устройствами должна сама "устаканиться". 

А так, 10 секунд задержки оказалось достаточно.

vital_asm
Offline
Зарегистрирован: 10.08.2017

del

b707
Offline
Зарегистрирован: 26.05.2017

vital_asm. как связан ваш код с обсуждаемым в этой ветке?

vital_asm
Offline
Зарегистрирован: 10.08.2017

у меня аналогичная, что и у топикстартера, проблема, которую он решил delay ями, и которая у меня так не решилась, а код - для иллюстрации того, что воткнул delay через каждую строчку. может вы и правы - не особо информативен этот код 

kalapanga
Offline
Зарегистрирован: 23.10.2016

К сожалению, добавить нечего не могу. Мне для решения проблемы хватило 10-секундной задержки в самом начале Setup (типа Вашей 8-й строки).

alex_r61
Offline
Зарегистрирован: 20.06.2012

Датчик чуствителен к питанию, у меня при напряжении около 4.7В полную чушь выдавал. При 5 всё нормально заработало, но при этом заменил SoftwareSerial на AltSoftSerial. Задержки 15 сек. при включении и опрос каждые 10 сек., по  таймеру.

ksasrg
Offline
Зарегистрирован: 27.08.2017

Такая проблема возникает, потому что не всегда чтение девяти байт попадает на начало ответа датчика. Байты из предыдущего ответа попадают в начало нового запроса. То есть строка сдвинута, и контрольная сумма не сходится. Решением является дочитать все байты, которые остались в буфере.

 if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) {
    Serial.println("CRC error: " + String(crc) + " / "+ String(response[8]));

    while (mySerial.available()) {
        mySerial.read();        
        }
}

 

Nestor Mahno
Offline
Зарегистрирован: 03.10.2015

Здравствуйте! Я тоже столкнулся с проблемой с датчиком MH-Z19. Датчик долгое время нормально работал в домашней метеостанции, при этом не был запаян а просто воткнут в отверстия на плате. При последней модификации метеостанции, не касающейся самого датчика, решил его запаять. Теперь после подачи питания он некоторое врямя работает, но при этом довольно часто ответ от датчика не прходит и показания его на графике выглядят более изрезанными чем раньше, а через несколько часов работы ответы вообще перестают приходить. При этом ШИМ выход работает. Подскажите, пожалуйста, как побороть данную проблему!

Petr0fff
Offline
Зарегистрирован: 09.07.2020

ksasrg пишет:

Такая проблема возникает, потому что не всегда чтение девяти байт попадает на начало ответа датчика. Байты из предыдущего ответа попадают в начало нового запроса. То есть строка сдвинута, и контрольная сумма не сходится. Решением является дочитать все байты, которые остались в буфере.

 if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) {
    Serial.println("CRC error: " + String(crc) + " / "+ String(response[8]));

    while (mySerial.available()) {
        mySerial.read();        
        }
}

 

Вы лучший. Мучался с этой фигней день, ваш совет помог. спс огромное

Плюс добавил делай:

mySerial.write(cmd, 9);
  memset(response, 0, 9);
  delay(10);
  mySerial.readBytes(response, 9);

 

Gena_
Offline
Зарегистрирован: 14.10.2012

Здравствуйте, Евгений.

Можно поподробней про MH Z-19 B1

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

Очень интересен этот момент

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Gena_ пишет:

Можно поподробней про MH Z-19 B1

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

Очень интересен этот момент

Вот здесь подробно.

Кстати, есть и даташит, но там такого не документировано.

2012de
Offline
Зарегистрирован: 30.10.2020

Приветствую всех! 

купил недавно esp8266 (хочу перейти на него с ардуино нано) и ни как не могу законектить к нему свой  mh-z19b...

не выводит показания с датчика..

на Нана работала без проблем.  в чем может быть проблема?  как правильно подключить?  

питание 5в.

Alex_Mn
Offline
Зарегистрирован: 07.05.2021

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