Mqtt client loopt nur einmal

Moin,

ich werkle gerade mit gefährlichem Halbwissen an einer Mqtt Verbindung mit einem esp8266. Leider bin ich auf ein Problem gestoßen, aus dem ich nicht schlau werde: Trotz der vermeintlich richtigen Verwendung von "client.loop()", bekomme ich nur einmal eine sub-Verbindung, aber das war es dann auch schon. Das Ziel ist eine dauerhafte Verbindung.

P.s. Ich weiß das der code grausig ausschaut, allerdings ist das bisher auch nur ein Konzept und noch kein fertiger Code.

tip#ifndef STASSID
#define STASSID "**************"                            // set your SSID
#define STAPSK  "*******"                        // set your wifi password
#endif

/* Configuration of NTP */
#define MY_NTP_SERVER "at.pool.ntp.org"           
#define MY_TZ "CET-1CEST,M3.5.0/02,M10.5.0/03"   

/* Necessary Includes */
#include <ESP8266WiFi.h>            // we need wifi to get internet access
#include <time.h>                   // time() ctime()
#include <Servo.h>
#include <PubSubClient.h>

/* Globals */
time_t now;                         // this is the epoch
tm tm;                              // the structure tm holds time information in a more convient way

Servo servoMotor4;
Servo servoMotor3;
Servo servoMotor2;
Servo servoMotor1;

WiFiClient espClient;
PubSubClient client(espClient);

int exittry = 0;

const char* broker = "************"; //IP address of broker
const int port = ****;
const char* mqttUser = "************";
const char* mqttPassword = "********";

byte inPin = D5; //D5
byte up = D6; //D6
byte down = D7; //D7
   
int val = 0; 
int val1 = 0;
int val2 = 0;    
int hold = 0;
int hold1 = 0;
int hold2 = 0;
int exe = 0;

int ver = 0;
int trytry = 0;
int trytry1 = 0;
int trytry2 = 0;

int imanage = 0;

int itry = 0;
int ttry = 0;

bool wopen = false;
bool breakend = false;

bool we = false;

String inco;
String cache;

void showTime() {
  time(&now);                       // read the current time
  localtime_r(&now, &tm);           // update the structure tm with the current time
  Serial.print("year:");
  Serial.print(tm.tm_year + 1900);  // years since 1900
  Serial.print("\tmonth:");
  Serial.print(tm.tm_mon + 1);      // January = 0 (!)
  Serial.print("\tday:");
  Serial.print(tm.tm_mday);         // day of month
  Serial.print("\thour:");
  Serial.print(tm.tm_hour);         // hours since midnight  0-23
  Serial.print("\tmin:");
  Serial.print(tm.tm_min);          // minutes after the hour  0-59
  Serial.print("\tsec:");
  Serial.print(tm.tm_sec);          // seconds after the minute  0-61*
  Serial.print("\twday");
  Serial.print(tm.tm_wday);         // days since Sunday 0-6
  if (tm.tm_isdst == 1)             // Daylight Saving Time flag
    Serial.print("\tDST");
  else
    Serial.print("\tstandard");
  Serial.println();

    client.setServer(broker, port);
    client.subscribe("/Finn/Zimmer/Rolladen/lvl");
    client.setCallback(callback);

   
}

void callback(char* topic, byte* payload, unsigned int length) {

  Serial.print("Message received in topic: ");
  Serial.print(topic);
  Serial.print("   length is:");
  Serial.println(length);

  Serial.print("Data Received From Broker:");
  for (int i = 0; i < length; i++) {
    

    inco = inco + (char)payload[i];
  }
  Serial.println(inco);
  payload = 0; 

  itry = 0;

    if(inco != cache && itry == 0){
    cache = inco;
    itry = 1;
    ttry = 0;

    for(int i = 0; i <= 100; i++){

      imanage = i;

      

      String istring = String(i);
      
      if(istring == inco){
        break;
      }
    }

 

      if(imanage == 0 && ttry == 0){

        ttry = 1;

        digitalWrite(D8, HIGH);

              servoMotor4.write(40);
              delay(1000);
              servoMotor4.write(0);
              delay(500);                  //close
              servoMotor2.write(40);
              delay(1000);                  
              servoMotor2.write(0);
              delay(15000);
              
              wopen = false;
              Serial.println("Close");

             

              
    
              servoMotor3.write(0);
              delay(1000);              //reset
              servoMotor3.write(40);

              digitalWrite(D8, LOW);
              
                 
        
      }

      if(imanage == 100 && ttry == 0){

        ttry = 1;

         digitalWrite(D8, HIGH);

              servoMotor3.write(0);
              delay(1000);
              servoMotor3.write(40);
              delay(500);                  //open
              servoMotor1.write(0);
              delay(1000);                  
              servoMotor1.write(40);
              delay(15000);

              wopen = true;
              Serial.println("Open");

               
    
              servoMotor4.write(40);
              delay(1000);                 //reset
              servoMotor4.write(0);

              digitalWrite(D8, LOW);

                 
    
        
      }

      if(imanage >= 0 && imanage <= 100 && ttry  == 0){

        ttry = 1;

        digitalWrite(D8, HIGH);

              servoMotor3.write(0);
              delay(1000);
              servoMotor3.write(40);
              delay(500);                  //open
              servoMotor1.write(0);
              delay(1000);                  
              servoMotor1.write(40);
              delay(15000);

              wopen = true;
              Serial.println("Open");

               
    
              servoMotor4.write(40);
              delay(1000);                 //reset
              servoMotor4.write(0);

              

              servoMotor4.write(40);
              delay(1000);
              servoMotor4.write(0);
              delay(500);                  //close
              servoMotor2.write(40);
              delay(1000);                  
              servoMotor2.write(0);
              delay(8000 / 100 * imanage);
              
              wopen = false;
              Serial.println("Close");

             

              
    
              servoMotor3.write(0);
              delay(1000);              //reset
              servoMotor3.write(40);

              digitalWrite(D8, LOW);

              client.setServer(broker, port);
              client.subscribe("/Finn/Zimmer/Rolladen/lvl");
              client.setCallback(callback);

                 
        
      }

     
    }

     inco = "";

}

void setup() {

  pinMode(D8, OUTPUT);
  
  digitalWrite(D8, HIGH);
 
  
  Serial.begin(115200);
  Serial.println("\nNTP TZ DST - bare minimum");

  configTime(MY_TZ, MY_NTP_SERVER); // --> Here is the IMPORTANT ONE LINER needed in your sketch!

  // start network
  WiFi.persistent(false);
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED && exittry <= 60) {
    delay(200);
    Serial.print ( "." );
    exittry ++;
  }
  if(WiFi.status() == WL_CONNECTED){
  Serial.println("\nWiFi connected");
  // by default, the NTP will be started after 60 secs
  }else{
    Serial.println("Connection failed!");
  }

    client.setServer(broker, port);
    client.setCallback(callback);

  while (!client.connected()) {
    Serial.println("Connecting to MQTT...");

    if (client.connect("ESP32Client", mqttUser, mqttPassword )){

      Serial.println("connected to MQTT broker");

    }else{

      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(500);

    }
  }

  Serial.println("ESP8266 AS SUBSCRIBER");
  Serial.println("Subscribing topic /Finn/Zimmer/Rolladen/lvl:");
  client.subscribe("/Finn/Zimmer/Rolladen/lvl");

    servoMotor4.attach(D3);
    servoMotor3.attach(D2);
    servoMotor2.attach(D1);
    servoMotor1.attach(D0);


              servoMotor1.write(40);
              servoMotor2.write(0);
              servoMotor3.write(40);
              servoMotor4.write(0);
              delay(500);

              servoMotor3.write(0);
              delay(1000);
              servoMotor3.write(40);
              delay(500);                  //open
              servoMotor1.write(0);
              delay(1000);                  
              servoMotor1.write(40);
             
              delay(15000);

              wopen = true;

              Serial.println("Open");
    
              servoMotor4.write(40);
              delay(1000);                 //reset
              servoMotor4.write(0);

              





              

              pinMode(inPin, INPUT);    // declare pushbutton as input

   digitalWrite(D8, LOW);   
   
   showTime;        
 
}

   
    




void loop() {          
  client.loop();

           
  
  if(WiFi.status() == WL_CONNECTED){
  showTime();

  }

  if(tm.tm_wday == 0 || tm.tm_wday == 6){
    we = true;
  }else{
    we = false;
  }

  val = digitalRead(inPin);  // read input value
//  val1 = digitalRead(up);
//  val2 = digitalRead(down); 

  while(val == HIGH){         // check if the input is LOW (button released)

   if(hold >= 1 && trytry == 0){

    digitalWrite(D8, HIGH);
    
    trytry = 1;
    hold = 0;
    breakend = false;
   }
    
    Serial.println("pushed master");
    hold ++;
    Serial.println(hold);
    delay(1100);

    val = digitalRead(inPin);  // read input value
    
    
  }

  while(val1 == HIGH){         // check if the input is LOW (button released)

   if(hold1 >= 1 && trytry1 == 0){

    digitalWrite(D8, HIGH);
    
    trytry1 = 1;
    hold1 = 0;
    breakend = false;
   }
    
    Serial.println("pushed up");
    hold1 ++;
    Serial.println(hold1);
    delay(1100);

    val1 = digitalRead(up);  // read input value

        if(hold1 > 1){


             if(exe == 0){
              
      digitalWrite(D8, HIGH);

             servoMotor3.write(0);
              delay(1000);
              servoMotor3.write(40);
              delay(500);                  //open
              servoMotor1.write(0);
              delay(1000);                  
              servoMotor1.write(40);


              wopen = true;
              Serial.println("Open");
              

              exe = 1;

      }

              if(val1 == LOW){

                servoMotor4.write(40);
              delay(1000);                 //reset
              servoMotor4.write(0);

                digitalWrite(D8, LOW);

                hold1 = 0;
                exe = 0;

                client.setServer(broker, port);
                client.subscribe("/Finn/Zimmer/Rolladen/lvl");
                client.setCallback(callback);
              }
      
    }
    
    
  } 

  if(hold1 == 1){

    digitalWrite(D8, HIGH);

              servoMotor3.write(0);
              delay(1000);
              servoMotor3.write(40);
              delay(500);                  //open
              servoMotor1.write(0);
              delay(1000);                  
              servoMotor1.write(40);
              delay(15000);

              wopen = true;
              Serial.println("Open");

              
    
              servoMotor4.write(40);
              delay(1000);                 //reset
              servoMotor4.write(0);

              digitalWrite(D8, LOW);

              hold1 = 0;

              client.setServer(broker, port);
              client.subscribe("/Finn/Zimmer/Rolladen/lvl");
              client.setCallback(callback);
    
  }

  while(val2 == HIGH){         // check if the input is LOW (button released)

   if(hold2 >= 1 && trytry2 == 0){

    digitalWrite(D8, HIGH);
    
    trytry2 = 1;
    hold2 = 0;
    breakend = false;
   }
    
    Serial.println("pushed down");
    hold2 ++;
    Serial.println(hold2);
    delay(1100);

    val2 = digitalRead(down);  // read input value

        if(hold2 > 1){


             if(exe == 0){
              
      digitalWrite(D8, HIGH);

      

              servoMotor4.write(40);
              delay(500);
              servoMotor4.write(0);
              delay(500);                  //close
              servoMotor2.write(40);
              delay(500);                  
              servoMotor2.write(0);

              wopen = false;
              Serial.println("Close");
              

              exe = 1;

      }

              if(val2 == LOW){

                 servoMotor3.write(0);
                 delay(1000);              //reset
                 servoMotor3.write(40);

                digitalWrite(D8, LOW);

                hold2 = 0;
                exe = 0;

                client.setServer(broker, port);
                client.subscribe("/Finn/Zimmer/Rolladen/lvl");
                client.setCallback(callback);
              }
      
    }
    
    
  }
  
  if(hold2 == 1){

    digitalWrite(D8, HIGH);

              servoMotor4.write(40);
              delay(1000);
              servoMotor4.write(0);
              delay(500);                  //close
              servoMotor2.write(40);
              delay(1000);                  
              servoMotor2.write(0);
              delay(15000);
              
              wopen = false;
              Serial.println("Close");

             

              
    
              servoMotor3.write(0);
              delay(1000);              //reset
              servoMotor3.write(40);

              digitalWrite(D8, LOW);

              hold2 = 0;

              client.setServer(broker, port);
              client.subscribe("/Finn/Zimmer/Rolladen/lvl");
              client.setCallback(callback);


    
    
  }
  
  trytry = 0;
  trytry1 = 0;
  trytry2 = 0;

  digitalWrite(D8, LOW);
  
if(hold == 1 && wopen == true){
  hold = 15;
}
if(hold == 1 && wopen == false){
  breakend = true;

  digitalWrite(D8, HIGH);

              servoMotor3.write(0);
              delay(1000);
              servoMotor3.write(40);
              delay(500);                  //open
              servoMotor1.write(0);
              delay(1000);                  
              servoMotor1.write(40);
              delay(15000);

              wopen = true;
              Serial.println("Open");

              
    
              servoMotor4.write(40);
              delay(1000);                 //reset
              servoMotor4.write(0);

              digitalWrite(D8, LOW);

              client.setServer(broker, port);
              client.subscribe("/Finn/Zimmer/Rolladen/lvl");
              client.setCallback(callback);
}
  

      if(hold != ver && breakend == false){
        ver = hold;
        if(hold != 1){

          digitalWrite(D8, HIGH);
          
              servoMotor3.write(0);
              delay(1000);
              servoMotor3.write(40);
              delay(500);                  //open
              servoMotor1.write(0);
              delay(1000);                  
              servoMotor1.write(40);
              delay(15000);

              wopen = true;
              Serial.println("Open");

              
    
              servoMotor4.write(40);
              delay(1000);                 //reset
              servoMotor4.write(0);
              
              delay (1000);

              servoMotor4.write(40);
              delay(1000);
              servoMotor4.write(0);
              delay(500);                  //close
              servoMotor2.write(40);
              delay(1000);                  
              servoMotor2.write(0);
              delay(hold * 1000 - 1000);

              
             wopen = false;
             Serial.println("Close");

              
    
              servoMotor3.write(0);
              delay(1000);              //reset
              servoMotor3.write(40);

              digitalWrite(D8, LOW);

              client.setServer(broker, port);
              client.subscribe("/Finn/Zimmer/Rolladen/lvl");
              client.setCallback(callback);
        }
          
         
        

        
      }


      
    
  

  

  if(tm.tm_hour == 22 && tm.tm_min == 0 && tm.tm_sec == 0){

    digitalWrite(D8, HIGH);

              servoMotor4.write(40);
              delay(1000);
              servoMotor4.write(0);
              delay(500);                  //close
              servoMotor2.write(40);
              delay(1000);                  
              servoMotor2.write(0);
              delay(15000);
              
              wopen = false;
              Serial.println("Close");

             

              
    
              servoMotor3.write(0);
              delay(1000);              //reset
              servoMotor3.write(40);

              digitalWrite(D8, LOW);

              client.setServer(broker, port);
              client.subscribe("/Finn/Zimmer/Rolladen/lvl");
              client.setCallback(callback);
    
  }

  if(tm.tm_hour == 6 && tm.tm_min == 30 && tm.tm_sec == 0 && we == false){

    digitalWrite(D8, HIGH);

              servoMotor3.write(0);
              delay(1000);
              servoMotor3.write(40);
              delay(500);                  //open
              servoMotor1.write(0);
              delay(1000);                  
              servoMotor1.write(40);
              delay(15000);

              wopen = true;
              Serial.println("Open");

           

              
    
              servoMotor4.write(40);
              delay(1000);                 //reset
              servoMotor4.write(0);

              digitalWrite(D8, LOW);

              client.setServer(broker, port);
              client.subscribe("/Finn/Zimmer/Rolladen/lvl");
              client.setCallback(callback);
    
  }

  if(we = true && tm.tm_hour == 10 && tm.tm_min == 0 && tm.tm_sec == 0){

    digitalWrite(D8, HIGH);

              servoMotor3.write(0);
              delay(1000);
              servoMotor3.write(40);
              delay(500);                  //open
              servoMotor1.write(0);
              delay(1000);                  
              servoMotor1.write(40);
              delay(15000);

              wopen = true;
              Serial.println("Open");

               
    
              servoMotor4.write(40);
              delay(1000);                 //reset
              servoMotor4.write(0);

              digitalWrite(D8, LOW);

              client.setServer(broker, port);
              client.subscribe("/Finn/Zimmer/Rolladen/lvl");
              client.setCallback(callback);
    
  } 

  if(tm.tm_hour == 12 && tm.tm_min == 0 && tm.tm_sec == 0){

    digitalWrite(D8, HIGH);

     delay(500);

    digitalWrite(D8, LOW);
    ESP.reset();
  }


    
   

  
  


  

}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Ich nutze mqtt nicht, vermute aber das die vielen delays in deinem Sketch dein Problem sind.
Teile den Sketch auf in mqtt Anmeldung und danach erst die Funktionen zur Steuerung der Motoren. Und das bitte ohne delay, sondern mit der Funktion millis(). Schau dir dazu BlinkWithoutDelay an.
Und entferne bitte die zahlreichen Leerzeilen, die machen ein Lesen schwer.

1 Like

Vielen Dank für deine Idee, ich schaue mal was sich machen lässt.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.