Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino-Memory-Spiel (Simon-Klon) bauen – Schritt-für-Schritt-Anleitung

Komponenten & Materialien

KomponenteMengeHinweis
Arduino UNO1
330 Ω Widerstände (SparkFun)4Für LEDs
10 kΩ Widerstände (SparkFun)4Pull-down für Taster
Verschiedene LEDs (4 verschiedene Farben)4Rot, Grün, Blau, Gelb o.ä.
Mini-Lautsprecher (SparkFun)1Optional für Sound
Breadboard (Full Size)1
Jumper-Wires (Sortiment)1

Apps & Online-Dienste

Ü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

  1. Schaltung exakt nach Schaltplan aufbauen (Kabelfarben egal).
  2. Quellcode in Arduino IDE kopieren & auf Board hochladen.
  3. Spielen!

Das Spiel startet nach ca. 3 Sekunden mit 5 langsamen Blitzen aller LEDs.

Arduino-Memory-Spiel (Simon-Klon) bauen – Schritt-für-Schritt-Anleitung

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.

Arduino-Memory-Spiel (Simon-Klon) bauen – Schritt-für-Schritt-Anleitung

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:

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:

Pins im Code: byte pins[] = {2, 13, 10, 8}; (Button-Eingang & LED-Ausgang共用同一个Pin – durch PinMode-Umschaltung INPUT/OUTPUT).

Arduino-Memory-Spiel (Simon-Klon) bauen – Schritt-für-Schritt-Anleitung
Arduino-Memory-Spiel (Simon-Klon) bauen – Schritt-für-Schritt-Anleitung

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

  1. Monitor-Ambilight selbst bauen mit Arduino Nano & WS2812B LEDs
  2. Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
  3. Interaktives Gyroskop-LED-Display mit NeoPixel-Ring & Arduino
  4. Klassisches Pong-Spiel auf Arduino UNO mit OLED-Display bauen – Schritt-für-Schritt-Tutorial
  5. DIY Arduino USB Gaming Controller – Bauen Sie Ihren eigenen High-Performance Gamepad
  6. Arduino Touch Breakout-Spiel: Klassisches Arcade auf 2,4″ TFT LCD
  7. Pixie: DIY NeoPixel-Armbanduhr mit Arduino Pro Mini – Schick & Selbstgebaut
  8. Pixel Chaser: Interaktives One-Tap-LED-Spiel mit Arduino Nano
  9. Arduino-gesteuertes automatisiertes Chrome Dino-Spiel bauen
  10. Tragbares Überwachungs-Roboter-System mit Raspberry Pi & Android-App