Sketch von Simon Says
Der Sketch kann heruntergeladen oder hier apkopiert und in eine leere IDE eingefügt werden.
simonsays_spiel.ino |
//Titel
/*
* Simon Says
* Konzentrationsspiel für eine Person
*
* Zusammengehörigkeit von LED und Taster:
* LED Pin 8 mit Taster Pin 2
* LED Pin 9 mit Taster Pin 3
* LED Pin 10 mit Taster Pin 4
* LED Pin 11 mit Taster Pin 5
*
*
* Originaly made by Robert Spann
* Code trimmed and sound effects added by digimike
* http://www.instructables.com/id/Arduino-Simon-Says/?&sort=ACTIVE&limit=40&offset=40#DISCUSS
*/
//Biblothek einbinden
/*
* Die Töne werden über die Tone-Library defniert
* Download der Tone-Library:
* https://github.com/bhagman/Tone
*/
#include <Tone.h>
//Definitionsbereich
/*
* LED, Taster und Töne in einem "Array" definieren
* Alle Töne und Zeiten können abgeändert werden
* starttune = Startmelodie
* duration2 = Tonlänge
* note = Tonabfolge überall wo "note" definiert wird
*/
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, 400, 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};
int taster[] = {5, 4, 3, 2};
int LED[] = {8, 9, 10, 11};
int turn = 0; // Zähler einschalten
int tasterstatus = 0; // Tasterstatus abfragen
int randomArray[100]; //Bis 100 Spielabfolgen möglich
int inputArray[100];
Tone speaker;
void setup() {
Serial.begin(9600);
speaker.begin(12); //Speaker auf Pin 12 festlegen
for(int x=0; x<4; x++) { //LEDs als Output definieren
pinMode(LED[x], OUTPUT);
}
for(int x=0; x<4; x++) {
pinMode(taster[x], INPUT); //Taster als Inputs definieren
digitalWrite(taster[x], HIGH); //Taster startet in "hoher" Position
}
randomSeed(analogRead(0)); //Zufälligkeit erhöhen
for (int thisNote = 0; thisNote < 13; thisNote ++) {
speaker.play(starttune[thisNote]);
if (thisNote==0 || thisNote==2 || thisNote==4 || thisNote== 6) {
digitalWrite(LED[0], HIGH);
}
if (thisNote==1 || thisNote==3 || thisNote==5 || thisNote== 7 || thisNote==9 || thisNote==11) {
digitalWrite(LED[1], HIGH);
}
if (thisNote==8 || thisNote==12) {
digitalWrite(LED[2], HIGH);
}
if (thisNote==10) {
digitalWrite(LED[3], HIGH);
}
delay(duration2[thisNote]);
//Pause vor nächster Runde
speaker.stop();
digitalWrite(LED[0], LOW);
digitalWrite(LED[1], LOW);
digitalWrite(LED[2], LOW);
digitalWrite(LED[3], LOW);
delay(25);
}
delay(1000);
}
void loop() {
for (int y=0; y<=99; y++) {
digitalWrite(LED[0], HIGH);
digitalWrite(LED[1], HIGH);
digitalWrite(LED[2], HIGH);
digitalWrite(LED[3], HIGH);
for (int thisNote = 0; thisNote < 6; thisNote ++) {
speaker.play(note[thisNote]);
delay(duration[thisNote]);
speaker.stop();
delay(25);
}
digitalWrite(LED[0], LOW);
digitalWrite(LED[1], LOW);
digitalWrite(LED[2], LOW);
digitalWrite(LED[3], LOW);
delay(1000);
for (int y=turn; y <= turn; y++) {
Serial.println("");
Serial.print("Turn: ");
Serial.print(y);
Serial.println("");
randomArray[y] = random(1, 5);
for (int x=0; x <= turn; x++) {
Serial.print(randomArray[x]);
for(int y=0; y<4; y++) {
if (randomArray[x] == 1 && LED[y] == 8) {
digitalWrite(LED[y], HIGH);
speaker.play(NOTE_G3, 100);
delay(400);
digitalWrite(LED[y], LOW);
delay(100);
}
if (randomArray[x] == 2 && LED[y] == 9) {
digitalWrite(LED[y], HIGH);
speaker.play(NOTE_A3, 100);
delay(400);
digitalWrite(LED[y], LOW);
delay(100);
}
if (randomArray[x] == 3 && LED[y] == 10) {
digitalWrite(LED[y], HIGH);
speaker.play(NOTE_B3, 100);
delay(400);
digitalWrite(LED[y], LOW);
delay(100);
}
if (randomArray[x] == 4 && LED[y] == 11) {
digitalWrite(LED[y], HIGH);
speaker.play(NOTE_C4, 100);
delay(400);
digitalWrite(LED[y], LOW);
delay(100);
}
}
}
}
input();
}
}
void input() {
for (int x=0; x <= turn;) {
for(int y=0; y<4; y++) {
tasterstatus = digitalRead(taster[y]);
if (tasterstatus == LOW && taster[y] == 2) {
digitalWrite(LED[0], HIGH);
speaker.play(NOTE_G3, 100);
delay(200);
digitalWrite(LED[0], LOW);
inputArray[x] = 1;
delay(250);
Serial.print(" ");
Serial.print(1);
//Kontrollieren ob richtig gedrückt, ansonsten "fail"
if (inputArray[x] != randomArray[x]) {
fail();
}
x++;
}
if (tasterstatus == LOW && taster[y] == 3) {
digitalWrite(LED[1], HIGH);
speaker.play(NOTE_A3, 100);
delay(200);
digitalWrite(LED[1], LOW);
inputArray[x] = 2;
delay(250);
Serial.print(" ");
Serial.print(2);
if (inputArray[x] != randomArray[x]) {
fail();
}
x++;
}
if (tasterstatus == LOW && taster[y] == 4) {
digitalWrite(LED[2], HIGH);
speaker.play(NOTE_B3, 100);
delay(200);
digitalWrite(LED[2], LOW);
inputArray[x] = 3;
delay(250);
Serial.print(" ");
Serial.print(3);
if (inputArray[x] != randomArray[x]) {
fail();
}
x++;
}
if (tasterstatus == LOW && taster[y] == 5) {
digitalWrite(LED[3], HIGH);
speaker.play(NOTE_C4, 100);
delay(200);
digitalWrite(LED[3], LOW);
inputArray[x] = 4;
delay(250);
Serial.print(" ");
Serial.print(4);
if (inputArray[x] != randomArray[x]) {
fail();
}
x++;
}
}
}
delay(500);
turn++; //Wechsel in nächstes Level
}
//Was passiert bei einem Fehler? Alle LED leuchten
void fail() {
for (int y=0; y<=2; y++)
{
digitalWrite(LED[0], HIGH);
digitalWrite(LED[1], HIGH);
digitalWrite(LED[2], HIGH);
digitalWrite(LED[3], HIGH);
speaker.play(NOTE_G3, 300);
delay(200);
digitalWrite(LED[0], LOW);
digitalWrite(LED[1], LOW);
digitalWrite(LED[2], LOW);
digitalWrite(LED[3], LOW);
speaker.play(NOTE_C3, 300);
delay(200);
}
delay(500);
turn = -1; //Resets turn value so the game starts over without need for a reset button
}