Frage zu einer Steuerung mit nur einem Taaster

Bastele gerade an einer Steuerung für einen RGB-Leuchtstreifen. Habe schon einiges so wie ich es möchte. Allerdings möchte ich noch erweitern.

Schalte alle Farben sicher durch nur fehlt mir noch ein Farbwechsel und das ausschalten bei lange gedrücktem Taster.

Hänge mal den Sketch an vielleicht hat ja einer eine Idee.

Gruß Leo

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
}

Für den Ausschalter kannst Du vor dieser Zeile:

Vorherigerstatus = Tasterstatus;          //letzten Zustand merken

etwas in dieser Art einfügen:

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

hallo Pylon. Leider funktioniert das nur Teilweise. bzw. nicht immer.

danke pylon. das mit dem ausschalten steht. hab die Zeit noch ein wenig erhöht und zähler =10 zugefügt.
Super echt!

Danke