Mein erstes Blinklicht - hat aber nen Fehler

Hallo ich hab gerade meinen ersten sketch mit den adafruit tutorials erstellt und viele LEDs an viele PINs angeschlossen und verschiedene Lichtmodi über viele if ... else Befehle realisiert.
Macht ne Menge Spaß nur bin ich noch totaler Anfänger. Und ein Rätsel hab ich: nach der vorletzten Aktion (Wechselnder Farbblinker delay1000) wechselt mein Sketch nicht in den nächsten Modus, manchmal allerdings schon - ich muss halt auf dem Button rumdrücken.
Der Lightmode 8 schaltet einfach nicht weiter, woran könnte sowas liegen
...

 if (lightMode == 6) {
                      lightMode = 7;
                      Serial.println("7: Farb-Welle");
                    } else {
                      if (lightMode == 7) {
                        lightMode = 8;
                        Serial.println("8: Farb-Blinker");
                      } else {
                        if (lightMode == 8) {
                          lightMode = 9;
                          Serial.println("9: Blitzer");
          } else {
                lightMode = 0;           // turn light off!
                Serial.println("0: alle aus");
              }

...

if (lightMode == 8) { // Farb-Blinker
    digitalWrite(grun1, HIGH);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, HIGH);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, HIGH);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, HIGH);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, HIGH);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, HIGH);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, HIGH);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, HIGH);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, HIGH);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, HIGH);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, HIGH);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, HIGH);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, HIGH);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, HIGH);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, HIGH);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, HIGH);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
  }
if (lightMode == 9) { // Blitzer
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(50);
    digitalWrite(grun1, HIGH);
    digitalWrite(rot1, HIGH);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, HIGH);
    digitalWrite(grun2, HIGH);
    digitalWrite(rot2, HIGH);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, HIGH);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, HIGH);
    delay(50);
  }
}

Hab' das auch mal voller Stolz gefilmt: beginners arduino duemilanove blinkmachine - YouTube
Viele Grüße
Jan

Hallo erstmal!

Wie schalten denn die Modi normalerweise weiter? Automatisch wenn einer durch ist, das dann der nächste kommt? Ist aus den geposteten Codes nicht ganz ersichtlich, poste am besten mal den gesamten Code, dann kann man sich ein besseres Bild davon machen.

Und herzlichen Glückwunsch zu den ersten Erfolgen!

Hi,
die Modi schalten durch Tastendruck weiter: der Tastenzustand wird beobachtet und wenn er sich ändert wird verglichen, welcher Lichtmodus läuft und dann der nächste aktiviert. Der Code ist etwas lang, ich kürze mal die Lichtmodi, zwischen denen einfach gewechselt wird raus:

int switchPin = 2;              // switch is connected to pin 2
int grun1 = 3;
int rot1 = 4;
int blau1 = 5;
int gelb1 = 6;
int grun2 = 7;
int rot2 = 8;
int blau2 = 9;
int gelb2 = 10;
int grun3 = 11;
int rot3 = 12;
int orange = 13;

int val;                        // variable for reading the pin status
int val2;                       // variable for reading the delayed status
int buttonState;                // variable to hold the button state

int lightMode = 0;              // What mode is the light in?

void setup() {
  pinMode(switchPin, INPUT);    // Set the switch pin as input

  pinMode(grun1, OUTPUT);
  pinMode(rot1, OUTPUT);
  pinMode(blau1, OUTPUT);
  pinMode(gelb1, OUTPUT);
  pinMode(grun2, OUTPUT);
  pinMode(rot2, OUTPUT);
  pinMode(blau2, OUTPUT);
  pinMode(gelb2, OUTPUT);
  pinMode(grun3, OUTPUT);
  pinMode(rot3, OUTPUT);
  pinMode(orange, OUTPUT);
  
  Serial.begin(9600);           // Set up serial communication at 9600bps
  buttonState = digitalRead(switchPin);   // read the initial state
}

void loop(){
  val = digitalRead(switchPin);      // read input value and store it in val
  delay(10);                         // 10 milliseconds is a good amount of time
  val2 = digitalRead(switchPin);     // read the input again to check for bounces
  if (val == val2) {                 // make sure we got 2 consistant readings!
    if (val != buttonState) {          // the button state has changed!
      if (val == LOW) {                // check if the button is pressed
        if (lightMode == 0) {          // if its off
          lightMode = 1;               // turn lights on!
          Serial.println("1: alle an");
        } else { 
          if (lightMode == 1) {
            lightMode = 2;
            Serial.println("2: rot");
          } else {
            if (lightMode == 2) {
              lightMode = 3;
              Serial.println("3: gruen");
            } else {
              if (lightMode == 3) {
                lightMode = 4;
                Serial.println("4: blau");
              } else {
                if (lightMode == 4) {
                 lightMode = 5;
                Serial.println("5: gelb");
                } else {
                  if (lightMode == 5) {
                    lightMode = 6;
                    Serial.println("6: Rot-Gruen-Blinker");
                  } else {
                    if (lightMode == 6) {
                      lightMode = 7;
                      Serial.println("7: Farb-Welle");
                    } else {
                      if (lightMode == 7) {
                        lightMode = 8;
                        Serial.println("8: Farb-Blinker");
                      } else {
                        if (lightMode == 8) { //hier hängt er immer
                          lightMode = 9;
                          Serial.println("9: Blitzer");
          } else {
                lightMode = 0;           // turn light off!
                Serial.println("0: alle aus");
              }
              }
              }
          }
          }
          }
        }
        }
        }
    }
    }
    buttonState = val;                 // save the new state in our variable
  }

  // Now do whatever the lightMode indicates
  if (lightMode == 0) { // all-off
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, HIGH);
  }

...if (lightMode ==... // die hab' ich hier weggelassen weil die gut funktionieren.

 if (lightMode == 7) { // Farb-Welle
    digitalWrite(rot3, LOW);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun1, HIGH);
    delay(50);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, HIGH);
    delay(50);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, HIGH);
    delay(50);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, HIGH);
    delay(50);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, HIGH);
    delay(50);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, HIGH);
    delay(50);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, HIGH);
    delay(50);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, HIGH);
  }
if (lightMode == 8) { // Farb-Blinker
    digitalWrite(grun1, HIGH);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, HIGH);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, HIGH);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, HIGH);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, HIGH);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, HIGH);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, HIGH);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, HIGH);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, HIGH);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, HIGH);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, HIGH);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, HIGH);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, HIGH);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, HIGH);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, HIGH);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, HIGH);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
  }
if (lightMode == 9) { // Blitzer zu dem nicht durch Tastendruck gewechselt wird
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(50);
    digitalWrite(grun1, HIGH);
    digitalWrite(rot1, HIGH);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, HIGH);
    digitalWrite(grun2, HIGH);
    digitalWrite(rot2, HIGH);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, HIGH);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, HIGH);
    delay(50);
  }
}

Ich hab mal deinen Code ein wenig umformatiert: Anstatt viele verschachtelte "else{ if(...){} else{usw."-Konstruktionen zu benutzen kannst du auch einfach "else if(){}" benutzen. Damit kannst du viele Zustände übersichtlicher (und deutlich weniger fehleranfällig) abfragen (obwohl ich in dem Falle schon zu einer switch/case-Konstruktion raten würde, die ist nochmal übersichtlicher).
Das mit dem "else if" sieht dann so aus:

int switchPin = 2;              // switch is connected to pin 2
int grun1 = 3;
int rot1 = 4;
int blau1 = 5;
int gelb1 = 6;
int grun2 = 7;
int rot2 = 8;
int blau2 = 9;
int gelb2 = 10;
int grun3 = 11;
int rot3 = 12;
int orange = 13;

int val;                        // variable for reading the pin status
int val2;                       // variable for reading the delayed status
int buttonState;                // variable to hold the button state

int lightMode = 0;              // What mode is the light in?

void setup() {
  pinMode(switchPin, INPUT);    // Set the switch pin as input

  pinMode(grun1, OUTPUT);
  pinMode(rot1, OUTPUT);
  pinMode(blau1, OUTPUT);
  pinMode(gelb1, OUTPUT);
  pinMode(grun2, OUTPUT);
  pinMode(rot2, OUTPUT);
  pinMode(blau2, OUTPUT);
  pinMode(gelb2, OUTPUT);
  pinMode(grun3, OUTPUT);
  pinMode(rot3, OUTPUT);
  pinMode(orange, OUTPUT);
  
  Serial.begin(9600);           // Set up serial communication at 9600bps
  buttonState = digitalRead(switchPin);   // read the initial state
}

void loop(){
  val = digitalRead(switchPin);      // read input value and store it in val
  delay(10);                         // 10 milliseconds is a good amount of time
  val2 = digitalRead(switchPin);     // read the input again to check for bounces
  if (val == val2) {                 // make sure we got 2 consistant readings!
    if (val != buttonState) {          // the button state has changed!
      if (val == LOW) {                // check if the button is pressed
          if (lightMode == 0) {          // if its off
                   lightMode = 1;               // turn lights on!
                Serial.println("1: alle an");
          } else if (lightMode == 1) {
              lightMode = 2;
              Serial.println("2: rot");
          } else if (lightMode == 2) {
              lightMode = 3;
                Serial.println("3: gruen");
          } else if (lightMode == 3) {
               lightMode = 4;
              Serial.println("4: blau");
          } else if (lightMode == 4) {
              lightMode = 5;
            Serial.println("5: gelb");
          } else if (lightMode == 5) {
              lightMode = 6;
            Serial.println("6: Rot-Gruen-Blinker");
          } else if (lightMode == 6) {
            lightMode = 7;
            Serial.println("7: Farb-Welle");
          } else if (lightMode == 7) {
            lightMode = 8;
            Serial.println("8: Farb-Blinker");
          } else if (lightMode == 8) {                   //hier hängt er immer
            lightMode = 9;
            Serial.println("9: Blitzer");
          } else {
            lightMode = 0;                 // turn light off!
            Serial.println("0: alle aus");
          }
      }
    buttonState = val;                 // save the new state in our variable
    }
  }

  // Now do whatever the lightMode indicates
  if (lightMode == 0) { // all-off
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, HIGH);
  }

...if (lightMode ==... // die hab' ich hier weggelassen weil die gut funktionieren.

 if (lightMode == 7) { // Farb-Welle
    digitalWrite(rot3, LOW);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun1, HIGH);
    delay(50);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, HIGH);
    delay(50);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, HIGH);
    delay(50);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, HIGH);
    delay(50);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, HIGH);
    delay(50);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, HIGH);
    delay(50);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, HIGH);
    delay(50);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, HIGH);
  }
if (lightMode == 8) { // Farb-Blinker
    digitalWrite(grun1, HIGH);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, HIGH);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, HIGH);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, HIGH);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, HIGH);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, HIGH);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, HIGH);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, HIGH);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, HIGH);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, HIGH);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, HIGH);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, HIGH);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, HIGH);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, HIGH);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
    digitalWrite(grun1, HIGH);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, HIGH);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(1000);
  }
if (lightMode == 9) { // Blitzer zu dem nicht durch Tastendruck gewechselt wird
    digitalWrite(grun1, LOW);
    digitalWrite(rot1, LOW);
    digitalWrite(blau1, LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(grun2, LOW);
    digitalWrite(rot2, LOW);
    digitalWrite(blau2, LOW);
    digitalWrite(gelb2, LOW);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, LOW);
    delay(50);
    digitalWrite(grun1, HIGH);
    digitalWrite(rot1, HIGH);
    digitalWrite(blau1, HIGH);
    digitalWrite(gelb1, HIGH);
    digitalWrite(grun2, HIGH);
    digitalWrite(rot2, HIGH);
    digitalWrite(blau2, HIGH);
    digitalWrite(gelb2, HIGH);
    digitalWrite(grun3, LOW);
    digitalWrite(rot3, LOW);
    digitalWrite(orange, HIGH);
    delay(50);
  }
}

Du siehst, alle "gleichberechtigten" Abfragen stehen hübsch untereinander.

Der einzige "Fehler", der mir in deinem Sketch auffallen würde, ist, dass du zuerst den buttonstate abfragst und dann den Lichtmodus abspielst. Das läuft alles strikt nacheinander ab. Da dein lightmode 8 acht mal delay(1000) beinhaltet, musst du folglich den Knopf im schlimmsten fall 8 Sekunden lang festhalten, damit er auch während der buttonstate-Abfrage gedrückt ist (nun weiß ich leider nicht wie lange du den Knopf immer so festhältst...). Probier doch einfach mal, den Knopf solange gedrückt zu halten, bis der lightmode 8 durchgelaufen ist (wenn du das noch nicht getan hast).
Sollte das auch nicht funktionieren, kann man ja noch mal nen genaueren Blick drauf werfen :wink:

Hoffe, das hat dir geholfen!

Hallo und ja, du hast recht: ich habe mal ein Serialprintl hinter den buttonstate = val eingefügt und jetzt erkenne ich, dass je länger meine Blinklichter blinken, desto seltener wird der Zustand der Taste abgefragt.
Mal sehen, ob ich jetzt zum nächsten Tutorial gehe oder nicht doch noch was verbessere...
MFG
Jan

Du könntest Dir den Unterschied zwischen den Tutorials "Blink" und "Blink Without Delay" angucken und es so realisieren, dann gäbs bei einem Knopfdruck überhaupt keine Verzögerung, egal wie lange ein Lichtmodus läuft...

Danke für den Hinweis. Es wird dann also nicht der Loop gestoppt, sondern die millis abgefragt, gespeichert und immer wieder verglichen. Werd's mal probieren.

Genau, irgendwas in der Art von

  int previousMillis = millis();
[...]
  if (lightMode == 8) { // Farb-Blinker
    if (millis()-previousMillis < 1000) {
      digitalWrite(grun1, HIGH);
      digitalWrite(rot1, LOW);
      digitalWrite(blau1, LOW);
      digitalWrite(gelb1, LOW);
      digitalWrite(grun2, HIGH);
      digitalWrite(rot2, LOW);
      digitalWrite(blau2, LOW);
      digitalWrite(gelb2, LOW);
      digitalWrite(grun3, LOW);
      digitalWrite(rot3, LOW);
      digitalWrite(orange, LOW);
    } else if (millis()-previousMillis < 2000) {
      digitalWrite(grun1, LOW);
      digitalWrite(rot1, HIGH);
      digitalWrite(blau1, LOW);
      digitalWrite(gelb1, LOW);
      digitalWrite(grun2, LOW);
      digitalWrite(rot2, HIGH);
      digitalWrite(blau2, LOW);
      digitalWrite(gelb2, LOW);
      digitalWrite(grun3, LOW);
      digitalWrite(rot3, LOW);
      digitalWrite(orange, LOW);
    } else if (millis()-previousMillis < 3000) {
      digitalWrite(grun1, LOW);
      digitalWrite(rot1, LOW);
      digitalWrite(blau1, HIGH);
      digitalWrite(gelb1, LOW);
      digitalWrite(grun2, LOW);
      digitalWrite(rot2, LOW);
      digitalWrite(blau2, HIGH);
      digitalWrite(gelb2, LOW);
      digitalWrite(grun3, LOW);
      digitalWrite(rot3, LOW);
      digitalWrite(orange, LOW);
    } else if (millis()-previousMillis < 4000) {
[...]

Und vergiss nicht, "previousMillis = millis()" zu setzen, wenn Du den Lightmode hochzählst... :wink:

Hey, erstmal Glückwunsch zu Deinem ersten Projekt.

Ich mag es total verkennen,
aber ich würde hier CASE einsetzen... das macht das ganze
übersichtlicher... denke ich.

Du sagst umso länger geblinkt wird, wird weniger abgefragt.

Das wirkt für mich so, als würde Dein Kommunikationsbuffer volllaufen... vielleicht ein Irrtum...

Ein Tipp der mit Vorsicht zu genießen ist... aber für V2.0 vielleicht in Frage kommt...

Es gibt die Möglichkeit per C++ Pins zu schalten...
damit kannst Du in einer Zeile alle Pins setzen...

Aber Vorsicht... kann auch in die Hose gehen,
also bitte Tutorials ordentlich lesen, und
verstehen.. bevor Du es machst....

Lieber Gruß
Chris

// !! Achtung ich kann hierfür keine Garantie geben,
// dafür bin ich selbst viel zu neu im Thema...
// Aber vielleicht hilft es Dir Dein Projekt zu optimieren.
// Lieber Gruß
// ChrisS

// Blinksdings Hilfe-OptimierungsAnsatz für janwil
// Erklärung siehe ganz unten....


void setup() {
DDRD = B11111000;
DDRC = B111111;

PORTD = B11111000;
PORTC = B111111;

delay(1000);
PORTD = B00000000;
PORTC = B000000;

delay(1000);

}


void loop() {

// Pins werden von 0 bis... von hinten gezählt...  
  
PORTD = B00010000;
delay(1000);
// Pin 4 auf High alles andere auf low  


PORTD = B00100000;
delay(1000);
// Pin5 auf High alles andere auf low


PORTC =B100000;
delay(1000);
// Pin13 auf High alles andere auf low


PORTD=B11011000;
PORTC=B101010;
delay(1000);
// Oh, mit zwei Zeilen 13 Pins gesetzt... das könnte ein Vorteil sein.

}




//!! Lies Dir unbedingt: http://www.arduino.cc/en/Reference/PortManipulation
// und versuch es zu verstehen... 

// 
// Du sagst das alle Digitalpins Ausgänge sind,
// bis auf Pin 0&1 (die sind für die Kommunikation RX&TX zuständig) und Pin2 als Tastereingang.
// da die restlichen Digitalpins nur bis 13 gehen, ist DDRC etwas kürzer. (Es bleiben dann nämlich nurnoch 6 Pins über).
// DDRD sind die Ports 0 bis 7... >>von hinten gesehen<<... die Nullen sind also Pin 0 und Pin 1 und Pin 2.
// DDRC sind die Ports 8 bis 13

@joghurt
int previousmillis = millis();
ist ein problem!
die zeitvariable ist nach 32767ms = 32,7sekunden voll und startet wieder bei etwa -32768ms! so kann millis()-previousMillis nicht kleiner als 1000 sein und es wird nichts ausgegeben!
ich empfehle dir dringend
unsigned long previousmillis = millis();
zu verwenden!
hatte mal ähnliche probleme.

Oder so. :sunglasses: Danke! :wink: