зависание при использовании MQTT

Тема в разделе "Arduino & Shields", создана пользователем mrsmart, 4 дек 2018 в 19:45.

Метки:
  1. mrsmart

    mrsmart Нуб

    Доброго!
    Использую такой скетч (увы, не помню где взял):
    Код (C++):
    #include <Ethernet.h>
    #include <PubSubClient.h>

    const int relay1 = 2;
    const int relay2 = 3;
    const int relay3 = 4;
    const int relay4 = 5;
    const int relay5 = 6;
    const int relay6 = 7;
    const int relay7 = 8;
    const int relay8 = 9;

    byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xEE, 0xED };
    byte server[] = { 10, 10, 10, 45 };
    byte ip[]     = { 10, 10, 10, 46 };

    void callback(char* topic, byte* payload, unsigned int length)
    {
      int r,hl;
      char receivedChar = (char)payload[0];
      if(receivedChar=='1')
        hl = LOW;
        else
        hl = HIGH;
           if(String(topic)=="PowerPanel/relay1")
        r = relay1;
      else if(String(topic)=="PowerPanel/relay2")
        r = relay2;
      else if(String(topic)=="PowerPanel/relay3")
        r = relay3;
      else if(String(topic)=="PowerPanel/relay4")
        r = relay4;
      else if(String(topic)=="PowerPanel/relay5")
        r = relay5;
      else if(String(topic)=="PowerPanel/relay6")
        r = relay6;
      else if(String(topic)=="PowerPanel/relay7")
        r = relay7;
      else if(String(topic)=="PowerPanel/relay8")
        r = relay8;                            
      else
        r = relay1;
      digitalWrite(r, hl);
    }

    EthernetClient ethClient;
    PubSubClient client(server, 1883, callback, ethClient);

    void reconnect()
    {
      while (!client.connected())
    {
        if (client.connect("arduinoPowerPanel"))
            {
              delay(1);
            }
            else
            {
              delay(5000);
            }
      }
    }

    void setup()
    {
      delay(3000);
      Ethernet.begin(mac, ip);
      pinMode(relay1, OUTPUT);
      pinMode(relay2, OUTPUT);
      pinMode(relay3, OUTPUT);
      pinMode(relay4, OUTPUT);
      pinMode(relay5, OUTPUT);
      pinMode(relay6, OUTPUT);
      pinMode(relay7, OUTPUT);
      pinMode(relay8, OUTPUT);
      digitalWrite(relay1, HIGH);
      digitalWrite(relay2, HIGH);
      digitalWrite(relay3, HIGH);
      digitalWrite(relay4, HIGH);
      digitalWrite(relay5, HIGH);
      digitalWrite(relay6, HIGH);
      digitalWrite(relay7, HIGH);
      digitalWrite(relay8, HIGH);

      if (client.connect("arduinoPowerPanel"))
       {
        client.publish("PowerPanel/relay1", "0");
        client.subscribe("PowerPanel/relay1");
        client.publish("PowerPanel/relay2", "0");
        client.subscribe("PowerPanel/relay2");
        client.publish("PowerPanel/relay3", "0");
        client.subscribe("PowerPanel/relay3");
        client.publish("PowerPanel/relay4", "0");
        client.subscribe("PowerPanel/relay4");
        client.publish("PowerPanel/relay5", "0");
        client.subscribe("PowerPanel/relay5");
        client.publish("PowerPanel/relay6", "0");
        client.subscribe("PowerPanel/relay6");
        client.publish("PowerPanel/relay7", "0");
        client.subscribe("PowerPanel/relay7");
        client.publish("PowerPanel/relay8", "0");
        client.subscribe("PowerPanel/relay8");
       }
    }

    void loop()
    {
       if (!client.connected())
          {
           reconnect();
          }
      client.loop();
    }
    Проблема следующая:
    Код работает, но при разрыве связи и зачастую без понятной мне причины работа прекращается.
    Ардуинка пингуется, на брокер приходят ответы о выполнении команды, но реле не переключаются.
    Гугл подсказывает что проблема с библиотекой PubSubClient, но решения я не нашел, а самому ума не хватает.
    Подскажите, пожалуйста.
     
  2. DetSimen

    DetSimen Гуру

    К автору.