Ljud skattjakt (5 / 14 steg)
Steg 5: Arduino koden
Här är kopia av Arduino koden. Du kan antingen ladda ner den bifogade fil, eller du kan kopiera och klistra in denna text i en ny skiss.
Sedan ansluter Arduino styrelsen till datorn och ladda upp koden.
#include
#include #include #include "WaveUtil.h" #include "WaveHC.h"
SdReader kort; Detta objekt innehåller information för kort FatVolume vol; Detta innehåller information för partitionen på kort FatReader rot; Detta innehåller information för filsystemet på kort FatReader f; Detta innehåller information för filen vi är spelar
WaveHC våg; Detta är enda våg (audio)-objektet, eftersom vi bara kommer att spela en i taget
#define DÄMPNINGSTID 100 / / knappen debouncer
Denna behändiga funktionen returnerar antalet byte för närvarande gratis i RAM, bra för felsökning! int freeRam(void) {extern int __bss_end; extern int * __brkval; int free_memory; om ((int) __brkval == 0) {free_memory = ((int) & free_memory)-((int) & __bss_end);} annat {free_memory = ((int) & free_memory)-((int) __brkval);} återvända free_memory;}
void sdErrorCheck(void) {om (! card.errorCode()) avkastning, putstring ("\n\rSD I/O fel:"); Serial.Print(Card.ErrorCode(), HEX); putstring (","); Serial.println(Card.errorData(), HEX); While(1); }
<---installationsprogrammet för void void setup() {/ / ställa upp serial port Serial.begin(9600), putstring_nl ("WaveHC med 6 knappar"), putstring ("fri slå ned:"); Detta kan hjälpa till med felsökning, slut RAM är dålig Serial.println(freeRam()); om detta är under 150 byte kan det stava problem! Ställa in produktionen stift för DAC kontroll. Detta stift definieras i biblioteket pinMode (2, utgång); pinMode (3, OUTPUT); pinMode (4, OUTPUT); pinMode (5, OUTPUT); pin13 LED pinMode (13, OUTPUT); Aktivera pull-up motstånd på switch stift (analoga ingångar) digitalWrite (14, hög). digitalWrite (15, hög). digitalWrite (16, hög). digitalWrite (17, hög), digitalWrite (18, hög). digitalWrite (19, hög). om (! card.init(true)) {//play med 4 MHz spi om 8MHz inte fungerar för dig om (! card.init()) {//play med 8 MHz spi (standard snabbare!) putstring_nl ("kort init. misslyckades!"); Något gick fel, kan skriva ut varför sdErrorCheck(); While(1); sedan 'stoppa' - gör ingenting! } / / Aktivera optimera Läs - vissa kort kan timeout. Inaktivera om du har problem card.partialBlockRead(true); Nu söker vi en FAT-partition! uint8_t del; för (del = 0; del < 5; del ++) {/ / vi har upp till 5 platser att leta i om (vol.init (kort, del)) paus; / / Vi hittade en, låter borgen} om (del == 5) {/ / om vi slutade inte att hitta en :(putstring_nl ("ingen giltig FAT-partition!"); sdErrorCheck(); / / något gick fel, kan skriva ut varför while(1); / / sedan 'stoppa' - gör ingenting!} / / kan tala om för användaren om vad vi hittade putstring ("använda partition"); Serial.Print (del, DEC); putstring (", typ är FAT"); Serial.println(Vol.fatType(),dec); FAT16 eller FAT32? Försöker öppna rotkatalogen om (! root.openRoot(vol)) {putstring_nl ("kan inte öppna rotfästa dir!"); / / något gick fel, while(1); / / sedan 'stoppa' - gör ingenting!} / / Puh! Vi fick tidigare de hårda delarna. putstring_nl("ready!"); }
//<------------------------------------------------------------------------------------- Void Loop
void loop() {/ / putstring("."); / / ta bort kommentar här för att se om slingan inte är kör int secretCodeOne [6] = {1, 2, 3, 4, 5, 6}; int secretCodeTwo [6] = {1, 1, 2, 2, 3, 3}; int secretCodeThree [6] = {2, 4, 6, 1, 3, 5}; int secretCodeFour [6] = {1, 2, 3, 5, 5, 5}; int secretCodeFive [6] = {1, 2, 3, 3, 2, 1}; int secretCodeSix [6] = {1 2, 3, 4, 5, 1};
int enteredCode [6] = {0, 0, 0, 0, 0, 0}; int correctKeys = 0; int framgång = 0; byte pressade, lagrar värden för knappen intryckt int jag = 0; loopen upprepas
för (jag = 0; jag < 6; i ++) //stores tryckte värdena i en matris {göra {tryckte = check_switches();} medan (pressad < 1), enteredCode [i] = tryckte; //stores tryckte värdena i en array delay(500); Serial.println(enteredCode[i]); Tryck knappen intryckt}
för (jag = 0; jag < 6; i ++) //Check kod en {om (enteredCode [i] == secretCodeOne[i]) {correctKeys = correctKeys + 1; //counts antalet rätt tangenter}} om (correctKeys == 6) //if koden matchar kod en, spela spår en {Serial.println ("kod en korrekt"); playcomplete("1.WAV"); framgång = 1;} correctKeys = 0; återställa rätt nyckel counter
för (jag = 0; jag < 6; i ++) //Check koden två {om (enteredCode [i] == secretCodeTwo[i]) {correctKeys = correctKeys + 1; //counts antalet rätt tangenter}} om (correctKeys == 6) //if koden matchar kod en, spela spår en {Serial.println ("kod två korrekt"); playcomplete("2.WAV"); framgång = 1;} correctKeys = 0; återställa rätt nyckel counter
för (jag = 0; jag < 6; i ++) //Check kod tre {om (enteredCode [i] == secretCodeThree[i]) {correctKeys = correctKeys + 1; //counts antalet rätt tangenter}} om (correctKeys == 6) //if koden matchar kod en, spela spår en {Serial.println ("kod tre korrekt"); playcomplete("3.WAV"); framgång = 1;} correctKeys = 0; återställa rätt nyckel counter
för (jag = 0; jag < 6; i ++) //Check kod fyra {om (enteredCode [i] == secretCodeFour[i]) {correctKeys = correctKeys + 1; //counts antalet rätt tangenter}} om (correctKeys == 6) //if koden matchar kod en, spela spår en {Serial.println ("kod fyra korrekt"); playcomplete("4.WAV"); framgång = 1;} correctKeys = 0; återställa rätt nyckel counter
för (jag = 0; jag < 6; i ++) //Check kod fem {om (enteredCode [i] == secretCodeFive[i]) {correctKeys = correctKeys + 1; //counts antalet rätt tangenter}} om (correctKeys == 6) //if koden matchar kod en, spela spår en {Serial.println ("kod fem korrekt"); playcomplete("5.WAV"); framgång = 1;} correctKeys = 0; återställa rätt nyckel counter
för (jag = 0; jag < 6; i ++) //Check kod sex {om (enteredCode [i] == secretCodeSix[i]) {correctKeys = correctKeys + 1; //counts antalet rätt tangenter}} om (correctKeys == 6) //if koden matchar kod en, spela spår en {Serial.println ("kod sex korrekt"); playcomplete("6.WAV"); framgång = 1;} correctKeys = 0; återställa rätt nyckel counter
IF(Success == 1) {Serial.println ("du fick en kod korrekt"); framgång = 0;} annat {playcomplete("0.WAV"); Serial.println ("du inte"); } }
byte check_switches() {statisk byte tidigare [6], statiska lång tid [6], byte läsa; byte tryckte, byte index; tryckte = 0;
för (byte index = 0; index < 6; ++ index) {läsning = digitalRead (14 + indexet); om (läser == låg & & föregående [index] == hög & & millis() - tid [index] > DÄMPNINGSTID) {/ / växla pressad tid [index] = millis(); tryckte = index + 1; bryta;} tidigare [index] = läser;} / / tillbaka switch nummer (1-6) avkastning (pressad); }
Spelar en full fil från början till slut med ingen paus. void playcomplete(char *name) {/ / kalla våra hjälpare att hitta och spela detta namn playfile(name); samtidigt (wave.isplaying) {/ / gör ingenting när man dess spelar} / / nu dess gjort spelar}
void playfile(char *name) {/ / se om objektet våg för närvarande gör något om (wave.isplaying) {/ / redan spelar något, så sluta det! wave.stop(); / / stoppa det} / / titta i rotkatalogen och öppna filen om (! f.open (rot, namn)) {putstring ("kunde inte öppna filen"); Serial.Print(Name); hemkomst. } / / OK läsa filen och förvandla det till en våg objekt om (! wave.create(f)) {putstring_nl ("inte en giltig WAV"), återvänder;} / / ok tid att spela! starta uppspelning wave.play(); }