Zurück

Baue ein Simon-Says-Memory-Spiel mit Arduino auf Velxio

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!

Schaltplan von Simon-Says auf der Velxio-Simulator-Leinwand

Schaltungsdurchlauf

Schauen wir uns die Komponenten und ihre Verbindungen an.

Komponenten

KomponenteIDZweck
Arduino Unoarduino-unoDas Gehirn des Spiels
Rote LEDled-redAusgabe für die rote Sequenz
Grüne LEDled-greenAusgabe für die grüne Sequenz
Blaue LEDled-blueAusgabe für die blaue Sequenz
Gelbe LEDled-yellowAusgabe für die gelbe Sequenz
Roter Tasterbutton-redBenutzereingabe für Rot
Grüner Tasterbutton-greenBenutzereingabe für Grün
Blauer Tasterbutton-blueBenutzereingabe für Blau
Gelber Tasterbutton-yellowBenutzereingabe 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.

Alle Masseverbindungen teilen sich den GND-Pin des Arduino.

Code-Durchlauf

Öffne den Code-Editor in Velxio, um den vollständigen Sketch zu sehen.

Quellcode für Simon-Says im Velxio Monaco Editor

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

Häufige Fallstricke & Debugging-Tipps

Vorschläge für Erweiterungen

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?

Simon Says auf Velxio starten

Viel Spaß beim Bauen!


Teilen auf:
David Montero

Geschrieben von

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

Ähnliche Artikel


Vorheriger Artikel
TFT ILI9341 Display Demo: Grafik & Bouncing Ball auf Arduino
Nächster Artikel
RGB-LED-Farbwechsel mit Arduino auf Velxio