Arduino-Memory-Spiel (Simon-Klon) bauen – Schritt-für-Schritt-Anleitung
Komponenten & Materialien
| Komponente | Menge | Hinweis |
|---|---|---|
| Arduino UNO | 1 | |
| 330 Ω Widerstände (SparkFun) | 4 | Für LEDs |
| 10 kΩ Widerstände (SparkFun) | 4 | Pull-down für Taster |
| Verschiedene LEDs (4 verschiedene Farben) | 4 | Rot, Grün, Blau, Gelb o.ä. |
| Mini-Lautsprecher (SparkFun) | 1 | Optional für Sound |
| Breadboard (Full Size) | 1 | |
| Jumper-Wires (Sortiment) | 1 |
Apps & Online-Dienste
- Arduino IDE
Über dieses Projekt
Erinnerst du dich an das Spiel „Simon“? Viele meiner Generation (Jahrgang 70er) haben unzählige Stunden damit verbracht. Das Spiel war simpel: 4 farbige Taster leuchten in einer Folge auf, du musst die Folge nachdrücken. Bei jedem richtigen Durchgang wird die Folge um eine Farbe länger.
Ich bekam eins zu Weihnachten, verlor es aber bei Umzügen in einer der nie ausgepackten Kisten. Als „Erwachsener“ entdeckte ich Arduino und hatte die Chance, meinen verlorenen Zeitvertreib wiederzubeleben.
Dieses Tutorial zeigt, wie du ein ähnliches Spiel mit Arduino Uno, wenigen LEDs, Widerständen und einer einfachen Schaltung baust. Der Code ist für Einsteiger etwas anspruchsvoller, daher habe ich ihn ausführlich kommentiert.
Der einfachste Weg zum laufenden Spiel
- Schaltung exakt nach Schaltplan aufbauen (Kabelfarben egal).
- Quellcode in Arduino IDE kopieren & auf Board hochladen.
- Spielen!
Das Spiel startet nach ca. 3 Sekunden mit 5 langsamen Blitzen aller LEDs.

Blitzt eine LED nicht? Verkabelung prüfen. Meine winzigen Taster sitzen manchmal locker und springen heraus. Wenn Verkabelung stimmt: Funktionierende LED mit nicht funktionierender tauschen – so testen ob LED oder Verkabelung defekt.
Nach den 5 Blitzen leuchtet eine LED auf. Drücke den zugehörigen Taster. Dann leuchtet diese LED wieder + eine neue. Folge nachdrücken… usw.

Blinken alle LEDs schnell → Verloren! :D Die letzte Folge wird nochmals abgespielt (Punkte zählen), dann 5 langsame Blitze = Neues Spiel.
Du hast 2 Sekunden pro Tastendruck.
Mehr Schwierigkeit? In der Code-Zeile #define PLAYER_WAIT_TIME 2000 den Wert verringern. Oder weitere LED+Taster hinzufügen:
- Schaltungsteil für einen weiteren Kanal nachbauen (siehe Bild).
- Orange Draht an freien Arduino-Pin (nicht 0/1).
- Code anpassen:
byte noPins = 5; byte pins[] = {2, 13, 10, 8, 6};
Tipp für Arduino-Code
void setup() {
delay(3000); // Kurze Pause zu Beginn – ermöglicht Reset & Neuladen, falls Code Board blockiert
Serial.begin(9600);
Reset();
}
Ich habe die Idee später portabel umgesetzt… Für ein fortgeschrittenes, ähnliches Spiel mit Lego-Auto-Interface siehe Peter Kents Lego Mini Memory Game – richtig cool!
Verdrahtungsschema
Jeder der 4 Kanäle besteht aus:
- LED (Anode über 330Ω an Arduino-Pin, Kathode an GND)
- Taster (ein Pin an 5V, anderer an Arduino-Pin + 10kΩ Pull-down an GND)
Pins im Code: byte pins[] = {2, 13, 10, 8}; (Button-Eingang & LED-Ausgang共用同一个Pin – durch PinMode-Umschaltung INPUT/OUTPUT).


Kompletter Arduino-Code
#define PLAYER_WAIT_TIME 2000 // Max. Zeit zwischen Tastendrücken (2s)
byte sequence[100]; // Speicher für Lichtfolge
byte curLen = 0; // Aktuelle Folgenlänge
byte inputCount = 0; // Anzahl korrekter Tastendrücke in diesem Zug
byte lastInput = 0; // Letzte Eingabe des Spielers
byte expRd = 0; // Erwartete LED (Pin)
bool btnDwn = false; // Taster gedrückt?
bool wait = false; // Wartet auf Spieler?
bool resetFlag = false; // Verlust-Flag
byte soundPin = 5; // Lautsprecher-Pin
byte noPins = 4; // Anzahl Taster/LEDs
byte pins[] = {2, 13, 10, 8}; // Pins für Taster/LEDs (anpassen bei Erweiterung)
long inputTime = 0; // Timer für Reaktionszeit
void setup() {
delay(3000);
Serial.begin(9600);
Reset();
}
// Alle Pins auf INPUT oder OUTPUT setzen
void setPinDirection(byte dir) {
for (byte i = 0; i < noPins; i++) pinMode(pins[i], dir);
}
// Alle LED-Pins auf gleichen Wert setzen
void writeAllPins(byte val) {
for (byte i = 0; i < noPins; i++) digitalWrite(pins[i], val);
}
// Kurzer Piepton
void beep(byte freq) {
analogWrite(soundPin, 2); delay(freq);
analogWrite(soundPin, 0); delay(freq);
}
// Alle LEDs zusammen blinken lassen
void flash(short freq) {
setPinDirection(OUTPUT);
for (int i = 0; i < 5; i++) {
writeAllPins(HIGH); beep(50); delay(freq);
writeAllPins(LOW); delay(freq);
}
}
// Spielvariablen zurücksetzen
void Reset() {
flash(500);
curLen = 0; inputCount = 0; lastInput = 0; expRd = 0;
btnDwn = false; wait = false; resetFlag = false;
}
// Verloren: schnelles Blinken
void Lose() { flash(50); }
// Folge anzeigen (auch nach Verlust zur Punkteanzeige)
void playSequence() {
for (int i = 0; i < curLen; i++) {
Serial.print("Seq: "); Serial.print(i); Serial.print(" Pin: "); Serial.println(sequence[i]);
digitalWrite(sequence[i], HIGH); delay(500);
digitalWrite(sequence[i], LOW); delay(250);
}
}
// Verlust-Ablauf
void DoLoseProcess() {
Lose(); delay(1000);
playSequence(); delay(1000);
Reset();
}
// Hauptloop
void loop() {
if (!wait) {
// *** Arduino's Zug ***
setPinDirection(OUTPUT);
randomSeed(analogRead(A0));
sequence[curLen] = pins[random(0, noPins)]; // Neue zufällige LED
curLen++;
playSequence(); // Folge zeigen
beep(50); // Signalton
wait = true; // Jetzt Spieler dran
inputTime = millis(); // Startzeit messen
} else {
// *** Spieler's Zug ***
setPinDirection(INPUT);
if (millis() - inputTime > PLAYER_WAIT_TIME) { // Zeit abgelaufen?
DoLoseProcess(); return;
}
if (!btnDwn) {
expRd = sequence[inputCount]; // Erwarteter Pin
Serial.print("Erwartet: "); Serial.println(expRd);
for (int i = 0; i < noPins; i++) {
if (pins[i] == expRd) continue; // Richtigen Pin ignorieren
if (digitalRead(pins[i]) == HIGH) { // Falscher Taster gedrückt?
lastInput = pins[i];
resetFlag = true; btnDwn = true;
Serial.print("Gelesen: "); Serial.println(lastInput);
}
}
}
if (digitalRead(expRd) == HIGH && !btnDwn) { // Richtiger Taster gedrückt
inputTime = millis();
inputCount++; btnDwn = true;
Serial.print("Gelesen: "); Serial.println(expRd);
} else {
if (btnDwn && digitalRead(lastInput) == LOW) { // Taster losgelassen
btnDwn = false; delay(20);
if (resetFlag) { DoLoseProcess(); } // Falsch gedrückt → Verloren
else {
if (inputCount == curLen) { // Folge vollständig wiederholt?
wait = false; // Nächster Zug: Arduino
inputCount = 0; delay(1500);
}
}
}
}
}
}
Herstellungsprozess
- Monitor-Ambilight selbst bauen mit Arduino Nano & WS2812B LEDs
- Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
- Interaktives Gyroskop-LED-Display mit NeoPixel-Ring & Arduino
- Klassisches Pong-Spiel auf Arduino UNO mit OLED-Display bauen – Schritt-für-Schritt-Tutorial
- DIY Arduino USB Gaming Controller – Bauen Sie Ihren eigenen High-Performance Gamepad
- Arduino Touch Breakout-Spiel: Klassisches Arcade auf 2,4″ TFT LCD
- Pixie: DIY NeoPixel-Armbanduhr mit Arduino Pro Mini – Schick & Selbstgebaut
- Pixel Chaser: Interaktives One-Tap-LED-Spiel mit Arduino Nano
- Arduino-gesteuertes automatisiertes Chrome Dino-Spiel bauen
- Tragbares Überwachungs-Roboter-System mit Raspberry Pi & Android-App