RGB Controller Hilfe bei der Programmierung

Hallo,
ich bin absoluter Anfänger. Habe mich ein bisschen durchgearbeitet und würde mir jetzt gerne einen RGB LED Controller basteln. Ich habe vier Taster. Taster 1-3 sollen jeweils ein RGB Ablauf starten, Taster 4 soll ein Stop Taster werden, der die Abläufe stoppt und die LEDs ausschaltet. Ablauf 1 (Taster 1) soll ein einfacher Chase werden, indem verschiedene Farben nacheinander aufleuchtet. Ablauf 2 (Taster 2) soll ein Fade werden, indem verschiedene Farben auf und wieder abfaden. Ablauf 3 habe ich mir noch nicht überlegt, bis jetzt hat Taster 3 die gleiche Funktion wie Taster 4.

Probleme, auf die ich gerade stoße sind:
-dass ich im Ablauf 1 erst bei erneutem drücken von Taster 1 die nächste Farbe angezeigt bekomme.
-dass ich erst am Ende eines Ablaufs umschalten kann auf einen anderen Ablauf oder austellen kann.

Bitte um verständliche Unterstützung. Vielen Dank!

Hier mein Code:

[/
int Leds[]= {9,10,11};                    
int Buttons1 = 1;                          
int Buttons2 = 2;
int Buttons3 = 3;
int Buttons4 = 4;
double fade;                              
long myTimer = 0;                          
long myTimeout = 7;                        
long myTimeout_flash= myTimeout * 200;    
int x=1;                                 
int menu = 0;


void setup() 
{
                                          
 for (int i=0;i<3;i++)
 {
  pinMode(Leds[i],OUTPUT);
 }

pinMode(Buttons1,INPUT_PULLUP);
pinMode(Buttons2,INPUT_PULLUP);
pinMode(Buttons3,INPUT_PULLUP);
pinMode(Buttons4,INPUT_PULLUP);
 
}



void loop()
{
  if (digitalRead(Buttons1)==LOW)            //Abfrage von Button 1
  {
    menu = 1;                             
    updateMenu();                         
    delay(100);                          
    while(!digitalRead(Buttons1));      
  }

  if (digitalRead(Buttons2)==LOW)            //Abfrage von Button 2
  {
    menu = 2;                             
    updateMenu();                         
    delay(100);                          
    while(!digitalRead(Buttons2));      
  }

  if (digitalRead(Buttons3)==LOW)            //Abfrage von Button 3
  {
    menu = 3;                             
    updateMenu();                        
    delay(100);                           
    while(!digitalRead(Buttons3));      
  }

  if (digitalRead(Buttons4)==LOW)            //Abfrage von Button 4
  {
    menu = 4;                            
    updateMenu();                         
    delay(100);                          
    while(!digitalRead(Buttons4));      
  }
}

void updateMenu()
{
  switch(menu){       
    case 0:                               
      menu = 4;
      updateMenu();
      break;
    case 1:
      FarbenSpringen();
      break;
    case 2:
      FadeLED();
      break;
    case 3:
      menu = 4;
      updateMenu();
      break;
    case 4:
      analogWrite(Leds[0],0);                
      analogWrite(Leds[1],0);               
      analogWrite(Leds[2],0);                
      break;
    case 5:                             
      menu = 4;
      updateMenu();
      break;
  }
}


void FarbenSpringen()
{
  if (millis()> myTimer + myTimeout_flash && x==1 )   
    myTimer=millis();                         
    analogWrite(Leds[0],255);                 
    analogWrite(Leds[1],0);                   
    analogWrite(Leds[2],0);                   
    x++;
  }

  if (millis()> myTimer + myTimeout_flash && x==2)    
  {
    myTimer=millis();                        
    analogWrite(Leds[0],0);                  
    analogWrite(Leds[1],255);                 
    analogWrite(Leds[2],0);                  
    x++;
  }

  if (millis()> myTimer + myTimeout_flash && x==3)    
  {
    myTimer=millis();                         
    analogWrite(Leds[0],0);                   
    analogWrite(Leds[1],0);                 
    analogWrite(Leds[2],255);                 
    x++;
  }

  if (millis()> myTimer + myTimeout_flash && x==4)    
  {
    myTimer=millis();                       
    analogWrite(Leds[0],255);               
    analogWrite(Leds[1],255);               
    analogWrite(Leds[2],0);                   
    x++;
  }

  if (millis()> myTimer + myTimeout_flash && x==5)   
  {
    myTimer=millis();                        
    analogWrite(Leds[0],0);                   
    analogWrite(Leds[1],245);                 
    analogWrite(Leds[2],255);                 
    x++;
  }

  if (millis()> myTimer + myTimeout_flash && x==6)   
  {
    myTimer=millis();                         
    analogWrite(Leds[0],255);                 
    analogWrite(Leds[1],127);                 
    analogWrite(Leds[2],36);                  
    x++;
  }

  if (millis()> myTimer + myTimeout_flash && x==7)    
  {
    myTimer=millis();                        
    analogWrite(Leds[0],255);                 
    analogWrite(Leds[1],0);                  
    analogWrite(Leds[2],255);               
    x++;
  }

  if (millis()> myTimer + myTimeout_flash &&x==8)   
  {
    myTimer=millis();                       
    analogWrite(Leds[0],255);                 
    analogWrite(Leds[1],255);                
    analogWrite(Leds[2],255);                 
    x=1;                                      
  }
}


void FadeLED()
{ 

  fade = 0;                                 
  for(int i=0;i<3;i++)                      
  {
     while ( ! (fade == 255) )              
    {
      if(millis()> myTimer + myTimeout)     
      {
      myTimer = millis();                   
      analogWrite(Leds[i], fade);           
      fade = fade + 1;                      
       }  
     }
            
     if ( fade == 255 )                     
       {
         while ( ! (fade == 0) )           
         {
          if(millis()> myTimer + myTimeout) 
            {
             myTimer = millis();           
             analogWrite(Leds[i], fade);    
             fade = fade - 1;               
             }
          }
        }
  }
}

 ]

SwitchCase.ino (8.87 KB)

Hallo jumbo_27
Ich nehme mal an Du hast einen Arduino UNO bzw dessen Nachbau.
Du hast einiges richtig gemacht: millis() und nicht delay(), Endlichen Automaten.
Einiges aber auch nicht.

Zu erst rate ich Dir den Pin 1 nicht zu benutzen weil Pin 0 und 1 für die Serielle Schnittstelle/ Upload des Sketches gebraucht wird. Es kann sein daß der Upload nicht mehr funktioniert. Benutze ein anderes Pin.

Dann die Variablen für millis() sollten "unsigned long" sein.
Der Variablentyp double ist der gleiche wie float.

PWM- Ausgänge müssen / sollten nicht als OUTPUT deklariert werden.

if (digitalRead(Buttons1)==LOW)            //Abfrage von Button 1
  {
    menu = 1;                             
    updateMenu();                         
    delay(100);                         
    while(!digitalRead(Buttons1));     
  }

Führt einmal die Aufgabe aus und wartet dann bis der Taster losgelassen wird.

Du mußt nur die Variable menu in Funktion der Tasten setzen.

Die Abfrage des Menu (switch case) muß kontinuirlich aufgerufen werden und sollte darum im loop() stehen.

void loop()
{
  if (digitalRead(Buttons1)==LOW)   menu=1;         //Abfrage von Button 1
  if (digitalRead(Buttons2)==LOW)   menu=2;         //Abfrage von Button 2
...

switch (menu)
  case 1
{aktion 1}
break;
 case 2
{aktion 2}
break;
  {

Das FarbenSpringen kannst Du über ein Array machen so ersparst Du Dir die Farbausgabe 9 mal zu machen.

Im FadeLED darfst Du kein while verwenden weil das blockierend ist.
Du mußt in der aktion kontrollieren ob

  1. die Zeit für die nächste Änderung vorbei ist.
  2. der max/ minimal-Wert für das Faden erreicht ist und das Faden umgekehrt werden soll
  3. den neuen Wert für die LED herausschreiben.

Grüße Uwe