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 }