MH-Z19+Arduino UNO не работает без USB подключения

Тема в разделе "Arduino & Shields", создана пользователем evgeniy8080, 7 янв 2017.

  1. evgeniy8080

    evgeniy8080 Нуб

    Добрый день!
    Подключил MH-Z19 по UART к UNO. Передаю показания датчика на сервер по MQTT. Питание UNO через USB кабель. Пока ардуина подключена и питается через USB порт компьютера, датчик работает. Запитываю через тот же кабель с отдельного источника питания, показания датчика не считываются. Пробовал несколько различных блоков питания, проблема остается. Возможно проблема не в питании а связана с Serial и SoftwareSerial?. Скетч:

    Код (C++):
      #include <SoftwareSerial.h>;
      #include <Ethernet.h>
      #include <PubSubClient.h>
      #include <DHT.h>
      #define DHTPIN 2
      #define DHTTYPE DHT22

      byte mac[]    = {0xDE, 0xED, 0x9F, 0xFF, 0x02, 0x01 };
      char macstr[] = "deedbafefeed";
      byte localserver[] = {192, 168, 1, 38 };
      byte ip[]     = {192, 168, 1, 49 };

      String clientName = String("arduino:uno");
      String topicName = String("domoticz/in");
      float tempC = 0.0;
      float humidity = 0.0;
      int Humstatus;
      byte cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
      unsigned char response[9];
      int COLevel ;
     
      DHT dht(DHTPIN, DHT22);
      EthernetClient ethClient;
      SoftwareSerial mySerial(A4, A5); // A4 - TX, A5 - RX;
      PubSubClient client(localserver, 1883, 0, ethClient);

      void setup()
      {
        Ethernet.begin(mac, ip);
        Serial.begin(9600);
        dht.begin();
       
      }

      void getData() {
        humidity = dht.readHumidity();
        tempC = dht.readTemperature();
        if(humidity<40){
          Humstatus=2;
        }
        else if(humidity>=40&&humidity<50){
          Humstatus=0;
        }
      else if(humidity>=50&&humidity<60){
        Humstatus=1;
      }
      else {
        Humstatus=3;
      }
      delay (1000);
      mySerial.write(cmd, 9);
      memset(response, 0, 9);
      mySerial.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) ) {
        COLevel=1;
        return;
          } else {
        unsigned int responseHigh = (unsigned int) response[2];
        unsigned int responseLow = (unsigned int) response[3];
        unsigned int ppm = (256 * responseHigh) + responseLow;
        COLevel = ppm;
        }
    }


    String buildJson1() {
      String data1 = "{";
      data1 += "\"Battery\": ";
      data1 += 100;
      data1 += ",";
      data1 += "\"dtype\": ";
      data1 += "\"Temp + Humidity\", ";
      data1 += "\"idx\": ";
      data1 += 3;
      data1 += ",";
      data1 += "\"stype\":" ;
      data1 += "\"DHT22\",";
      data1 += "\"nvalue\": ";
      data1 += 0;
      data1 += ",";
      data1 += "\"svalue\": ";
      data1 += "\"";
      data1 += (float)tempC;
      data1 += ";";
      data1 += (float)humidity;
      data1 += ";";
      data1 += Humstatus;
      data1 += "\"";
      data1 += "}";
      return data1;
    }
    String buildJson2() {
      String data2 = "{";
      data2 += "\"Battery\": ";
      data2 += 100;
      data2 += ",";
      data2 += "\"dtype\": ";
      data2 += "\"Air Quality\", ";
      data2 += "\"idx\": ";
      data2 += 4;
      data2 += ",";
      data2 += "\"stype\":" ;
      data2 += "\"MH-Z19\",";
      data2 += "\"nvalue\": ";
      //data2 += "\"";
      data2 += COLevel;
      //data2 += "\"";
      data2 += "}";
      return data2;
    }
    void loop()
    {
      char clientStr[34];
      clientName.toCharArray(clientStr, 34);
      char topicStr[26];
      topicName.toCharArray(topicStr, 26);
      getData();
      if (!client.connected()) {
        client.connect(clientStr);
      }
      if (client.connected() ) {
        String json1 = buildJson1();
        char jsonStr1[150];
        String json2 = buildJson2();
        char jsonStr2[150];
        json1.toCharArray(jsonStr1, 150);
        json2.toCharArray(jsonStr2, 150);
        boolean pubresult1 = client.publish(topicStr, jsonStr1);
        delay(1000);
        boolean pubresult2 = client.publish(topicStr, jsonStr2);
         }
      delay(180000);
    }




     
     
    Последнее редактирование: 7 янв 2017
  2. Илья0566

    Илья0566 Нуб

    Попробуйте проконтролировать значения контрольной суммы (пример скетча здесь , https://geektimes.ru/post/272090/, может отправлять на сервер 8888 в качестве признака нарушения CRC ) при питании от другого источника, у меня несколько импульсных зарядок для телефона ( USB) вызывали нарушение контрольной суммы, от USB портов разных компов все нормально. Проверьте надежность контактов и отсутвие рядом источников помех.Хочу попробовать параллельно входу питания поставить конденсатор большой емкости в качестве фильтра помех
     
    Последнее редактирование: 14 янв 2017
  3. evgeniy8080

    evgeniy8080 Нуб

    Илья0566, спасибо! Да, CRC нарушается. Причина видимо действительно все же в питании. Помех нет, но с конденсатором хорошая идея. Попробую.
     
  4. Илья0566

    Илья0566 Нуб

    И надежность контактов желательно проверить, мне частично помогла замена провода, собирал на макетке.... С некоторыми блоками питания, после нескольких рестартов Ун-ы, с кнопки, при подключенном питании, СRC стала совпадать