Stap 2: De schets
De sketch werd oorspronkelijk gemaakt door Robert Spann terug in 2009. Ik gebruikte een eerdere versie van zijn schets aangezien ik hield niet van de manier waarop hij geïntegreerd geluid in latere versies van de schets. Als u wilt geven het geluid van het spel besloten heb ik om de Tone.h bibliotheek gebruiken. De bibliotheek is niet bijgewerkt sinds de release van Arduino 1.0, dus ging ik vooruit en bijgewerkt zodat ze compatibel zijn met Arduino 1.0. Daarbij ik knip een achterwaartse compatibiliteit met oudere IDEs. Dus als uw met een oudere versie van de IDE dan de link in de volgende stap gebruikt om te downloaden van de oorspronkelijke bibliotheek. Ik heb een kopie van de bijgewerkte bibliotheek op deze pagina toegevoegd. Wees dus zeker om het en plaats die het in uw omslag van Arduino/bibliotheken of de schets wordt niet gecompileerd onder de Arduino 1.0 te downloaden.Hier is de schets. Een bestand van de schets is ook bevestigd. Als er dat vragen over het laat het me weten.
/ * Spel van Simon Says. Nu met geluidseffecten.Oorspronkelijk gemaakt door Robert Spann
Code getrimd en geluidseffecten toegevoegd door digimike
Knoppen zijn moet worden ingesteld op er aangewezen pennen zonder pull-down weerstanden
en verbonden aan de grond eerder dan + 5.
*/
#include < Tone.h >
Toon 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 veld Duur2 [] = {100, 200, 100, 200, 100, 400, 100, 100, 100, 100, 200, 100, 500};
int Opmerking [] = {NOTE_C4, NOTE_C4, NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5};
int [van duur] = {100 100 100, 300, 100, 300};
Booleaanse knop [] = {2, 3, 4, 5}; De vier knop input pinnen
Booleaanse ledpin [] {8, 9, 10, 11} =; LED pinnen
int draaien = 0; Draai tegen
int buttonstate = 0; knop staat checker
int randomArray [100]; Opzettelijk lang voor het opslaan van maximaal 100 ingangen (twijfelachtig iedereen krijgt dit ver)
int inputArray [100];
VOID Setup
{
Serial.begin(9600);
speakerpin.begin(12); spreker is op pin 13
voor (int x = 0; x < 4; x ++) / / LED pinnen zijn uitgangen
{
pinMode (ledpin [x], OUTPUT);
}
voor (int x = 0; x < 4; x ++)
{
pinMode (knop [x], INPUT); knop pinnen zijn ingangen
digitalWrite (knop [x] hoge); inschakelen van interne pullup; toetsen beginnen in hoge positie; logica omgedraaid
}
randomSeed(analogRead(0)); Met de randomArray voor de uitgangsfunctie voor het genereren van "meer willekeur" toegevoegd
voor (int thisNote = 0; thisNote < 13; thisNote ++) {}
Speel de volgende opmerking:
speakerpin.Play(starttune[thisNote]);
Houd de opmerking:
Als (thisNote == 0 || thisNote == 2 || thisNote == 4 || thisNote == 6)
{
digitalWrite (ledpin [0], hoge);
}
Als (thisNote == 1 || thisNote == 3 || thisNote == 5 || thisNote == 7 || thisNote == 9 || thisNote == 11)
{
digitalWrite (ledpin [1], hoge);
}
Als (thisNote == 8 || thisNote == 12)
{
digitalWrite (ledpin [2], hoge);
}
Als (thisNote == 10)
{
digitalWrite (ledpin [3], hoge);
}
delay(Duration2[thisNote]);
Stop voor de volgende notitie:
speakerpin.stop();
digitalWrite (ledpin [0], laag);
digitalWrite (ledpin [1], laag);
digitalWrite (ledpin [2], laag);
digitalWrite (ledpin [3], laag);
delay(25);
}
delay(1000);
}
void loop
{
voor (int y = 0; y < = 99; y ++)
{
functie voor het genereren van de array worden geëvenaard door de speler
digitalWrite (ledpin [0], hoge);
digitalWrite (ledpin [1], hoge);
digitalWrite (ledpin [2], hoge);
digitalWrite (ledpin [3], hoge);
voor (int thisNote = 0; thisNote < 6; thisNote ++) {}
Speel de volgende opmerking:
speakerpin.Play(Note[thisNote]);
Houd de opmerking:
delay(duration[thisNote]);
Stop voor de volgende notitie:
speakerpin.stop();
delay(25);
}
digitalWrite (ledpin [0], laag);
digitalWrite (ledpin [1], laag);
digitalWrite (ledpin [2], laag);
digitalWrite (ledpin [3], laag);
delay(1000);
voor (int y = beurt; y < = beurt; y ++)
{//Limited door de draai-variabele
Serial.println(""); Sommige uitgang voor seriële volgen
Serial.Print ("draaien:");
Serial.Print(y);
Serial.println("");
randomArray [y] = willekeurige (1, 5); Een willekeurig getal (1-4) toe te wijzen aan de randomArray [y], tellen y wordt de beurt
voor (int x = 0; x < = beurt; x ++)
{
Serial.Print(randomArray[x]);
voor (int y = 0; y < 4; y ++)
{
Als (randomArray [x] == 1 & & ledpin [y] == 8)
{//if verklaringen om weer te geven van de opgeslagen waarden in de matrix
digitalWrite (ledpin [y], hoge);
speakerpin.Play (NOTE_G3, 100);
delay(400);
digitalWrite (ledpin [y], laag);
delay(100);
}
Als (randomArray [x] == 2 & & ledpin [y] == 9)
{
digitalWrite (ledpin [y], hoge);
speakerpin.Play (NOTE_A3, 100);
delay(400);
digitalWrite (ledpin [y], laag);
delay(100);
}
Als (randomArray [x] == 3 & & ledpin [y] == 10)
{
digitalWrite (ledpin [y], hoge);
speakerpin.Play (NOTE_B3, 100);
delay(400);
digitalWrite (ledpin [y], laag);
delay(100);
}
Als (randomArray [x] == 4 & & ledpin [y] == 11)
{
digitalWrite (ledpin [y], hoge);
speakerpin.Play (NOTE_C4, 100);
delay(400);
digitalWrite (ledpin [y], laag);
delay(100);
}
}
}
}
input();
}
}
VOID input() {//Function voor het toestaan van gebruikersinvoer en controleren van de invoer tegen de gegenereerde matrix
voor (int x = 0; x < = beurt;)
{//Statement gecontroleerd door zet de graaf
voor (int y = 0; y < 4; y ++)
{
buttonstate = digitalRead(button[y]);
Als (buttonstate == LOW & & knop [y] == 2)
{//Checking voor knop duwen
digitalWrite (ledpin [0], hoge);
speakerpin.Play (NOTE_G3, 100);
delay(200);
digitalWrite (ledpin [0], laag);
inputArray [x] = 1;
delay(250);
Serial.Print("");
Serial.Print(1);
Als (inputArray [x]! = randomArray[x]) {//Checks waarde input door gebruiker en controleert het tegen
Fail(); de waarde op dezelfde plek op de gegenereerde array
} //The fail functie wordt aangeroepen als het niet overeenkomt met
x ++;
}
Als (buttonstate == LOW & & knop [y] == 3)
{
digitalWrite (ledpin [1], hoge);
speakerpin.Play (NOTE_A3, 100);
delay(200);
digitalWrite (ledpin [1], laag);
inputArray [x] = 2;
delay(250);
Serial.Print("");
Serial.Print(2);
Als (inputArray [x]! = randomArray[x]) {}
Fail();
}
x ++;
}
Als (buttonstate == LOW & & knop [y] == 4)
{
digitalWrite (ledpin [2], hoge);
speakerpin.Play (NOTE_B3, 100);
delay(200);
digitalWrite (ledpin [2], laag);
inputArray [x] = 3;
delay(250);
Serial.Print("");
Serial.Print(3);
Als (inputArray [x]! = randomArray[x]) {}
Fail();
}
x ++;
}
Als (buttonstate == LOW & & knop [y] == 5)
{
digitalWrite (ledpin [3], hoge);
speakerpin.Play (NOTE_C4, 100);
delay(200);
digitalWrite (ledpin [3], laag);
inputArray [x] = 4;
delay(250);
Serial.Print("");
Serial.Print(4);
Als (inputArray [x]! = randomArray[x])
{
Fail();
}
x ++;
}
}
}
delay(500);
beurt ++; Verhoogt de beurt tellen, ook de laatste handeling voordat de uitgangsfunctie opnieuw
}
VOID fail() {//Function gebruikt als de speler niet overeenkomt met de reeks opdrachten
voor (int y = 0; y < = 2; y ++)
{//Flashes licht voor mislukking
digitalWrite (ledpin [0], hoge);
digitalWrite (ledpin [1], hoge);
digitalWrite (ledpin [2], hoge);
digitalWrite (ledpin [3], hoge);
speakerpin.Play (NOTE_G3, 300);
delay(200);
digitalWrite (ledpin [0], laag);
digitalWrite (ledpin [1], laag);
digitalWrite (ledpin [2], laag);
digitalWrite (ledpin [3], laag);
speakerpin.Play (NOTE_C3, 300);
delay(200);
}
delay(500);
Draai = -1; Hiermee herstelt u terecht waarde het spel opnieuw gestart zonder noodzaak van een reset-knop
}