Проблемы с работой MH-Z19+ESP8266

Тема в разделе "ESP8266, ESP32", создана пользователем Cadil, 4 дек 2017.

Метки:
  1. Cadil

    Cadil Нуб

    Решил дополнить работающую метеостанцию ср2102+BME280 датчиком углекислого газа MH-Z19, но не заладилось ...
    Работая c разными скриптами для MH-Z19, одна из моих попыток оказалась удачной - я увидел на мониторе редактора Arduino IDE далекие от реальности показатели концентрации СО2 (около 1400) и, самое главное, реакцию датчика на мое дыхание (2100-2600). К сожалению, это радостное событие произошло только один раз.
    Вот типичные сообщения с модуля ср2102:
    ets Jan августа 2013, rst cause: 1, boot mode: (5,7)
    waiting for host
    или
    Wrong crc from co2 sensor! (когда цепи Rx, Tx - разорванные)

    В нете нашел информацию, что для чипов ESP8266 нужна своя, особая библиотека SoftwareSerial для организации UARTa под MH-Z19. Заменил ранее установленную библиотеку SoftwareSerial на указанную в ссылке, но положительного результата не добился
    Чувствуется, что дело в ньюансах, но с моим скудным опытом на них самостоятельно не выйти.
    Помогите! Где копать?
    Скрипт во вложении. Возможно у кого-то под рукой работающий скрипт? Поделитесь!
     

    Вложения:

    • MH_Z19_2fin.ino
      Размер файла:
      1,7 КБ
      Просмотров:
      395
  2. MihaNN52

    MihaNN52 Нерд

    Во первых надо ему дать поработать минут 15 ( или просто запитать) потом смотреть за данными, он тормозной немного и долго стартует.
    Я тоже не сразу в это вьехал.
    Делал проект в прошлом году все уже не помню.
    Но записи остались))
    Ни какой библиотеки не надо.
    Функция опроса
    Код (C++):

    //для MH-Z19
    byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
    unsigned char response[9];
    float CO2;

    void read_sensor_mh_z19() {
    //co2 MH-Z19
      Serial2.write(cmd, 9);
      memset(response, 0, 9);
      Serial2.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];
        CO2 = (256*responseHigh) + responseLow;
        Serial.println(CO2);

      }

    }
    Пожалуйста.