Tastenreihenfolge soll ausgewertet werdem

Hallo,
ich muss ein Spiel bauen bei dem Leds anfangs in einer bestimmten reihe aufleuchten und man diese dann mit den drucktasten in der selben Reihenfolge betätigen muss. Mein Problem liegt dabei, dass ich nicht weiß wie das Programm erkennen kann ob die gedrückte reihenfolge richtig ist oder nicht. Ich habe versucht if schleifen zu benutzen doch wenn ich mehrere if schleifen ineinander benutze dann kommt das Problem auf, dass die Drucktasten gleichzeitig gedrückt werden müssen. Das habe ich bis jetzt:

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2);
int a;
int e;
int b;
int c;
 int d;
 int x;
void setup() {
  lcd.init();
  lcd.backlight();
  pinMode(8,INPUT_PULLUP);
pinMode(7,INPUT_PULLUP);
pinMode(6,INPUT_PULLUP);
pinMode(5,INPUT_PULLUP);
pinMode(4,INPUT_PULLUP);
Serial.begin(9600);
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(11,OUTPUT);
pinMode(10,OUTPUT);
pinMode(9,OUTPUT);
digitalWrite(9, HIGH);
delay(500);
digitalWrite(9, LOW);
delay(500);
digitalWrite(10, HIGH);
delay(500);
digitalWrite(10, LOW);
delay(500);
digitalWrite(9, HIGH);
delay(500);
digitalWrite(9, LOW);
delay(500);
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
digitalWrite(10, HIGH);
delay(500);
digitalWrite(10, LOW);
delay(500);
digitalWrite(10, HIGH);
delay(500);
digitalWrite(10, LOW);
delay(500);
digitalWrite(11, HIGH);
delay(500);
digitalWrite(11, LOW);
delay(500);
digitalWrite(10, HIGH);
delay(500);
digitalWrite(10, LOW);
delay(500);
digitalWrite(12, HIGH);
delay(500);
digitalWrite(12, LOW);
delay(1000);
}
  void loop() {
  a=digitalRead(4);
  b=digitalRead(5);
c=digitalRead(6);
d=digitalRead(7);
e=digitalRead(8);
while(digitalRead(8)==1&&digitalRead(7)==1&&digitalRead(6)==1&&digitalRead(5)==1&&digitalRead(4)==1){
}

if(e==0){
  digitalWrite(9,HIGH);
  delay(500);
  digitalWrite(9,LOW);
  lcd.print("richtig");
  delay(1000);
  lcd.clear();
  while(digitalRead(8)==1&&digitalRead(7)==1&&digitalRead(6)==1&&digitalRead(5)==1&&digitalRead(4)==1){
}
  if(a==0){
    digitalWrite(13,HIGH);
  delay(500);
  digitalWrite(13,LOW);
    lcd.print("Falsch gemacht");
    delay(1000);
    lcd.clear();
}
if(b==0){
  digitalWrite(12,HIGH);
  delay(500);
  digitalWrite(12,LOW);
    lcd.print("Falsch gemacht");
    delay(1000);
    lcd.clear();
}
if(c==0){
  digitalWrite(11,HIGH);
  delay(500);
  digitalWrite(11,LOW);
    lcd.print("Falsch gemacht");
    delay(1000);
    lcd.clear();
}
  }
  if(d==0){
    digitalWrite(10,HIGH);
    delay(500);
    digitalWrite(10,LOW);
    if(e==0){
  digitalWrite(9,HIGH);
  delay(500);
  if(a==0){
  digitalWrite(13,HIGH);
  delay(500);
  if(d==0){
  digitalWrite(10,HIGH);
  delay(500);
  if(d==0){
  digitalWrite(10,HIGH);
  delay(500);
  if(c==0){
  digitalWrite(11,HIGH);
  delay(500);
if(d==0){
  digitalWrite(10,HIGH);
  delay(500);
  if(b==0){
  digitalWrite(12,HIGH);
  delay(500);
  lcd.print("Richtig gemacht");
  delay(1000);
  lcd.clear();
}  
}
}
}
}
}
}
}
}

ich wäre sehr dankbar um Hilfe!
ps: bin erst anfänger :wink:Vorformatierter Text

zunächst liest du bitte mal im Forum How to nach wie man Code postet und dann korrigiere bitte deinen ersten Post.

Dann erklär nur mal wie es dazu kommt:

wer sagt du musst? Normalerweise macht man solche Sachen aus Spaß.

"Simon Says Arduino" hast hoffentlich auch schon gegoogelt - wenn nicht ... hol das nach.

Wenn diese Sachen geklärt sind, dann schauen wir mal, wie wir da helfen können...

*möchte

Ein Tipp: Wenn Du in der IDE Strg+t drückst, wird der Text mit Einrückungen lesbarer.

1 Like

Hallo,
nur nebenbei if... ist keine Schleife , sondern eine Verzweigung. Ich hab das Spiel noch nicht verstanden. Die 5 led´s leuchten nacheinander in einer in einer bestimmten Reihenfolge , und die muss mit den Tastern anschließend nachgebildet werden. Da würde ich doch erst mal ein Array mit Zufallszahlen von 1-5 füllen und damit nacheinander die LEDs steuern und anschließend mit den Tastern ein zweites Array. Wenn die dann gleich sind ok.
Heinz

Ich habe das mal gemacht. Das endet dann so:

                }
              }
            }
          }
        }
      }
    }
  }
}

@mertoo Wie Du leicht sehen kannst, ist diese Verschachtelungstiefe wohl nicht so ganz optimal.

Ich würde daher empfehlen, dass Du Dich erst noch mit ein paar Grundlagen vertraut machst, bevor diese - eigentlich ganz schöne und interessante - Aufgabe in Angriff genommen wird.

Was mir so als allererstes an Stichworten einfällt:

  • Magic numbers:
    alle Ein- und Ausgänge mit konstanten Namen vereinbaren statt Pin-Nummern zu verwenden
  • Es sind jeweils mehrere LEDs und Tasten:
    Arrays und Schleifen (for) benutzen; dann ist der Tipp von @Rentner auch leichter umzusetzen: Die Zahlen 1-5 (besser: 0 bis 4) sind dann die Indizes für die Arrays.
  • keine delay()
  • Schrittkette / Zustandsautomat / FSM für die Lichtreihenfolge und für das Einsammeln der Tasten vorsehen

Lass doch erstmal die Tasten weg und mach das mit dem Licht richtig, dann legst Du das Licht still und kümmerst Dich um die Tastenreihenfolge. Und am Ende wird das richtig/falsch ganz von alleine mit abfallen.

Dein Programm kann momentan nur eine Lichtfolge in einer Geschwindigkeit abspielen, das wird sicher schnell langweilig. Da ist also Raum für wunderbare Erweiterungen.


Gruß Walter

1 Like

Für die Tasten könntest du auch eine Library nehmen, die dir Entprellen und Zustandswechselerkennung abnimmt.

Ich würde dafür Bounce2 empfehlen.

1 Like