Schleife beenden in case8

Wie kann ich die Schleifen in case 8 beenden?

const int Taster = 18;            // Pin Nummer des Tasters
const int Led_Rot = 2;            // Pin Nummer der Ledfarbe Rot
const int Led_Gruen = 3;          // Pin Nummer der Ledfarbe Grün
const int Led_Blau = 4;           // Pin Nummer der Ledfarbe Blau

int Zaehler = 1;                  // Zähler für den aktuellen Programstand
int Tasterstatus = LOW;           // aktuelles Signal vom Eingangspin
int TasterGedrueckt = 0;          // abfragen ob Taster gedrückt war
int Vorherigerstatus = LOW;       // vorheriges Signal vom Eingangspin
int EntprellZeit = 200;           // Zeit für Entprellung, anpassen!

unsigned long TasterZeit = 0;     // Zeit beim drücken des Tasters


void setup() {               
  pinMode(Led_Blau, OUTPUT);       // LED Pin wird als Ausgang gesetzt
  pinMode(Led_Rot, OUTPUT);        // LED Pin wird als Ausgang gesetzt
  pinMode(Led_Gruen, OUTPUT);      // LED Pin wird als Ausgang gesetzt
  pinMode(Taster, INPUT);          // Taster Pin wird als Eingang gesetzt
}

void loop()
{
Tasterstatus = digitalRead (Taster);         // Tasterstatusabfrage

//Flankenwechsel erkennen
if(Vorherigerstatus == LOW && Tasterstatus == HIGH)       
{
    TasterZeit = millis();      // aktualisiere TasterZeit
    TasterGedrueckt = 1;        // speichert, dass Taster gedrückt wurde
  }
 
  // Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war...
  if ((millis() - TasterZeit > EntprellZeit) && TasterGedrueckt == 1)

{
    //abhängig vom Zähler passende funktion aufrufen
    switch(Zaehler) {
     case 1:     Led_1();                  // Fall_1 Led Blau
                 TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
                 break;
     case 2:     Led_2();                  // Fall_2 Led Rot
                 TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
                 break;
     case 3:     Led_3();                  // Fall_3 Led Gruen
                 TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
                 break;
     case 4:     Led_4();                  // Fall_4 Led Lila
                 TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
                 break;
     case 5:     Led_5();                  // Fall_5 Led Türkis
                 TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
                 break;
     case 6:     Led_6();                  // Fall_6 Led Gelb
                 TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
                 break;
     case 7:     Led_7();                  // Fall_7 Led Weis
                 TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
                 break;
     case 8:     Led_8();                  // Fall_8 Led Farbmisch
                 TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
                 break;
     case 9:     Led_9();                  // Fall_9 Led Aus
                 TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
                 break;
    }   

    Zaehler++;    //Zähler erhöhen

    if(Zaehler == 10) Zaehler = 1;    //Zähler zurücksetzen
}
 

Vorherigerstatus = Tasterstatus;          //letzten Zustand merken

}

void Led_1()                        // Fall_1 Led Blau
{
  digitalWrite(Led_Blau, HIGH);     // LED Blau an
  digitalWrite(Led_Rot, LOW);       // LED Rot aus
  digitalWrite(Led_Gruen, LOW);     // LED Gruen aus
}
 

void Led_2()                        // Fall_2 Led Rot
{
  digitalWrite(Led_Blau, LOW);      // LED Blau aus
  digitalWrite(Led_Rot, HIGH);      // LED Rot an
  digitalWrite(Led_Gruen, LOW);     // LED Gruen aus
}

void Led_3()                        // Fall_3 Led Grün
{
  digitalWrite(Led_Blau, LOW);      // LED Blau aus
  digitalWrite(Led_Rot, LOW);       // LED Rot aus
  digitalWrite(Led_Gruen, HIGH);    // LED Gruen an
}

void Led_4()                        // Fall_4 Led Lila
{
  digitalWrite(Led_Blau, HIGH);     // LED Blau an
  digitalWrite(Led_Rot, HIGH);      // LED Rot an
  digitalWrite(Led_Gruen, LOW);     // LED Gruen aus
}

void Led_5()                        // Fall_5 Led Türkis
{
  digitalWrite(Led_Blau, HIGH);     // LED Blau an
  digitalWrite(Led_Rot, LOW);       // LED Rot aus
  digitalWrite(Led_Gruen, HIGH);    // LED Gruen an
}

void Led_6()                        // Fall_6 Led Gelb
{
  digitalWrite(Led_Blau, LOW);      // LED Blau aus
  digitalWrite(Led_Rot, HIGH);      // LED Rot an
  digitalWrite(Led_Gruen, HIGH);    // LED Gruen an
}

void Led_7()                        // Fall_7 Led Weis
{
  digitalWrite(Led_Blau, HIGH);     // LED Blau an
  digitalWrite(Led_Rot, HIGH);      // LED Rot an
  digitalWrite(Led_Gruen, HIGH);    // LED Gruen an
}

void Led_8()                        // Fall_8 Led aus
{while(1)
{
  digitalWrite(Led_Rot, LOW);       // LED Rot aus
  digitalWrite(Led_Gruen, LOW);     // LED Gruen aus
  for (int helligkeit =1; helligkeit <= 255; helligkeit = helligkeit +5){
    analogWrite(Led_Blau, helligkeit);
    delay(20);
  }
  for (int helligkeit =255; helligkeit >= 0; helligkeit = helligkeit -5){
    analogWrite(Led_Blau, helligkeit);
    delay(20);
  }
}
}

void Led_9()                        // Fall_9 Led aus
{
  digitalWrite(Led_Blau, LOW);      // LED Blau aus
  digitalWrite(Led_Rot, LOW);       // LED Rot aus
  digitalWrite(Led_Gruen, LOW);     // LED Gruen aus
}

Ich sehe keine Schleife. Aus der loop-Routine kommst Du mit einem

return;

raus.

PS: Du solltest Deinen Code formatieren. Die IDE hat dafür eine Funktion. Halbweg richtig formatierter Code hilft, die Übersicht zu behalten.

Hey Pylon. in Void LED 8 eine while schleife. Bis dahin funktioniert das soweit und dann hänge ich in der schleife.

Schleifen kann man mit break beenden

Das ist aber grundlegend falsches Design. Statt in einer Funktion eine Endlos-Schleife zu machen schaut am Anfang der Funktion nach ob was zu tun ist. Wenn ja macht man einen Schritt und verlässt die Funktion wieder. Dann ruft man die Funktion ständig auf.
Wenn man dann noch auf delay() verzichtet kann man so mehrere Dinge quasi-gleichzeitig tun. z.B. LED blinken und Taster abfragen

Ach so. Ganz einfach: Indem Du die Schleife entfernst. Du musst dann natürlich mit Zeiten arbeiten, wie Du das für das Entprellen schon machst und im Farbwechsel-Status jeweils eine Routine anspringen, die weiterschaltet, wenn schon die gewünschte Zeit vergangen ist. Die "delay()"-Aufrufe gehören natürlich entfernt, die sind sowieso Gift für solche Sachen.

Was Du dann hast, nennt man eine State Machine, mit etwas googlen wirst Du ganz viel Information dazu finden.

verstehe ich das richtig. schleife weg und stattdessen: falls z.b. case 8 war aktiv aber die bedingung für case 9 nicht da dann einfach nochmal das ganze?

Wenn du es super richtig machen willst, schmeisst du auch noch die for schleifen raus :wink:
Dann dauert Led8() nicht viel länger als Led1() ( na ja, 4 ms ist mehr als 0 )

Musst dir halt die Helligkeitsmerker statisch merken.
Und besser statt in 5erSchritten alle 20 ms lieber in Einerschritten alle 4 ms.

void Led8() {
    static byte helligkeit=0;
    if (helligkeit < 255) { helligkeit++;
      analogWrite(Led_Blau, helligkeit);
      delay(4);  
    } else Zaehler++; // andere Richtung im nächsten case ... 
}

Nein, Du musst den Inhalt der Schleife auftrennen und je nach vergangener Zeit den richtigen Teil ausführen.

Beispiel:

uint32_t time_start = millis();

void loop() {
  if (millis() - time_start > 5000) time_start = millis();
  else if (millis() - time_start > 2000) stop_led2();
  else if (millis() - time_start > 1000) stop_led1();
  else if (millis() - time_start > 500) start_led2();
  else if (millis() - time_start > 50) start_led1();
}

Beachte, dass ich durch die if-else-Abfrage in verkehrter Reihenfolge die Obergrenze nicht abfragen muss. Wenn Du also mit der kleinsten Zeit anfängst, musst Du bei Limiten testen.

@michael_x

habe es versucht einzubinden.

Funktioniert so nicht. Weiterschalten funktioniert allerding verändert sich die helligkeit nicht.

@Pylon

da ich ja blutiger Anfänger bin verstehe ich das leider nicht wie du das meinst. und auch nicht wo das hin kommt.

Schaltest du denn in Led8 Rot und Grün (noch von Led7 ) aus?

Am Ende, wenn du automatisch auf Schritt 9 weiterschaltest, solltest du helligkeit erst wieder auf 0 setzen. ( das war ein echter Fehler von mir )
oder du merkst dir zusätzlich noch die Richtung ( 1 / -1 ) und fährst Led8 komplett hoch und wieder runter, bis von aussen weitergeschaltet wird.

oder du machst helligkeit zu einer globalen Variable, die du in Led9 zurücksetzen (oder für was anderes verwenden) kannst.

oder ...

Ich schalte auf Tasterdruck immer an bzw. aus. Also in LED_8 werden die Leds die In LED_7 leuchten ausgeschaltet.

Allerdings sind in Case_7 oder LED_7 alle Farben der RGB an

Was ich halt möchte, ist einen automatismus der Farben erzeugen aber auf Tastendruck immernoch eine Veränderung erzeugen können.

Mit einer schleife funktioniert das nicht, da bei Tastendruck dann nichts mehr passiert.

Mir ist leider nicht klar wie ich das so aufteilen kann.

Mit einer schleife funktioniert das nicht, da bei Tastendruck dann nichts mehr passiert.

Schleifen auflösen und durch if-Abfragen ersetzen. Alle delay() Aufrufe raus (jedenfalls die die länger als ein paar ms sind). Dann fragst du bei jedem Funktionsaufruf nur ab ob es Zeit ist was zu tun. Und wenn ja machst du einen Schritt. Und nur einen. Dazu braucht halt Statusvariablen die den aktuellen Zustand festhalten.

Du darfst dein Programm nie anhalten. Dann kannst du auch Taster abfragen während du irgendwelche LED Animation ablaufen lässt.

Mein aktueller Sketch sieht so aus. Leider funktioniert die If Abfrage bei LED_8 nicht die LED behält eine mittlere Helligkeit wird also nicht heller auch schaltet sie nicht zu LED_9 wo dann alles aus sein sollte.
Vielleicht kann mir ja noch jemand einen Tip anhand des geschriebenen Sketches geben. Wäre toll.

const int Taster = 18;            // Pin Nummer des Tasters
const int Led_Rot = 2;            // Pin Nummer der Ledfarbe Rot
const int Led_Gruen = 3;          // Pin Nummer der Ledfarbe Grün
const int Led_Blau = 4;           // Pin Nummer der Ledfarbe Blau

int Zaehler = 1;                  // Zähler für den aktuellen Programstand
int helligkeit = 1;
int Tasterstatus = LOW;           // aktuelles Signal vom Eingangspin
int TasterGedrueckt = 0;          // abfragen ob Taster gedrückt war
int Vorherigerstatus = LOW;       // vorheriges Signal vom Eingangspin
int EntprellZeit = 200;           // Zeit für Entprellung, anpassen!

unsigned long TasterZeit = 0;     // Zeit beim drücken des Tasters

void setup() {
  pinMode(Led_Blau, OUTPUT);       // LED Pin wird als Ausgang gesetzt
  pinMode(Led_Rot, OUTPUT);        // LED Pin wird als Ausgang gesetzt
  pinMode(Led_Gruen, OUTPUT);      // LED Pin wird als Ausgang gesetzt
  pinMode(Taster, INPUT);          // Taster Pin wird als Eingang gesetzt
}

void loop()
{
  Tasterstatus = digitalRead (Taster);         // Tasterstatusabfrage

  //Flankenwechsel erkennen
  if (Vorherigerstatus == LOW && Tasterstatus == HIGH)
  {
    TasterZeit = millis();      // aktualisiere TasterZeit
    TasterGedrueckt = 1;        // speichert, dass Taster gedrückt wurde
  }

  // Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war...
  if ((millis() - TasterZeit > EntprellZeit) && TasterGedrueckt == 1)

  {
    //abhängig vom Zähler passende funktion aufrufen
    switch (Zaehler) {
      case 1:     Led_1();                  // Fall_1 Led Blau
        TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
        break;
      case 2:     Led_2();                  // Fall_2 Led Rot
        TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
        break;
      case 3:     Led_3();                  // Fall_3 Led Gruen
        TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
        break;
      case 4:     Led_4();                  // Fall_4 Led Lila
        TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
        break;
      case 5:     Led_5();                  // Fall_5 Led Türkis
        TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
        break;
      case 6:     Led_6();                  // Fall_6 Led Gelb
        TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
        break;
      case 7:     Led_7();                  // Fall_7 Led Weis
        TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
        break;
      case 8:     Led_8();                  // Fall_8 Led Farbmisch
        TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
        break;
      case 9:     Led_9();                  // Fall_9 Led Aus
        TasterGedrueckt = 0;      // setzt gedrückten Taster zurück
        break;
    }

    Zaehler++;    //Zähler erhöhen

    if (Zaehler == 10) Zaehler = 1;   //Zähler zurücksetzen
  }

  if (Vorherigerstatus != Tasterstatus && millis() - TasterZeit > 2000) { // Taster losgelassen und war mind. 1 Sek. gedrueckt
    Led_9();
    TasterGedrueckt = 0;
    Zaehler = 10;
  }


  Vorherigerstatus = Tasterstatus;          //letzten Zustand merken

}

void Led_1()                        // Fall_1 Led Blau
{
  digitalWrite(Led_Blau, HIGH);     // LED Blau an
  digitalWrite(Led_Rot, LOW);       // LED Rot aus
  digitalWrite(Led_Gruen, LOW);     // LED Gruen aus
}


void Led_2()                        // Fall_2 Led Rot
{
  digitalWrite(Led_Blau, LOW);      // LED Blau aus
  digitalWrite(Led_Rot, HIGH);      // LED Rot an
  digitalWrite(Led_Gruen, LOW);     // LED Gruen aus
}

void Led_3()                        // Fall_3 Led Grün
{
  digitalWrite(Led_Blau, LOW);      // LED Blau aus
  digitalWrite(Led_Rot, LOW);       // LED Rot aus
  digitalWrite(Led_Gruen, HIGH);    // LED Gruen an
}

void Led_4()                        // Fall_4 Led Lila
{
  digitalWrite(Led_Blau, HIGH);     // LED Blau an
  digitalWrite(Led_Rot, HIGH);      // LED Rot an
  digitalWrite(Led_Gruen, LOW);     // LED Gruen aus
}

void Led_5()                        // Fall_5 Led Türkis
{
  digitalWrite(Led_Blau, HIGH);     // LED Blau an
  digitalWrite(Led_Rot, LOW);       // LED Rot aus
  digitalWrite(Led_Gruen, HIGH);    // LED Gruen an
}

void Led_6()                        // Fall_6 Led Gelb
{
  digitalWrite(Led_Blau, LOW);      // LED Blau aus
  digitalWrite(Led_Rot, HIGH);      // LED Rot an
  digitalWrite(Led_Gruen, HIGH);    // LED Gruen an
}

void Led_7()                        // Fall_7 Led Weis
{
  digitalWrite(Led_Blau, HIGH);     // LED Blau an
  digitalWrite(Led_Rot, HIGH);      // LED Rot an
  digitalWrite(Led_Gruen, HIGH);    // LED Gruen an
}

void Led_8()                        // Fall_8 Led aus
{
  digitalWrite(Led_Gruen, LOW);      // LED Blau aus
  digitalWrite(Led_Blau, LOW);       // LED Rot aus
  if (helligkeit < 255)
  { helligkeit+5;
    analogWrite(Led_Rot, helligkeit);
    delay(20);
  } else Zaehler++;
  if (helligkeit == 255) helligkeit = 1;   //helligkeit zurücksetzen
}

void Led_9()                        // Fall_9 Led aus
{
  digitalWrite(Led_Blau, LOW);      // LED Blau aus
  digitalWrite(Led_Rot, LOW);       // LED Rot aus
  digitalWrite(Led_Gruen, LOW);     // LED Gruen aus
}

Falsch:

helligkeit+5;

Du rechnest was aber machst mit dem Ergebnis nichts

aber auch wenn ich dort helligkeit++ setze und den Delay auf 4 ist es genau das Selbe

Dein Problem ist, dass du gar nicht immer in den switch springst.

void loop() {
 Tasterstatus = digitalRead (Taster);         // Tasterstatusabfrage

 //Flankenwechsel erkennen
 if (Vorherigerstatus != Tasterstatus)
 {
     delay(5); // Einfaches Entprellen
     if (Tasterstatus == HIGH) Zaehler++;
     if (Zaehler > 9) Zaehler = 0; 
     Vorherigerstatus = Tasterstatus;
 }
 switch (Zaehler) {
 // ...
 case 8: Led_8(); break;
 }

}

Ausserdem würde ich für Led_8 diese Vereinfachung vorschlagen:

byte helligkeit;
void Led_8()  {
  digitalWrite(Led_Gruen, LOW);      // LED Blau aus
  digitalWrite(Led_Blau, LOW);       // LED Rot aus
  if (helligkeit < 255)
  { helligkeit++;
    analogWrite(Led_Rot, helligkeit);
    delay(4);
  } else {
     Zaehler++;  // automatisch weiterschalten
     helligkeit = 0;   // helligkeit zurücksetzen
  }
}

also die Farben lassen sich wirklich gut schalten. nur case 8 funzt nicht.

wenn der switch case nicht immer funktionieren sollte dann würde doch gar nicht durchgeschaltet werden.

Aber vielleicht ist ja auch meine herangehensweise völlig verquer.

Also es sollen mit einem Taster alle Farbzustände der RGB-Leiste durchgeschaltet werden.
Vielleicht später noch Farbvarianten durch verschiedene Helligkeiten der LEDs.

Dann möchte ich noch ein paar Modis zufügen wie Flash und Fade usw.

Vom Prinzip so wie man ín jedem Baumarkt solche Lichtleisten kaufen kann.

Es ist allerding für ein beleuchtetes Namenschild das an einer 12v KfZ-Steckdose betrieben wird.

Das ganze soll von einem Nano erledigt werden.

Momentan wird entwickelt an einem AtMega2560

HHHIIIIILLLLLFFFFFEEEEE BBBBBIIIITTTTTEEEE

Ich weis ja das ich euch bestimmt schon nerfe, aber ich bin halt ein Feinwerkmechanickermeister. Ich bringe meinen Jungs den ganzen Tag ne Menge bei und programiere CNC gesteuerte Werkzeugmaschinen im Schlaf.

Aber dieser kleine Haufen Elektronik in Form eines Arduinos ist halt eine ganz eigene Welt.

Es wäre halt nur toll wenn ich mal dieses Projekt vom Tisch bekomme. Für meinen kleinen LKW.

Und ja ich hab es mir auch einfacher vorgestellt so etwas zu programieren

also die Farben lassen sich wirklich gut schalten. nur case 8 funzt nicht.

Weil es bei den anderen Fällen egal ist, ob sie immmer wieder oder nur einmal aufgerufen werden.

case 8 lebt davon, dass er "oft" drankommt, also in jedem loop Durchlauf und nicht nur einmal, wenn du den Taster gedrückt hast.
Den anderen cases ist es egal, die schalten einfach immer wieder die Farbe, die eh schon zu sehen ist.

Also halte ich irgendwo den loop an.

Das habe ich daraus verstanden. und wenn der loop immer wieder über case 8 läufen würde die Led faden.

Wenn ich den vereinfachten Switch einbaue läuchtet immer alles.