Simon bläckfisk (2 / 4 steg)
Steg 2: kod
För att få summern att arbeta där är två samtal som du behöver: tone() och noTone().
Som en snabb anteckning stör funktionen tone() PWM utgången på stift 3 och 11 utom på Mega.
Funktionsdefinitionen för tonen är:
tonen (pin, frekvens) eller ton (pin, frekvens, varaktighet)
Om varaktigheten anges tonen kommer att fortsätta att spela tills anropas funktionen noTone()
tillämpas på pin. Funktionsdefinitionen av noTone() är helt enkelt noTone(pin).
Du kan bara spela en ton på stiftet på en gång, detta var inte en fråga för oss eftersom
Vi använde endast en ton per sträcka.
Vår ursprungliga idé var att använda varje ben för en annan anteckning i tonarten C och har
en hela octive. Tyvärr har vi inte använder alla 8 ben för detta, men med den
rätt hårdvara du skulle bara behöva göra några mall ändringar i koden nedan
att ha det funktionsduglig.
Det finns en fin header-fil som ingår i paketet arduino som definierar
allt av frekvenserna till motsvarande notera namn. När denna header-fil är
ingår allt du behöver göra är samtal NOTE_C4 ha summern spela mitten C eller
Om du behöver en kraftig du bara infoga 'S "mellan tonens namn och nummer dvs.
NOTE_GS4.
I vår kod nedan kommer du att märka att vi använder en analog PIN-kod för ett av de
Ben knappar. Vi var tvungna att göra detta utifrån lillypad layout samt totalen
antalet stift var vi med. Vi behövde göra några små hack för att få detta att
arbeta som digital stiften kan du bara kontrollera för att se om PIN-koden är hög eller låg medan
analogt utgångar dess spänning.
För varje ben finns en knapp och ett ljus. När knappen trycks den tilldelade
Obs får aktiveras genom sund PIN-koden och spelar igenom summern samt
som LED i benet belysning upp.
När du vinner den första delen av spelar Beatles Octopus's Garden följt av
bokstaven V. Låten gjordes genom att placera noterna i en matris och looping över
matrisen när tiden är rätt.
Spelet är relativt enkel. I början av varje cykel kontrollera vi alla knappar
för att se om någon av dem trycks. Vi gjorde detta med anrop till digitalRead(). Vi sedan slinga""
via knappen och om det finns en knapp som är aktiv vi anger en variabel som
lagrar den senaste pin. Vi kollar bara efter varandra så om du hade pins
1 och 4 tryckte samtidigt den skulle sätta variabeln till pinne 4.
Vi sedan tar denna information och vidarebefordra den till en switch-sats som aktiverar
ljus och ljud är associerade med knappen intryckt. Sättet vi
Ställ in allt upp det inte kommer tända flera ben eller spela flera ljud. Att
skulle vara en trevlig förbättring till detta projekt. Om du har lagt till 3 sumrar kan du
spela grundläggande huvud- och delversioner ackord genom att trycka på olika ben. Detta skulle lägga en
realtid musik att göra aspekt till bläckfisk. Också med 8 ben har du alla
de anteckningar som du skulle behöva spela grundläggande låtar i tonarten C.
För spelet aspekten av koden efter varje iteration genom huvudloop kolla vi
att vi är i simon läge och att knappen staten har förändrats (en knapp hade varit
pressad). Det kontrollerar knappen värdet och jämför den med värdet sparas i en matris
som beskriver spelet sekvensen hittills. Om värdena matchar det lägger tillför ett nytt värde
till slut sekvens och lekar uppdaterat hela sekvensen från början.
Om värdena inte matchar det träder i "Du förlora" slingan som spelar en förlorare
ljus sekvens och återställer spelet.
#include "pitches.h"
int läge = 0; 0-Simon... 1-ljud/ljus
CONST int leg0B = A4;
CONST int leg0L = 13.
CONST int leg1B = 2;
CONST int leg1L = 3;
CONST int leg2B = 12;
CONST int leg2L = 11;
CONST int leg3B = 6;
CONST int leg3L = 7.
CONST int soundPin = 9;
int buttonState0 = 0;
int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int pauseBetweenNotes = 300;
int speltid = 500. När du spelar simon sekvensen
int pinsUsed = 4;
int lastPin = 0;
int currentPin = -1;
int lastLight = 0;
CONST int maxTurns = 50;
int spel [maxTurns];
int vända = 0;
int arrayCounter = 0;
CONST int turnsToWin = 4;
osignerade långa loseTime;
osignerade långa currentTime;
osignerade långa delayAllowed = 10000; Tryck på en knapp inom 4 sekunder eller du förlorar
anteckningar i melodin:
Skarpa F G C D
int melodi [] = {
NOTE_B4, NOTE_B4, NOTE_CS4, NOTE_B4, NOTE_B0,
NOTE_GS4, NOTE_GS4, NOTE_A4, NOTE_GS4,
NOTE_GS4, NOTE_FS4, NOTE_E4, NOTE_E4, NOTE_E4,
NOTE_CS4, NOTE_B4, NOTE_GS4, NOTE_E4, NOTE_GS4,
NOTE_FS4
};
Observera varaktigheter: 4 = fjärdedelsnot, 8 = åttondelen noterar, etc.:
int noteDurations [] = {
4, 4, 4, 1, 4,
4, 4, 4, 1,
8, 8, 4, 4, 4,
4, 4, 2, 8, 8, 1};
void setup() {
/*
för (int thisNote = 0; thisNote < 20; thisNote ++) {
för att beräkna noterar varaktighet, ta en sekund
dividerat med Noteringstyp.
e.g. fjärdedelsnot = 1000 / 4, åttondelen noterar = 1000/8, etc.
int noteDuration = 1000/noteDurations [thisNote];
tonen (soundPin, melody[thisNote],noteDuration);
Ange en minsta tid mellan dem för att skilja anteckningar.
tonens längd + 30% verkar fungera bra:
int pauseBetweenNotes = noteDuration * 1,30;
Delay(pauseBetweenNotes);
stoppa tonen uppspelningen:
noTone(soundPin);
}
*/
Serial.BEGIN(9600);
Millis(); initiera legxB stiften som bidrag:
pinMode (leg0B, ingång);
pinMode (leg1B, ingång);
pinMode (leg2B, ingång);
pinMode (leg3B, ingång);
pinMode (leg4B, ingång);
pinMode (leg5B, ingång);
pinMode (leg6B, ingång);
pinMode (leg7B, ingång);
initiera lysdioderna som en utgång:
pinMode (leg0L, produktionen);
pinMode (leg1L, produktionen);
pinMode (leg2L, produktionen);
pinMode (leg3L, produktionen);
pinMode (leg4L, produktionen);
pinMode (leg5L, produktionen);
pinMode (leg6L, produktionen);
pinMode (leg7L, produktionen);
initiera ljud PIN-koden som utdata:
pinMode (soundPin, produktionen);
Ange en minsta tid mellan dem för att skilja anteckningar.
tonens längd + 30% verkar fungera bra:
int pauseBetweenNotes = noteDuration * 1,30;
spel [0] = -1;
}
void loop() {
upptäcka knappen intryckt
buttonState0 = analogRead(leg0B);
Serial.println(buttonState0);
buttonState1 = digitalRead(leg1B);
buttonState2 = digitalRead(leg2B);
buttonState3 = digitalRead(leg3B);
/*
buttonState4 = digitalRead(leg4B);
buttonState5 = digitalRead(leg5B);
buttonState6 = digitalRead(leg6B);
buttonState7 = digitalRead(leg7B);
*/
Ange var baserat på knappen intryckt
currentPin = -1; -1 om inga knappar
IF(buttonState0 == High)
IF(buttonState0 > 200)
currentPin = 0;
IF(buttonState1 == High)
currentPin = 1;
IF(buttonState2 == High)
currentPin = 2;
IF(buttonState3 == High)
currentPin = 3;
Serial.println(currentPin);
/*
IF(buttonState4 == High)
currentPin = 4;
IF(buttonState5 == High)
currentPin = 5;
IF(buttonState6 == High)
currentPin = 6;
IF(buttonState7 == High)
currentPin = 7.
*/
currentTime = millis();
loseTime = millis() + delayAllowed;
om (läge == 0 & & currentTime > loseTime)
{
gameLost(0);
}
om (läge == 0 & & spel [0] == -1)
{
Serial.println ("GAME START");
vända = 0;
addRound();
}
om (currentPin! = lastPin)
{
digitalWrite (lastLight, låg);
om (läge == 0 & & currentPin! = -1) //simon läge
{
om (spelet [arrayCounter]! = currentPin)
{
gameLost(1);
currentPin = -1;
}
annat
{
arrayCounter ++;
currentTime = millis();
loseTime = millis() + delayAllowed;
}
}
växel (currentPin) {
fall -1:
noTone(soundPin);
Serial.println ("fall -1");
bryta;
fall 0:
Serial.println ("fallet 0");
spela upp ljud i benet 0 samt ljus upp benet
digitalWrite (leg0L, hög);
lastLight = leg0L;
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
bryta;
fall 1:
Serial.println ("mål 1");
spela upp ljud i benet 1 samt ljus upp benet
digitalWrite (leg1L, hög);
lastLight = leg1L;
tonen (soundPin, NOTE_D4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg1L, låg);
bryta;
fall 2:
Serial.println ("mål 2");
spela upp ljud i benet 2 samt ljus upp benet
digitalWrite (leg2L, hög);
lastLight = leg2L;
tonen (soundPin, NOTE_E4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg2L, låg);
bryta;
fall 3:
Serial.println ("fall 3");
spela upp ljud i leg 3 samt ljus upp benet
digitalWrite (leg3L, hög);
lastLight = leg3L;
tonen (soundPin, NOTE_F4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg3L, låg);
bryta;
/*
fall 4:
spela upp ljud i ben 4 samt ljus upp benet
digitalWrite (leg4L, hög);
lastLight = leg4L;
tonen (soundPin, NOTE_G4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg4L, låg);
bryta;
fall 5:
spela upp ljud i benet 5 samt ljus upp benet
digitalWrite (leg5L, hög);
lastLight = leg5L;
tonen (soundPin, NOTE_A4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg5L, låg);
bryta;
fall 6:
spela upp ljud i benet 6 samt ljus upp benet
digitalWrite (leg6L, hög);
lastLight = leg6L;
tonen (soundPin, NOTE_B4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg6L, låg);
bryta;
fall 7:
spela upp ljud i benet 7 samt ljus upp benet
digitalWrite (leg7L, hög);
lastLight = leg7L;
tonen (soundPin, NOTE_C5);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg7L, låg);
bryta;
*/
standard:
om inget annat matchar, göra standard
standard är valfritt
}
lastPin = currentPin;
om (arrayCounter > = sväng)
{
Delay(500);
digitalWrite (lastLight, låg);
noTone(soundPin);
Delay(1000);
addRound();
}
}
Delay(100);
}
void playSequence()
{
Serial.println("playSequence");
int seqCounter = 0;
int värde = spel [seqCounter];
int noteLength = 1000-(100*turn);
IF(noteLength < 500)
{
noteLength = 500.
}
medan (värde! = -1)
{
Växla (värde) {
fall 0:
spela upp ljud i benet 0 samt ljus upp benet
digitalWrite (leg0L, hög);
tonen (soundPin, NOTE_C4);
Delay(noteLength);
noTone(soundPin);
digitalWrite (leg0L, låg);
bryta;
fall 1:
spela upp ljud i benet 1 samt ljus upp benet
digitalWrite (leg1L, hög);
tonen (soundPin, NOTE_D4);
Delay(noteLength);
noTone(soundPin);
digitalWrite (leg1L, låg);
bryta;
fall 2:
spela upp ljud i benet 2 samt ljus upp benet
digitalWrite (leg2L, hög);
tonen (soundPin, NOTE_E4);
Delay(noteLength);
noTone(soundPin);
digitalWrite (leg2L, låg);
bryta;
fall 3:
spela upp ljud i leg 3 samt ljus upp benet
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_F4);
Delay(noteLength);
noTone(soundPin);
digitalWrite (leg3L, låg);
bryta;
/*
fall 4:
spela upp ljud i ben 4 samt ljus upp benet
digitalWrite (leg4L, hög);
tonen (soundPin, NOTE_G4);
Delay(noteLength);
noTone(soundPin);
digitalWrite (leg4L, låg);
bryta;
fall 5:
spela upp ljud i benet 5 samt ljus upp benet
digitalWrite (leg5L, hög);
tonen (soundPin, NOTE_A4);
Delay(noteLength);
noTone(soundPin);
digitalWrite (leg5L, låg);
bryta;
fall 6:
spela upp ljud i benet 6 samt ljus upp benet
digitalWrite (leg6L, hög);
tonen (soundPin, NOTE_B4);
Delay(noteLength);
noTone(soundPin);
digitalWrite (leg6L, låg);
bryta;
fall 7:
spela upp ljud i benet 7 samt ljus upp benet
digitalWrite (leg7L, hög);
tonen (soundPin, NOTE_C5);
Delay(noteLength);
noTone(soundPin);
digitalWrite (leg7L, låg);
bryta; * /
}
seqCounter ++;
värde = spel [seqCounter];
Delay(pauseBetweenNotes);
}
}
void addRound()
{
Serial.Print ("lägga till TURN");
Serial.println(turn);
länge nästa = random(pinsUsed);
IF(turn > turnsToWin)
{
gameWon();
currentPin = -1;
lastPin = -1;
}
annat
{
spel [tur] = nästa;
spel [turn + 1] = -1;
tur ++;
playSequence();
arrayCounter = 0;
currentTime = millis();
loseTime = currentTime + delayAllowed;
Serial.Print ("förlora tid och sådan -");
Serial.println(loseTime);
Serial.Print ("aktuell tid -");
Serial.println(currentTime);
}
}
void gameWon()
{
för (int thisNote = 0; thisNote < 20; thisNote ++) {
för att beräkna noterar varaktighet, ta en sekund
dividerat med Noteringstyp.
e.g. fjärdedelsnot = 1000 / 4, åttondelen noterar = 1000/8, etc.
int noteDuration = 1000/noteDurations [thisNote];
tonen (soundPin, melody[thisNote],noteDuration);
Ange en minsta tid mellan dem för att skilja anteckningar.
tonens längd + 30% verkar fungera bra:
int pauseBetweenNotes = noteDuration * 1,30;
Delay(pauseBetweenNotes);
stoppa tonen uppspelningen:
noTone(soundPin);
}
Delay(10);
digitalWrite (leg0L, hög);
digitalWrite (leg1L, hög);
digitalWrite (leg2L, hög);
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
digitalWrite (leg1L, låg);
digitalWrite (leg2L, låg);
digitalWrite (leg3L, låg);
Delay(pauseBetweenNotes);
digitalWrite (leg0L, hög);
digitalWrite (leg1L, hög);
digitalWrite (leg2L, hög);
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
digitalWrite (leg1L, låg);
digitalWrite (leg2L, låg);
digitalWrite (leg3L, låg);
Delay(pauseBetweenNotes);
digitalWrite (leg0L, hög);
digitalWrite (leg1L, hög);
digitalWrite (leg2L, hög);
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
digitalWrite (leg1L, låg);
digitalWrite (leg2L, låg);
digitalWrite (leg3L, låg);
Delay(pauseBetweenNotes);
digitalWrite (leg0L, hög);
digitalWrite (leg1L, hög);
digitalWrite (leg2L, hög);
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
digitalWrite (leg1L, låg);
digitalWrite (leg2L, låg);
digitalWrite (leg3L, låg);
Delay(pauseBetweenNotes);
Delay(3000);
gameReset();
}
void gameLost(int i)
{
S
digitalWrite (leg0L, hög);
digitalWrite (leg1L, hög);
digitalWrite (leg2L, hög);
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
digitalWrite (leg1L, låg);
digitalWrite (leg2L, låg);
digitalWrite (leg3L, låg);
Delay(pauseBetweenNotes);
digitalWrite (leg0L, hög);
digitalWrite (leg1L, hög);
digitalWrite (leg2L, hög);
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
digitalWrite (leg1L, låg);
digitalWrite (leg2L, låg);
digitalWrite (leg3L, låg);
Delay(pauseBetweenNotes);
digitalWrite (leg0L, hög);
digitalWrite (leg1L, hög);
digitalWrite (leg2L, hög);
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
digitalWrite (leg1L, låg);
digitalWrite (leg2L, låg);
digitalWrite (leg3L, låg);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
O
digitalWrite (leg0L, hög);
digitalWrite (leg1L, hög);
digitalWrite (leg2L, hög);
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
digitalWrite (leg1L, låg);
digitalWrite (leg2L, låg);
digitalWrite (leg3L, låg);
Delay(pauseBetweenNotes);
digitalWrite (leg0L, hög);
digitalWrite (leg1L, hög);
digitalWrite (leg2L, hög);
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
digitalWrite (leg1L, låg);
digitalWrite (leg2L, låg);
digitalWrite (leg3L, låg);
Delay(pauseBetweenNotes);
digitalWrite (leg0L, hög);
digitalWrite (leg1L, hög);
digitalWrite (leg2L, hög);
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
digitalWrite (leg1L, låg);
digitalWrite (leg2L, låg);
digitalWrite (leg3L, låg);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
S
digitalWrite (leg0L, hög);
digitalWrite (leg1L, hög);
digitalWrite (leg2L, hög);
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
digitalWrite (leg1L, låg);
digitalWrite (leg2L, låg);
digitalWrite (leg3L, låg);
Delay(pauseBetweenNotes);
digitalWrite (leg0L, hög);
digitalWrite (leg1L, hög);
digitalWrite (leg2L, hög);
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
digitalWrite (leg1L, låg);
digitalWrite (leg2L, låg);
digitalWrite (leg3L, låg);
Delay(pauseBetweenNotes);
digitalWrite (leg0L, hög);
digitalWrite (leg1L, hög);
digitalWrite (leg2L, hög);
digitalWrite (leg3L, hög);
tonen (soundPin, NOTE_C4);
Delay(pauseBetweenNotes);
noTone(soundPin);
digitalWrite (leg0L, låg);
digitalWrite (leg1L, låg);
digitalWrite (leg2L, låg);
digitalWrite (leg3L, låg);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
Delay(pauseBetweenNotes);
Delay(3000);
gameReset();
}