Probleme Schleife zu beenden | exit for-loop problems

short-english-version :slight_smile:
Hey guys, can’t exit the for-loop in pulsate() if PIN2 is HIGH it should abort… but it doesn’t…
I try to controll my LED stripe for having nice effects like pusle, fade an cylon-like.

Hallo Ihr Lieben,
hoffe ich bin auf dem richtigen Board gelandet. Da ich bereits einige Beiträge auf Deutsch gefunden habe, dachte ich mir, das es kein Problem ist den Haupttext in DE zu schreiben.

Bin seit einem Monat an MC’s dran da ich ursprünglich eine Komfortabel Möglichkeit gesucht habe, meine eigene Hardware über die Software direkt anzusteuern. So verarbeitet mein UNO derzeit schon problemlos Taster-Eingaben, kann Relais schalten, etc. Da ich mein Programm in Java schreibe, verwende ich zur einfachen Kommunikation Ardulink.

Durch Zufall habe ich herausgefunden, das man recht easy auch RGB-LED’s ansteuern kann. Großartige Sache, benutzte FastLED damit ich auch hier das Rad nicht neu erfinden muss :wink:

Jetzt habe ich tolle Light-Effekte geschrieben, verschachtelte for-Schleifen die alle LED’s in meinem Stripe durchlaufen. Aber jetzt kommt der Hammer - ich schaffe es nicht, diese Schleifen abzubrechen, wenn z.B. ein Eingangspin auf HIGH gesetzt wird.
Ich dachte ich könnte durch einen zusätzlichen MC das Problem lösen, hab mir da aber schon wieder neue geschaffen. Aber wenigstens konnte ich das Problem etwas eingrenzen.
Habe bei meiner Suche bereits einige Dinge gefunden, die zum gewünschten Ergebnis füren sollen. break, return, goto… alles ohne logischen Effekt.
Er läuft die Schleife erst komplett durch, bis er auf Änderungen an den Pins reagiert. Dabei scheint er in der Tat die check()-Funktion aufrufen… hier mal mein Testcode… wundert euch nicht, hab ihn noch nicht sauber gemacht :wink:

void loop() {
  check();
  pulsate();
  //delay(100);  
    
}
bool val;

bool check()
{
    val = digitalRead(INPUT_CNTRL);
    if(val == HIGH)  
    {
      effect = false;
      //Alles auf AUS
      //for(int i = 0; i < NUM_LEDS; i++) 
      //{
      //  leds[i] = CRGB::Black;
      //  FastLED.show();
      //}      
      return false;
    } else 
    {
       effect = true;
       return true;  
      }
}

void pulsate()
{
  if(!effect) {  return; }
  if(!check) return;
  for(bright = 0; bright < 255; bright+=1) //Helligkeit durchlaufen
    {
      if(!check) goto exit;
      for(int led = 0; led < NUM_LEDS; led++) //LED's durchlaufen
      {
        if(!check) bright = 255;
        leds[led] = CHSV( hue, 220, bright);
          
      }     
      if(check) FastLED.show();
      if(!check) return;
      delay(5);  
    }
  if(!check) return;
    
    
    for(bright = 255; bright > 0; bright-=1)
    {
      if(!check) goto exit;
      for(int led = 0; led < NUM_LEDS; led++)
      {
        if(!check) bright = 0;
        leds[led] = CHSV( hue, saturation, bright);
      }      
      if(check) FastLED.show(); 
      if(!check) return;
      delay(5);
    }  
  exit: effect = false;
}

Wie gesagt… habe überall doppelaufrufe von check() weil ich es mir einfach nicht erklären konnte.
Habe ich einen Denkfehler? Kann ich es so überhaupt machen?
Es funktioniert, die LED’s pulsieren, wenn ich ein Signal von meinem Steuer MC anlege beginnt er mit dem Effect. Beenden tut er ihn erst, wenn pulsate() komplett durchgelaufen ist.

if(!check) return;Where in the program is the value of the check variable set ?

Why are you using goto ?

Did you mean to call the check() function rather than compare it's address to zero? If so the parenthesese are required:

if (!check())

lol... i'm feelin' like a total noob :smiley: Thats because Syntax-Highlightning in the Arduino IDE is diffrent to eclipse :wink:
I think thats the problem... will try it after my house work and report! :wink: Many thanks!

That was it… -_- Thanks a lot, now i can try to re-integrate the code into my UNO. :smiley:

Wenn Du Hilfe willst, dann gib uns den ganzen Sketch, der LAUFFÄhIG ist und nicht beim kompilieren Fehler gibt.
Grüße Uwe