Einleitung
Erinnerst du dich an das klassische Simon-Says-Spiel? Es ist das perfekte Projekt, um Arrays, Zustandsautomaten und die Verarbeitung von Benutzereingaben auf Arduino zu lernen. In diesem Tutorial bauen wir ein voll funktionsfähiges Simon-Says-Spiel mit vier LEDs und vier Tastern, das direkt in deinem Browser mit Velxio simuliert wird. Keine Hardware nötig!

Schaltungsdurchlauf
Schauen wir uns die Komponenten und ihre Verbindungen an.
Komponenten
| Komponente | ID | Zweck |
|---|---|---|
| Arduino Uno | arduino-uno | Das Gehirn des Spiels |
| Rote LED | led-red | Ausgabe für die rote Sequenz |
| Grüne LED | led-green | Ausgabe für die grüne Sequenz |
| Blaue LED | led-blue | Ausgabe für die blaue Sequenz |
| Gelbe LED | led-yellow | Ausgabe für die gelbe Sequenz |
| Roter Taster | button-red | Benutzereingabe für Rot |
| Grüner Taster | button-green | Benutzereingabe für Grün |
| Blauer Taster | button-blue | Benutzereingabe für Blau |
| Gelber Taster | button-yellow | Benutzereingabe für Gelb |
Verdrahtung
Die Anode (A) jeder LED ist mit einem digitalen Pin des Arduino verbunden, und ihre Kathode (C) geht über einen Strombegrenzungswiderstand (intern simuliert) an GND. Die Taster sind so verdrahtet, dass ein Anschluss (1.l) mit einem digitalen Pin und der andere Anschluss (2.l) mit GND verbunden ist, wobei die internen Pull-up-Widerstände des Arduino verwendet werden.
- Rote LED: Pin 8 (rotes Kabel) an Anode, Kathode an GND (schwarzes Kabel).
- Grüne LED: Pin 9 (grünes Kabel) an Anode, Kathode an GND.
- Blaue LED: Pin 10 (blaues Kabel) an Anode, Kathode an GND.
- Gelbe LED: Pin 11 (gelbes Kabel) an Anode, Kathode an GND.
- Roter Taster: Pin 2 (hellblaues Kabel) an 1.l, 2.l an GND.
- Grüner Taster: Pin 3 (hellblaues Kabel) an 1.l, 2.l an GND.
- Blauer Taster: Pin 4 (hellblaues Kabel) an 1.l, 2.l an GND.
- Gelber Taster: Pin 5 (hellblaues Kabel) an 1.l, 2.l an GND.
Alle Masseverbindungen teilen sich den GND-Pin des Arduino.
Code-Durchlauf
Öffne den Code-Editor in Velxio, um den vollständigen Sketch zu sehen.

Konstanten und Variablen
const int LED_PINS[] = {8, 9, 10, 11};
const int BUTTON_PINS[] = {2, 3, 4, 5};
const int NUM_LEDS = 4;
int sequence[100];
int sequenceLength = 0;
int currentStep = 0;
Wir definieren Arrays für die LED- und Taster-Pins, passend zur Verdrahtung. sequence speichert das zufällige Muster (bis zu 100 Schritte). sequenceLength verfolgt, wie viele Schritte der Spieler wiederholen muss, und currentStep verfolgt den Fortschritt des Spielers.
Setup
void setup() {
Serial.begin(9600);
for (int i = 0; i < NUM_LEDS; i++) {
pinMode(LED_PINS[i], OUTPUT);
pinMode(BUTTON_PINS[i], INPUT_PULLUP);
}
randomSeed(millis());
newGame();
}
Wir setzen die LED-Pins als Ausgänge und die Taster-Pins als Eingänge mit internen Pull-ups (so dass die Taster bei Betätigung LOW lesen). randomSeed(millis()) stellt sicher, dass jedes Spiel eine andere Sequenz erhält. newGame() startet die erste Runde.
Spiellogik
newGame() setzt die Sequenzlänge auf 1 zurück, fügt einen zufälligen Schritt hinzu und spielt die Sequenz ab.
void newGame() {
sequenceLength = 1;
currentStep = 0;
addToSequence();
playSequence();
}
void addToSequence() {
sequence[sequenceLength - 1] = random(0, NUM_LEDS);
}
void playSequence() {
for (int i = 0; i < sequenceLength; i++) {
flashLED(sequence[i]);
delay(500);
}
}
void flashLED(int led) {
digitalWrite(LED_PINS[led], HIGH);
delay(300);
digitalWrite(LED_PINS[led], LOW);
}
playSequence() durchläuft die gespeicherte Sequenz und lässt jede LED für 300 ms mit einer Pause von 500 ms aufleuchten.
Hauptschleife
void loop() {
for (int i = 0; i < NUM_LEDS; i++) {
if (digitalRead(BUTTON_PINS[i]) == LOW) {
flashLED(i);
if (i == sequence[currentStep]) {
currentStep++;
if (currentStep == sequenceLength) {
delay(1000);
sequenceLength++;
currentStep = 0;
addToSequence();
playSequence();
}
} else {
// Falscher Taster - Spiel vorbei
for (int j = 0; j < 3; j++) {
for (int k = 0; k < NUM_LEDS; k++) {
digitalWrite(LED_PINS[k], HIGH);
}
delay(200);
for (int k = 0; k < NUM_LEDS; k++) {
digitalWrite(LED_PINS[k], LOW);
}
delay(200);
}
newGame();
}
delay(300);
while (digitalRead(BUTTON_PINS[i]) == LOW);
}
}
}
Die Schleife überprüft kontinuierlich alle Taster. Wenn ein Taster gedrückt wird (LOW), leuchtet die entsprechende LED auf. Wenn der gedrückte Taster mit dem erwarteten Schritt (sequence[currentStep]) übereinstimmt, rücken wir vor. Wenn der Spieler die Sequenz abschließt, fügen wir einen neuen Schritt hinzu und spielen die längere Sequenz ab. Bei einem Fehler blinken alle LEDs dreimal und ein neues Spiel beginnt.
Schlüsselkonzepte
- Arrays: Die Verwendung von Arrays zum Speichern von Pin-Nummern und der Spielsequenz macht den Code skalierbar und sauber.
- Interne Pull-up-Widerstände:
INPUT_PULLUPmacht externe Widerstände überflüssig; Taster lesen bei Betätigung LOW. - Entprellung: Die
delay(300)- undwhile(digitalRead(...)==LOW)-Schleife bieten eine einfache Entprellung. - Zufälligkeit:
randomSeed(millis())undrandom()erzeugen unvorhersehbare Sequenzen. - Zustandsautomat: Das Spiel verfolgt
currentStepundsequenceLength, um den Fortschritt zu verwalten.
Häufige Fallstricke & Debugging-Tipps
- Taster reagieren nicht? Überprüfe, ob die Taster-Pins auf
INPUT_PULLUPgesetzt und korrekt verdrahtet sind (1.l an Pin, 2.l an GND). - LEDs leuchten nicht? Überprüfe, ob die LED-Pins als
OUTPUTgesetzt sind und die Anoden-/Kathodenverbindungen korrekt sind. - Sequenz zu schnell? Passe die
delay()-Werte inflashLED()undplaySequence()an. - Spiel setzt unerwartet zurück? Stelle sicher, dass
randomSeed(millis())nur einmal insetup()aufgerufen wird. - Seriellen Monitor verwenden: Füge
Serial.println()-Anweisungen hinzu, um Sequenzwerte zu debuggen.
Vorschläge für Erweiterungen
- Summer hinzufügen: Spiele einen Ton für jede LED-Farbe ab.
- Schwierigkeitsgrade: Erhöhe die Geschwindigkeit, wenn die Sequenz wächst.
- Highscore: Verfolge die längste erreichte Sequenz.
- Mehrspieler: Wechselt euch zwischen zwei Spielern ab.
- Visuelles Feedback: Verwende unterschiedliche LED-Helligkeiten oder Muster.
Probier es selbst aus!
Bereit zu spielen? Öffne das Live-Beispiel auf Velxio und starte die Simulation. Drücke die Taster, um die Sequenz zu wiederholen. Wie weit kommst du?
Viel Spaß beim Bauen!