Einführung

In diesem Arduino-Projekt zeige ich dir, wie man das Spiel "Simon Says" mit einem Arduino erstellt.

Simon Says ist ein Spiel, bei dem du 4 Lichter hast, die jeweils mit einem Druckknopf verbunden sind. Zu Beginn leuchtet ein Licht auf. Dann drückst du den entsprechenden Knopf. Wenn du den richtigen Knopf drückst, leuchtet derselbe auf und ein weiteres Licht wird aktiviert. Jedes Mal, wenn du richtig liegst, wird ein neues Licht aktiviert, und du steigst eine Runde höher. In diesem Projekt kannst du einstellen, wie viele Runden du spielen möchtest.

Wenn du eine Sequenz falsch machst, hast du das Spiel verloren und musst von vorne beginnen. Jedes Mal, wenn das Spiel neu gestartet wird, wird eine zufällige Sequenz generiert.

Schritt 1: Benötigste Materialien

1x Arduino UNO

1x Breadboard

18x Überbrückungskabel

4xDruckknopf

1x grünes, blaues, gelbes und rotes LED-Licht

4x 220 Ohm Widerstand

 

Schritt 2: Bauen und Verkabelung

Zuerst verbindest du den Plus- und Minuspol des Arduino mit dem Plus- und Minuspol des Breadboards.

Dann steckst du die LED-Lichter in das Breadboard. An jedem LED-Licht steckst du einen 220-Ohm-Widerstand auf der Plus-Seite ein (das ist der längere Pin).

Vom Minuspol der LED-Lichter gehst du zu den eigenen Druckknöpfen.

Von jedem Knopf führt ein Draht vertikal vom Minus der LED (siehe Fritzing-Diagramm) zum Minus des Breadboards. Dann führt ein Draht von jedem Knopf diagonal vom Minus der LED zum Plus des Breadboards.

Füge dann ein Kabel vom diagonalen Draht zum Minus der LEDs hinzu. Rot geht zu A2, Grün zu A3, Gelb zu A1 und Blau zu A0.

Schließlich verbindest du ein Kabel von der anderen Seite des Widerstands zu den E/A-Pins. Von Rot zu Pin 3, von Grün zu Pin 2, von Gelb zu Pin 4 und von Blau zu Pin 5.



 

Schritt 3: Der Programmcode



Const Int Max_lvl = 10;

int order [MAX_LVL];

int eigen_volg [MAX_LVL];

int lvl = 1;

int Geschwindigkeit = 1000;

 

void setup () {

  pinMode (A0, INPUT);

  pinMode (A1, INPUT);

  pinMode (A2, INPUT);

  pinMode (A3, INPUT);

  PinMode (2, OUTPUT);

  PinMode (3, OUTPUT);

  PinMode (4, OUTPUT);

  PinMode (5, OUTPUT);

  digitalWrite (2, LOW);

  digitalWrite (3, LOW);

  digitalWrite (4, LOW);

  digitalWrite (5, LOW);

}

 

void loop () {

  if (LVL == 1)

  generate_follow ();

  if (digitalRead (A0) == HIGH && digitalRead (A3) == HIGH || LVL! = 1) {

    show_volg ();

    get_volg ();

  }

}

 

void show_volg () {

  digitalWrite (2, LOW);

  digitalWrite (3, LOW);

  digitalWrite (4, LOW);

  digitalWrite (5, LOW);

  für (int i = 0; i

    digitalWrite (order [i], HIGH);

    Verzögerung (Geschwindigkeit);

    digitalWrite (order [i], LOW);

    Verzögerung (200);

  }

}

 

void get_volg () {

  int flag = 0;

  für (int i = 0; i

    flag = 0;

    while (flag == 0) {

      if (digitalRead (A0) == LOW) {

        digitalWrite (5, HIGH);

        eigen_volg [i] = 5;

        flag = 1;

        Verzögerung (200);

        if (eigen_volg [i]! = order [i]) {

          false_follow ();

          zurück;

        }

        digitalWrite (5, LOW);

      }

      if (digitalRead (A1) == LOW) {

        digitalWrite (4, HIGH);

        eigen_volg [i] = 4;

        flag = 1;

        Verzögerung (200);

        if (eigen_volg [i]! = order [i]) {

          false_follow ();

          zurück;

        }

        digitalWrite (4, LOW);

      }

      if (digitalRead (A2) == LOW) {

        digitalWrite (3, HIGH);

        eigen_volg [i] = 3;

        flag = 1;

        Verzögerung (200);

        if (eigen_volg [i]! = order [i]) {

          false_follow ();

          zurück;

        }

        digitalWrite (3, LOW);

      }

      if (digitalRead (A3) == LOW) {

        digitalWrite (2, HIGH);

        eigen_volg [i] = 2;

        flag = 1;

        Verzögerung (200);

        if (eigen_volg [i]! = order [i]) {

          false_follow ();

          zurück;

        }

        digitalWrite (2, LOW);

      }

    }

  }

  good_follow ();

}

 

void generate_follow () {

  randomSeed (millis ());

  für (int i = 0; i

    Ordnung [i] = zufällig (2, 6);

  }

}

 

void false_follow () {

  für (int i = 0; i <3; i ++) {

    digitalWrite (2, HIGH);

    digitalWrite (3, HIGH);

    digitalWrite (4, HIGH);

    digitalWrite (5, HIGH);

    Verzögerung (250);

    digitalWrite (2, LOW);

    digitalWrite (3, LOW);

    digitalWrite (4, LOW);

    digitalWrite (5, LOW);

    Verzögerung (250);

  }

  Stufe = 1;

  Geschwindigkeit = 1000;

}

 

void good_follow () {

  digitalWrite (2, LOW);

  digitalWrite (3, LOW);

  digitalWrite (4, LOW);

  digitalWrite (5, LOW);

  Verzögerung (250);

  digitalWrite (2, HIGH);

  digitalWrite (3, HIGH);

  digitalWrite (4, HIGH);

  digitalWrite (5, HIGH);

  Verzögerung (500);

  digitalWrite (2, LOW);

  digitalWrite (3, LOW);

  digitalWrite (4, LOW);

  digitalWrite (5, LOW);

  Verzögerung (250);

  if (LVL

  LVL ++;

  Geschwindigkeit - = 100;

}



Schritt 4: Erweiterung 

Aufgabe: Fügen Sie dem Schaltkreis einen Summer hinzu und passen Sie die Codes entsprechend an. Lassen Sie beim Auftreten eines Fehlers oder bei erfolgreicher Aufgabenerfüllung die entsprechende Musik abspielen. Die Codes für die Musik sind unten aufgeführt.



/*Simon sagt das Spiel. Jetzt mit Soundeffekten.

Original erstellt von Robert Spann
Code gekürzt und Soundeffekte von digimike hinzugefügt

Die Taster sind auf die dafür vorgesehenen Pins ohne Pull-Down-Widerstände
zu setzen und mit Masse statt +5 zu verbinden.
*/
#include

Ton-Lautsprecherpin;
int starttune[] = {NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4, NOTE_G4};
int duration2[] = {100, 200, 100, 200, 100, 100, 100, 100, 100, 100, 200, 100, 500};
int note[] = {NOTE_C4, NOTE_C4, NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5};
int duration[] = {100, 100, 100, 300, 100, 300};
boolean button[] = {2, 3, 4, 5}; Die vier Tasteneingabepins
boolean ledpin[] = {8, 9, 10, 11}; LED-Pins
int turn = 0; turn counter
int buttonstate = 0; Schaltflächenstatus-Checker
int randomArray[100]; Absichtlich lang, um bis zu 100 Eingaben zu speichern (es ist zu bezweifeln, dass jemand so weit kommen wird)
int inputArray[100];


void setup()
{
Serial.begin(9600);
speakerpin.begin(12); // Lautsprecher ist an Pin 13

for(int x=0; x<4; x++) // LED-Pins
sind Ausgänge {
pinMode(ledpin[x], OUTPUT);
}

for(int x=0; x<4; x++)
{
pinMode(button[x], INPUT); // Button-Pins sind Eingänge
digitalWrite(button[x], HIGH); // Internes Pullup aktivieren; Buttons starten in High-Position; Logik umgekehrt
}

randomSeed(analogRead(0)); Hinzugefügt, um "mehr Zufälligkeit" mit dem randomArray für die Ausgabefunktion
für (int thisNote = 0; thisNote < 13; thisNote ++) {
// die nächste Note abspielen:
speakerpin.play(starttune[thisNote]);
// halte die Note:
if (thisNote==0 || thisNote==2 || thisNote==4 || thisNote== 6)
{
digitalWrite(ledpin[0], HIGH);
}
if (thisNote==1 || thisNote==3 || thisNote==5 || thisNote== 7 || thisNote==9 || thisNote==11)
{
digitalWrite(ledpin[1], HIGH);
}
if (thisNote==8 || thisNote==12)
{
digitalWrite(ledpin[2], HIGH);
}
if (thisNote==10)
{
digitalWrite(ledpin[3], HIGH);
}
delay(duration2[thisNote]);
// Stopp für die nächste Note:
speakerpin.stop();
digitalWrite(ledpin[0], NIEDRIG);
digitalWrite(ledpin[1], NIEDRIG);
digitalWrite(ledpin[2], NIEDRIG);
digitalWrite(ledpin[3], NIEDRIG);
Verzögerung(25);
}
delay(1000);
}

void loop()
{
for (int y=0; y<=99; y++)
{
//Funktion zum Generieren des Arrays, das vom Player
abgeglichen werden soll digitalWrite(ledpin[0], HIGH);
digitalWrite(ledpin[1], HOCH);
digitalWrite(ledpin[2], HOCH);
digitalWrite(ledpin[3], HOCH);

for (int thisNote = 0; thisNote < 6; thisNote ++) {
// spiele die nächste Note:
speakerpin.play(note[thisNote]);
// halte die Note:
delay(duration[thisNote]);
// Stopp für die nächste Note:
speakerpin.stop();
delay(25);
}

digitalWrite(ledpin[0], NIEDRIG);
digitalWrite(ledpin[1], NIEDRIG);
digitalWrite(ledpin[2], NIEDRIG);
digitalWrite(ledpin[3], NIEDRIG);
delay(1000);

for (int y=turn; y <= turn; y++)
{ //Begrenzt durch die turn-Variable
Serial.println(""); Einige serielle Ausgaben, denen Sie folgen
können Serial.print("Turn: ");
Serial.print(y);
Serial.println("");
randomArray[y] = random(1, 5); Zuweisen einer Zufallszahl (1-4) zu randomArray[y], wobei y die Zugzählung
für (int x=0; x <= turn; x++)
{
Serial.print(randomArray[x]);

for(int y=0; y<4; y++)
{

if (randomArray[x] == 1 && ledpin[y] == 8)
{ //if-Anweisungen zur Anzeige der gespeicherten Werte im Array
digitalWrite(ledpin[y], HIGH);
speakerpin.play(NOTE_G3, 100);
delay(400);
digitalWrite(ledpin[y], LOW);
delay(100);
}

if (randomArray[x] == 2 && ledpin[y] == 9)
{
digitalWrite(ledpin[y], HIGH);
speakerpin.play(NOTE_A3, 100);
delay(400);
digitalWrite(ledpin[y], LOW);
delay(100);
}

if (randomArray[x] == 3 && ledpin[y] == 10)
{
digitalWrite(ledpin[y], HIGH);
speakerpin.play(NOTE_B3, 100);
delay(400);
digitalWrite(ledpin[y], LOW);
delay(100);
}

if (randomArray[x] == 4 && ledpin[y] == 11)
{
digitalWrite(ledpin[y], HIGH);
speakerpin.play(NOTE_C4, 100);
delay(400);
digitalWrite(ledpin[y], LOW);
delay(100);
}
}
}
}
input();
}
}

void input() { //Funktion zum Zulassen von Benutzereingaben und zum Prüfen von Eingaben gegen das generierte Array

for (int x=0; x <= turn;)
{ //Anweisung wird durch die Anzahl der Durchläufe gesteuert

for(int y=0; y<4; y++)
{

buttonstate = digitalRead(button[y]);

if (buttonstate == LOW && button[y] == 2)
{ //Überprüfung auf Tastendruck
digitalWrite(ledpin[0], HIGH);
speakerpin.play(NOTE_G3, 100);
delay(200);
digitalWrite(ledpin[0], LOW);
inputArray[x] = 1;
delay(250);
Serial.print(" ");
Serial.print(1);
if (inputArray[x] != randomArray[x]) { //Prüft den vom Benutzer eingegebenen Wert und prüft ihn gegen
fail(); //den Wert an der gleichen Stelle im generierten Array
} //Die fail-Funktion wird aufgerufen, wenn sie nicht mit x++ übereinstimmt
;
}
if (buttonstate == LOW && button[y] == 3)
{
digitalWrite(ledpin[1], HIGH);
speakerpin.play(NOTE_A3, 100);
delay(200);
digitalWrite(ledpin[1], LOW);
inputArray[x] = 2;
delay(250);
Serial.print(" ");
Serial.print(2);
if (inputArray[x] != randomArray[x]) {
fail();
}
x++;
}

if (buttonstate == LOW && button[y] == 4)
{
digitalWrite(ledpin[2], HIGH);
speakerpin.play(NOTE_B3, 100);
delay(200);
digitalWrite(ledpin[2], LOW);
inputArray[x] = 3;
delay(250);
Serial.print(" ");
Serial.print(3);
if (inputArray[x] != randomArray[x]) {
fail();
}
x++;
}

if (buttonstate == LOW && button[y] == 5)
{
digitalWrite(ledpin[3], HIGH);
speakerpin.play(NOTE_C4, 100);
delay(200);
digitalWrite(ledpin[3], LOW);
inputArray[x] = 4;
delay(250);
Serial.print(" ");
Serial.print(4);
if (inputArray[x] != randomArray[x])
{
fail();
}
x++;
}
}
}
delay(500);
Drehen++; Erhöht den Turn-Count, auch die letzte Aktion, bevor die Ausgabefunktion erneut
gestartet wird }

void fail() { //Funktion, die verwendet wird, wenn der Player die Sequenz nicht findet

for (int y=0; y<=2; y++)
{ //Blinkt bei Fehler

digitalWrite(ledpin[0], HOCH);
digitalWrite(ledpin[1], HOCH);
digitalWrite(ledpin[2], HOCH);
digitalWrite(ledpin[3], HOCH);
speakerpin.play(NOTE_G3, 300);
Verzögerung(200);
digitalWrite(ledpin[0], NIEDRIG);
digitalWrite(ledpin[1], NIEDRIG);
digitalWrite(ledpin[2], NIEDRIG);
digitalWrite(ledpin[3], NIEDRIG);
speakerpin.play(NOTE_C3, 300);
Verzögerung(200);
}
delay(500);
Drehung = -1; Setzt den Rundenwert zurück, so dass das Spiel von vorne beginnt, ohne dass eine Reset-Taste
erforderlich ist }