LED Steuerung über ESP32-Server

Hallo Zusammen,
bin ein ziemlicher Neuling im Programmieren mittels Arduino und habe eine Frage bzgl. meines ersten richtigen Projektes.
Es geht um die Steuerung eines LED-Streifens mittels ESP32-Server.
Bei der Steuerung der einzelnen LEDs habe ich verschiedene for-Schleifen. Diese kann ich mittels eines Befehls an den Server starten. Diese Schleifen sollen laufen bis ich einen neuen Befehl gebe. Nach jedem Durchlauf einer Schleife soll geprüft werden ob ein neuer Befehl an den Server gesendet worden ist. (Es ist auch noch ein Knopf verbaut, aber dieser Funktioniert und hat nichts mit meinem Problem zu tun.)
Ich weiß allerdings nicht wie ich das Programmieren soll.
Mit meinem jetzigen Code wird jede Funktion zwar wie gewünscht aufgerufen, allerdings endet sie nach einer Schleife.
Gibt es die Möglichkeit, eine Funktion in eine Variable-Funktion zu schreiben und diese dann in jedem Loop, falls eine if-Bestimmung zutrifft, zu wiederholen? Oder gibt es eine bessere Lösung?
Habe mal die, wie ich glaube, wichtigen Codezeilen angefügt.
Hoffe jemand kann mir da einen Tipp geben.

Gruß

// Rainbowlike
void pride() 
{
  static uint16_t sPseudotime = 0;
  static uint16_t sLastMillis = 0;
  static uint16_t sHue16 = 0;
 
  uint8_t sat8 = beatsin88( 87, 220, 250);
  uint8_t brightdepth = beatsin88( 341, 96, 224);
  uint16_t brightnessthetainc16 = beatsin88( 203, (25 * 256), (40 * 256));
  uint8_t msmultiplier = beatsin88(147, 23, 60);

  uint16_t hue16 = sHue16;//gHue * 256;
  uint16_t hueinc16 = beatsin88(113, 1, 3000);
  
  uint16_t ms = millis();
  uint16_t deltams = ms - sLastMillis ;
  sLastMillis  = ms;
  sPseudotime += deltams * msmultiplier;
  sHue16 += deltams * beatsin88( 400, 5,9);
  uint16_t brightnesstheta16 = sPseudotime;
  
  for( uint16_t i = 0 ; i < NUM_LEDS; i++) {
    hue16 += hueinc16;
    uint8_t hue8 = hue16 / 256;

    brightnesstheta16  += brightnessthetainc16;
    uint16_t b16 = sin16( brightnesstheta16  ) + 32768;

    uint16_t bri16 = (uint32_t)((uint32_t)b16 * (uint32_t)b16) / 65536;
    uint8_t bri8 = (uint32_t)(((uint32_t)bri16) * brightdepth) / 65536;
    bri8 += (255 - brightdepth);
    
    CRGB newcolor = CHSV( hue8, sat8, bri8);
    
    uint16_t pixelnumber = i;
    pixelnumber = (NUM_LEDS-1) - pixelnumber;
    
    nblend( leds[pixelnumber], newcolor, 64);
    FastLED.show();
    delay(10);
  }
  LEDstate = true;
}

void setup(void) {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
    
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  /*if (MDNS.begin("esp32")) {
    Serial.println("MDNS responder started");
  }*/

  server.on("/", handleRoot);

  server.on("/pride", []() {
    server.send(200, "text/plain", "Running Pride!");
    pride();
  });

  server.on("/cylon", []() {
    server.send(200, "text/plain", "Running Cylon!");
    cylon();
  });
  
  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");

  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS)
    .setCorrection(TypicalLEDStrip)
    .setDither(BRIGHTNESS < 255);
    
  FastLED.setBrightness(BRIGHTNESS);

  Connected();
  Serial.println("LEDs flashed");
  Serial.println("LED Status");
  Serial.println(LEDstate);
}


void loop(void) {
  
  // Server-Loop
  server.handleClient();

  // LED-Loop
    ?????????????????
    ?????????????????


  // Button-Loop
 boolean newState = digitalRead(BUTTON_PIN);
  // Check if state changed from high to low (button press).
  if((newState == LOW) && (oldState == HIGH)) {
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);
    if(newState == LOW) {      // Yes, still low
       if (LEDstate == true) {
        //LEDs ausschalten
        turnoff();
       }
       else {
        pride();
       }
    }
  }
}

mrgod:
Es geht um die Steuerung eines LED-Streifens mittels ESP32-Server.

Welchen Typ verwendest Du? ESP32 an USB zeigt bei mir Störungen auf WS2812B.

Eine Animation mit einer blockierenden Schleife, die delay enthält, ist keine gute Idee. Umbauaen auf millis.

Vom Eventhandler die Animation aufzurufen, gelingt nur beim Ereignis. Besser eine Variable mit der Nummer der Animation setzen und in loop über diese Nummer mit switch/case die Animation kontinuierlich aufrufen.

Danke für deine Antwort!

agmue:
Welchen Typ verwendest Du? ESP32 an USB zeigt bei mir Störungen auf WS2812B.

Ich benutze den AZDelivery ESP32 mit FastLED und WS2812B.
Bei den Funktionen Pride und Cylon handelt es sich um vorgefertigte Beispiele aus der FastLED Library.

agmue:
Eine Animation mit einer blockierenden Schleife, die delay enthält, ist keine gute Idee. Umbauaen auf millis.

Wie genau mache ich das? Gibt es da eine Anleitung oder ein Beispiel?

agmue:
Vom Eventhandler die Animation aufzurufen, gelingt nur beim Ereignis. Besser eine Variable mit der Nummer der Animation setzen und in loop über diese Nummer mit switch/case die Animation kontinuierlich aufrufen.

Das klingt Interessant. Ich werde versuchen das mal umzusetzen!

mrgod:
Wie genau mache ich das?

Ein paar Zeilen umstellen:

void loop()
{
  switch(animation){
    case Animation_Pride:
      pride();
      break;
    case Animation_Cylon:
      cylon();
      break;
  }
}

// Rainbowlike
void pride()
{
  static uint16_t i = 0;
  static uint32_t vorhin = 0;
  static uint32_t sPseudotime = 0;
  static uint32_t sLastMillis = 0;
  static uint16_t sHue16 = 0;

  uint8_t sat8 = beatsin88( 87, 220, 250);
  uint8_t brightdepth = beatsin88( 341, 96, 224);
  uint16_t brightnessthetainc16 = beatsin88( 203, (25 * 256), (40 * 256));
  uint8_t msmultiplier = beatsin88(147, 23, 60);

  static uint16_t hue16 = sHue16;//gHue * 256;
  if (i == 0) hue16 = sHue16; //gHue * 256;
  uint16_t hueinc16 = beatsin88(113, 1, 3000);

  uint16_t ms = millis();
  uint16_t deltams = ms - sLastMillis ;
  sLastMillis  = ms;
  sPseudotime += deltams * msmultiplier;
  sHue16 += deltams * beatsin88( 400, 5, 9);
  static uint16_t brightnesstheta16 = sPseudotime;
  if (i == 0) brightnesstheta16 = sPseudotime;

  if (ms - vorhin >= 10) {
    vorhin = ms;
    hue16 += hueinc16;
    uint8_t hue8 = hue16 / 256;

    brightnesstheta16  += brightnessthetainc16;
    uint16_t b16 = sin16( brightnesstheta16  ) + 32768;

    uint16_t bri16 = (uint32_t)((uint32_t)b16 * (uint32_t)b16) / 65536;
    uint8_t bri8 = (uint32_t)(((uint32_t)bri16) * brightdepth) / 65536;
    bri8 += (255 - brightdepth);

    CRGB newcolor = CHSV( hue8, sat8, bri8);

    uint16_t pixelnumber = i;
    pixelnumber = (NUM_LEDS - 1) - pixelnumber;

    nblend( leds[pixelnumber], newcolor, 64);
    FastLED.show();
    i = (1 + i) % NUM_LEDS;
  }
}