Arduino Simon Says (2 / 4 steg)
Steg 2: Skiss
Skissen gjordes ursprungligen av Robert Spann tillbaka i 2009. Jag använde en tidigare version av hans skiss eftersom jag inte gillar hur han integrerat ljud i senare versioner av skiss. För att ge spelljud bestämde jag mig att använda Tone.h biblioteket. Biblioteket har inte uppdaterats sedan utgivningen av Arduino 1.0, så jag gick vidare och uppdaterat den till att vara kompatibel med Arduino 1.0. Genom att göra så jag skar ut någon bakåt kompatibilitet med äldre IDEs. Så om du kör en äldre version av IDE sedan använde länk i nästa steg för att hämta det ursprungliga biblioteket. Jag har bifogat en kopia av uppdaterat bibliotek på den här sidan. Så vara säker att ladda ner den och placera den i mappen Arduino/bibliotek eller skiss inte kommer kompilera under Arduino 1.0.Här är skissen. En fil av skiss bifogas också. Om det finns några frågor om det. Låt mig veta.
Ursprungligen av Robert Spann
Koden trimmas och ljudeffekter till av digimike
Knapparna är ställas in på det angivna stift utan dra ner motstånd
och anslutna till marken snarare än + 5.
*/
#include < Tone.h >
Tone speakerpin;
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 Företagsvaraktighet 2 [] = {100, 200, 100, 200, 100, 400, 100, 100, 100, 100, 200, 100, 500};
int Observera [] = {NOTE_C4, NOTE_C4, NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5};
int längd [] = {100, 100, 100, 300, 100, 300};
booleska knappen [] = {2, 3, 4, 5}; Fyra knappen input stiften
booleska ledpin [] = {8, 9, 10, 11}; LED stift
int vända = 0; vända mot
int buttonstate = 0; knappen stat checker
int randomArray [100]. Avsiktligt länge att lagra upp till 100 ingångar (tveksamt någon vilja få detta långt)
int inputArray [100].
void setup()
{
Serial.BEGIN(9600);
speakerpin.BEGIN(12); högtalaren är på stift 13
för (int x = 0; x < 4; x ++) / / LED stift är utgångar
{
pinMode (ledpin [x], produktionen);
}
för (int x = 0; x < 4; x ++)
{
pinMode (knappen [x], indata); knappen stift är ingångar
digitalWrite (knappen [x], hög); Aktivera inre pullup; knapparna starta i hög position; logiken omvänd
}
randomSeed(analogRead(0)); Läggas till för att generera "mer slumpmässighet" med randomArray för funktionen output
för (int thisNote = 0; thisNote < 13; thisNote ++) {
spela nästa anteckning:
speakerpin.Play(starttune[thisNote]);
Håll anteckningen:
om (thisNote == 0 || thisNote == 2 || thisNote == 4 || thisNote == 6)
{
digitalWrite (ledpin [0], hög);
}
om (thisNote == 1 || thisNote == 3 || thisNote == 5 || thisNote == 7 || thisNote == 9 || thisNote == 11)
{
digitalWrite (ledpin [1], hög);
}
om (thisNote == 8 || thisNote == 12)
{
digitalWrite (ledpin [2], hög);
}
om (thisNote == 10)
{
digitalWrite (ledpin [3], hög);
}
Delay(duration2[thisNote]);
stopp för nästa anteckning:
speakerpin.stop();
digitalWrite (ledpin [0], låg);
digitalWrite (ledpin [1], låg);
digitalWrite (ledpin [2], låg);
digitalWrite (ledpin [3], låg);
Delay(25);
}
Delay(1000);
}
void loop()
{
för (int y = 0; y < = 99; y ++)
{
funktion för att skapa matrisen ska matchas av spelaren
digitalWrite (ledpin [0], hög);
digitalWrite (ledpin [1], hög);
digitalWrite (ledpin [2], hög);
digitalWrite (ledpin [3], hög);
för (int thisNote = 0; thisNote < 6; thisNote ++) {
spela nästa anteckning:
speakerpin.Play(Note[thisNote]);
Håll anteckningen:
Delay(duration[thisNote]);
stopp för nästa anteckning:
speakerpin.stop();
Delay(25);
}
digitalWrite (ledpin [0], låg);
digitalWrite (ledpin [1], låg);
digitalWrite (ledpin [2], låg);
digitalWrite (ledpin [3], låg);
Delay(1000);
för (int y = slå; y < = slå; y ++)
{//Limited av variabeln tur
Serial.println(""); Vissa seriella produktionen att följa
Serial.Print ("vända:");
Serial.Print(y);
Serial.println("");
randomArray [y] = random (1, 5); Ge ett slumpmässigt nummer (1-4) randomArray [y], räkna y som tur
för (int x = 0; x < = slå; x ++)
{
Serial.Print(randomArray[x]);
för (int y = 0; y < 4; y ++)
{
om (randomArray [x] == 1 & & ledpin [y] == 8)
{//if deklarationer Visa lagrade värden i matrisen
digitalWrite (ledpin [y], hög);
speakerpin.Play (NOTE_G3, 100);
Delay(400);
digitalWrite (ledpin [y], låg);
Delay(100);
}
om (randomArray [x] == 2 & & ledpin [y] == 9)
{
digitalWrite (ledpin [y], hög);
speakerpin.Play (NOTE_A3, 100);
Delay(400);
digitalWrite (ledpin [y], låg);
Delay(100);
}
om (randomArray [x] == 3 & & ledpin [y] == 10)
{
digitalWrite (ledpin [y], hög);
speakerpin.Play (NOTE_B3, 100);
Delay(400);
digitalWrite (ledpin [y], låg);
Delay(100);
}
om (randomArray [x] == 4 & & ledpin [y] == 11)
{
digitalWrite (ledpin [y], hög);
speakerpin.Play (NOTE_C4, 100);
Delay(400);
digitalWrite (ledpin [y], låg);
Delay(100);
}
}
}
}
input();
}
}
void input() {//Function för att tillåta användarindata och kontrollera ingång mot genererade matrisen
för (int x = 0; x < = slå;)
{//Statement kontrolleras av vända greve
för (int y = 0; y < 4; y ++)
{
ButtonState = digitalRead(button[y]);
om (buttonstate == låg & & knappen [y] == 2)
{//Checking för knappen push
digitalWrite (ledpin [0], hög);
speakerpin.Play (NOTE_G3, 100);
Delay(200);
digitalWrite (ledpin [0], låg);
inputArray [x] = 1;
Delay(250);
Serial.Print("");
Serial.Print(1);
om (inputArray [x]! = randomArray[x]) {//Checks värde input av användare och kontrollerar att den mot
Fail(); värdet i samma plats på den genererade arrayen
} //The misslyckas funktion kallas om det inte matchar
x ++;
}
om (buttonstate == låg & & knappen [y] == 3)
{
digitalWrite (ledpin [1], hög);
speakerpin.Play (NOTE_A3, 100);
Delay(200);
digitalWrite (ledpin [1], låg);
inputArray [x] = 2;
Delay(250);
Serial.Print("");
Serial.Print(2);
om (inputArray [x]! = randomArray[x]) {
Fail();
}
x ++;
}
om (buttonstate == låg & & knappen [y] == 4)
{
digitalWrite (ledpin [2], hög);
speakerpin.Play (NOTE_B3, 100);
Delay(200);
digitalWrite (ledpin [2], låg);
inputArray [x] = 3;
Delay(250);
Serial.Print("");
Serial.Print(3);
om (inputArray [x]! = randomArray[x]) {
Fail();
}
x ++;
}
om (buttonstate == låg & & knappen [y] == 5)
{
digitalWrite (ledpin [3], hög);
speakerpin.Play (NOTE_C4, 100);
Delay(200);
digitalWrite (ledpin [3], låg);
inputArray [x] = 4;
Delay(250);
Serial.Print("");
Serial.Print(4);
om (inputArray [x]! = randomArray[x])
{
Fail();
}
x ++;
}
}
}
Delay(500);
tur ++; Ökar antalet tur, även den senaste åtgärden innan du startar funktionen output om igen
}
void fail() {//Function används om spelaren inte matchar sekvensen
för (int y = 0; y < = 2; y ++)
{//Flashes ljus för misslyckande
digitalWrite (ledpin [0], hög);
digitalWrite (ledpin [1], hög);
digitalWrite (ledpin [2], hög);
digitalWrite (ledpin [3], hög);
speakerpin.Play (NOTE_G3, 300);
Delay(200);
digitalWrite (ledpin [0], låg);
digitalWrite (ledpin [1], låg);
digitalWrite (ledpin [2], låg);
digitalWrite (ledpin [3], låg);
speakerpin.Play (NOTE_C3, 300);
Delay(200);
}
Delay(500);
sväng = -1; Återställer stänga värde så att spelet startar över utan behov av en återställningsknapp
}