Stap 10: Codes
Download arduino 1.0.Ook, voordat u de code naar http://www.ladyada.net/make/waveshield/use.html gaan.
U moet Formatteer de SD-kaart, converteren van audiobestanden zoals voorgesteld in deze site.
Ook, vergeet niet om de geconverteerde audio naar de SD-kaart.
Arduino Code die we gebruikt:
#include < FatReader.h >
#include < SdReader.h >
#include < avr/pgmspace.h >
#include "WaveUtil.h"
#include "WaveHC.h"
Kaart van de SdReader; Dit object bevat de gegevens voor de kaart
FatVolume vol; Dit houdt de informatie voor de partitie op de kaart
FatReader wortel; Dit bevat de gegevens voor het bestandssysteem op de kaart
F FatReader; Dit bevat de gegevens voor het bestand we aan het spelen bent
WaveHC Golf; Dit is de enige Golf (audio) object, omdat we zullen slechts één filter tegelijk spelen
#define DEBOUNCE 100 / / button debouncer
deze handige functie geeft het aantal bytes in het RAM, momenteel gratis groot voor debugging!
int freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
Als (__brkval (int) == 0) {}
FREE_MEMORY = ((int) & free_memory)-((int) & __bss_end);
}
else {}
FREE_MEMORY = ((int) & free_memory)-((int) __brkval);
}
Return free_memory;
}
VOID sdErrorCheck(void)
{
Als (! card.errorCode()) keren;
putstring ("\n\rSD I/O fout:");
Serial.Print(Card.ErrorCode(), HEX);
putstring (",");
Serial.println(Card.errorData(), HEX);
while(1);
}
VOID Setup {}
seriële poort instellen
Serial.begin(9600);
Serial.println(freeRam()); Als dit onder 150 bytes kan het problemen magie!
De pennen voor de DAC-besturingselement instellen Deze pennen zijn gedefinieerd in de bibliotheek
Als (! card.init(true)) {//play met 4 MHz spi als 8MHz niet voor u werkt
Als (! card.init()) {//play met 8 MHz spi (standaard sneller!)
putstring_nl ("Card init. mislukt!"); Er ging iets mis, laat uitprinten waarom
sdErrorCheck();
while(1); vervolgens 'stoppen' - niets doen!
}
inschakelen optimaliseren lees - sommige kaarten kunnen timeout. Uitschakelen als u problemen ondervindt
card.partialBlockRead(true);
Nu gaan we voor een FAT-partitie!
uint8_t deel;
voor (deel = 0; deel < 5; deel ++) {/ / Wij hebben maximaal 5 "slots" om in te kijken
Als (vol.init (kaart, deel))
breken; We vonden een, laat borgtocht
}
Als (deel == 5) {/ / als we uiteindelijk niet het vinden van een :(
putstring_nl ("geen geldige FAT-partitie!");
sdErrorCheck(); Er ging iets mis, laat uitprinten waarom
while(1); vervolgens 'stoppen' - niets doen!
}
Laat de gebruiker te vertellen over wat we gevonden
putstring ("Using partitie");
Serial.Print (deel, DEC);
putstring (", type is vet");
Serial.println(vol.fatType(),DEC); FAT16 of FAT32?
Probeert te openen van de root directory
Als (! root.openRoot(vol)) {}
putstring_nl ("kan niet openen root dir!"); Er ging iets mis,
while(1); vervolgens 'stoppen' - niets doen!
}
Oef! Daar kregen we voorbij de harde delen.
putstring_nl("Ready!");
}
void loop {}
putstring("."); uncomment dit om te zien als de lus niet actief
int sensorValue;
sensorValue = analogRead(2); analoge invoer pin 2 lezen
if(sensorValue<100) {/ / Dit bepaalt de song we spelen
playcomplete ("water. WAV");
playcomplete ("vrijdag. WAV");
}
anders als (sensorValue > = 100 & & sensorValue < 250) {}
playcomplete ("milkbaby. WAV");
playcomplete ("baby. WAV");}
else {playcomplete ("coke. WAV");
playcomplete ("myjeans. WAV");
}
}
ongeldig playcomplete(char *name) {}
Bel onze helper vinden en spelen deze naam
playfile(name);
terwijl (wave.isplaying) {//while het fragment wordt afgespeeld!
int16_t potval = 450;
uint32_t newsamplerate;
int16_t lastpotval = 0;
#define HYSTERESIS 3
int sensorValue;
sensorValue = analogRead(5); Lees input 5 die de omringende lichte sensor
if(sensorValue<10) {}
pauze;} Als we te dicht bij de omringende lichte sensor, het stopt het liedje en wijzig deze naar een andere muziek
Dit is de code die de snelheid verandert
potval = analogRead(0); Lees de bocht sensor en deze wijzigingen in de code de snelheid afhankelijk van de sensor
Als (((potval-lastpotval) > HYSTERESIS) || ((lastpotval-potval) > HYSTERESIS)) {
newsamplerate = wave.dwSamplesPerSec; krijgen van de oorspronkelijke samplefrequentie
newsamplerate * = potval; schaal met de analoge waarde
newsamplerate / = 512; We willen 'split' tussen 2 x versneld en vertraagd.
wave.setSampleRate(newsamplerate); Stel deze onmiddellijk!
Serial.println (newsamplerate, DEC); voor foutopsporing
lastpotval = potval;
}
Serial.Print(potval,DEC);
delay(100);
}
nu zijn gedaan afspelen
}
ongeldig playfile(char *name) {}
Zie als de Golf-object is momenteel bezig met iets
Als (wave.isplaying) {/ / al het spelen van iets, dus stoppen met het!
Wave.stop();
Stop ermee
}
kijken in de root directory en open het bestand
Als (! f.open (root, naam)) {}
putstring kon niet ("open bestand"); Serial.Print(name); terugkeer;
}
OK lees het bestand en zet hem in een golf-object
Als (! wave.create(f)) {}
putstring_nl ("niet een geldig WAV"); terugkeer;
}
OK tijd om te spelen! Start het afspelen
Wave.Play();}