Arduino bleibt bei MQTT Callback stecken

Arduino bleibt bei MQTT Callback stecken. Wie bekomme ich es hin, dass ich nach der Auswahl von z.B. Effekt 0 auf Effekt 1 wechseln kann? Momentan ist es so wenn ich zu Effekt 1 oder 0 wechsle, kann ich dem Arduino keine weiteren Befehle geben oder den Effekt stoppen.

Vielen Dank im Vorraus

void MQTTcallback(char* topic, byte* payload, unsigned int length) {
 
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
 
  Serial.print("Message:");
 
  String message;
  for (int x = 0; x < length; x++) {
    message = message + (char)payload[x];  //Convert *byte to String
  }
   Serial.print(message);
  if (strcmp(topic,"/ESP8266TEST/Interface/test/led")==0){
    if(message == "1") {digitalWrite(LED_BUILTIN, LOW); Serial.print(" = LOW");}   //LED on  
    if(message == "0") {digitalWrite(LED_BUILTIN, HIGH); Serial.print(" = HIGH");} //LED off
  }

  if (strcmp(topic,"/ESP8266TEST/Interface/test/effects")==0){
    while(message == "0") {
      Serial.println(F("Count0"));
      // Part 1 EINZELN
      for (int i = 0; i <= 8; i++) {
        leds[i] = CRGB ( 0, 0, 255);
        FastLED.show();
        delay(30);
      }
      for (int i = 8; i >= 0; i--) {
        leds[i] = CRGB ( 255, 0, 0);
        FastLED.show();
        delay(30);
      }
      for (int i = 0; i <= 8; i++) {
        leds[i] = CRGB ( 0, 255, 0);
        FastLED.show();
        delay(30);
      }
    } 
    while(message == "1") {
        fill_solid(leds, NUM_LEDS, CRGB(255,0,0));
        FastLED.show();
        delay(500);
        fill_solid(leds, NUM_LEDS, CRGB(0,255,0));
        FastLED.show();
        delay(500);
        fill_solid(leds, NUM_LEDS, CRGB(0,0,255));
        FastLED.show();
        delay(500);
        fill_solid(leds, NUM_LEDS, CRGB(255,255,0));
        FastLED.show();
        delay(500);
      }
    }
    if(message == "2") {digitalWrite(LED_BUILTIN, HIGH); Serial.print(" = HIGH");} //LED off
    if(message == "3") {digitalWrite(LED_BUILTIN, HIGH); Serial.print(" = HIGH");} //LED off

  if (strcmp(topic,"/ESP8266TEST/Interface/test/color/red")==0){
    payload[length] = '\0';
    String colors = String((char *)payload);
  
    // Extract R from the string
    r = colors.substring(0, 3).toInt();
  
    Serial.println(F(""));
    fill_solid(leds, NUM_LEDS, CRGB(r,g,b));
    Serial.println(r);
    FastLED.show();
  }

  if (strcmp(topic,"/ESP8266TEST/Interface/test/color/green")==0){
    payload[length] = '\0';
    String colors = String((char *)payload);
  
    // Extract G from the string;
    g = colors.substring(0, 3).toInt();
  
    Serial.println(F(""));
    fill_solid(leds, NUM_LEDS, CRGB(r,g,b));
    Serial.println(g);
    FastLED.show();
  }

  if (strcmp(topic,"/ESP8266TEST/Interface/test/color/blue")==0){
    payload[length] = '\0';
    String colors = String((char *)payload);
  
    // Extract B from the string;
    b = colors.substring(0, 3).toInt();
    Serial.println(F(""));
    fill_solid(leds, NUM_LEDS, CRGB(r,g,b));
    Serial.println(b);
    FastLED.show();
  }
 
  Serial.println();
  Serial.println("-----------------------");  
}

Ganzer code:

https://hastebin.com/axavehipaw.cpp
[/code]

.

Kann mir jemand helfen?

mar_robHD:
Kann mir jemand helfen?

Geduld.....Geduld.

Vermutlich hängt dein Sketch in der FastLed-Schleife.
Diese musst du aufbrechen, damit du von extern den Sketch bedienen kannst.

Deine while()-Funktion blockiert den Code. Der Mikrocontroller hat gar nicht mehr die Chance, auf neue Kommandos zu reagieren, da er in diesem Schleifenkonstrukt in Verbindung mit den ebensowenig hilfreichen delays festhängt.

Wie kann ich das beheben sodass es bei der Message 1 den FastLED Teil wiederholt aber auch noch auf andere Kommandos reagiert?

HotSystems:
Geduld.....Geduld.

Vermutlich hängt dein Sketch in der FastLed-Schleife.
Diese musst du aufbrechen, damit du von extern den Sketch bedienen kannst.

Kannst du mi helfen

Bisher habe ich mit FastLed noch zu wenig gemacht, weiß aber, wenn mann in dieser Funktion hängt, es nur schwer ist, da raus zu kommen.

Deine zahlreichen "delay()" machen es auch nicht besser. Diese musst du durch Funktionen mit millis ersetzen und innerhalb der einzelnen Effekte immer wieder prüfen, ob du etwas anderes machen möchtest.
Das geht nur sicher, wenn du mit einer StateMachine arbeitest.
Ich bin sicher, dass dir andere hier besser helfen können.
Du solltest deinen Titel vom Eingangspost noch etwas überarbeiten und "Fastled" hinzufügen.
Dann erkennt man das eigentliche Problem.

Hi

MALE Dir auf, WAS in welcher Reihenfolge abgearbeitet werden soll.
Dann programmierst Du Das nach.

Sollen die 'message' 0 und 1 immer wieder erneut durchlaufen?
Wohl ja, sonst hättest Du Da kein WHILE rein gebasteln.
genau aus diesem WHILE kommst Du nicht mehr raus - am Ende der While-Schleife wird zum Anfang Dieser gesprungen und erneut geprüft, ob die Bedingung wahr ist - da Keiner 'message' umbiegt, bleibt Das für die nächsten 42 Jahre so (und länger) - entweder das WHILE raus - dann läuft der Effekt halt nur 1x durch.

MfG

Ich möchte dass der Effekt so lange bleibt bis man den Effekt mit einer mqtt Nachricht wechseln. Es heißt er soll zwischendurch immer schauen ob eine neue Message eintrifft und dann stoppt

Das kannst Du ja wollen und auch so programmieren.
Was Du dazu ändern musst, wurde Dir ja bereits gesagt.

HotSystems:
Bisher habe ich mit FastLed noch zu wenig gemacht, weiß aber, wenn mann in dieser Funktion hängt, es nur schwer ist, da raus zu kommen.

Deine zahlreichen "delay()" machen es auch nicht besser. Diese musst du durch Funktionen mit millis ersetzen und innerhalb der einzelnen Effekte immer wieder prüfen, ob du etwas anderes machen möchtest.
Das geht nur sicher, wenn du mit einer StateMachine arbeitest.
Ich bin sicher, dass dir andere hier besser helfen können.
Du solltest deinen Titel vom Eingangspost noch etwas überarbeiten und "Fastled" hinzufügen.
Dann erkennt man das eigentliche Problem.

Wie würde der Code dann aussehen? Bin neu und verstehe es nicht so richtig.

Du hast in loop() schon eine Schleife. Daher kann man alle while-Schleifen durch if-Abfragen in loop() ersetzen. Oder einer Funktion die darin aufgerufen wird. Zustände kann man sich merken und in Abhängigkeit von denen verschiedene Dinge tun

Danke. Aber wie tue ich das? Kannst du mir ein Beispiel Code anfertigen

Hi

postmaster-ino:
MALE Dir auf, WAS in welcher Reihenfolge abgearbeitet werden soll.
Dann programmierst Du Das nach.

Schon ansatzweise mal probiert?
Nicht?
Dann eben nicht!

MfG

Wir leisten hier Hilfe zur Selbsthilfe. Hier wird Dir niemand einen fertigen Code vorsetzen.

Ich empfehle erstmal das Beispiel Blinkwithoutdelay.

Oder das Multitasking-Tutorial. Wenn Du das verstanden hast, kannst Du Deine gewünschten Aktionen aus der MQTT-Callback in die Main-loop() umsetzen (MQTT-Callback ändert dann nur eine Statusvariable, anstatt die Aktionen auszuführen)