Interaktiva koppar (10 / 10 steg)
Steg 10: koder
Hämta arduino 1.0.Också, innan du använder koden gå till http://www.ladyada.net/make/waveshield/use.html.
Du ska formatera SD-kortet, konvertera ljudfiler som föreslås i denna webbplats.
Glöm inte att sätta det konverterade ljudet till SD-kortet.
Arduino kod som vi använde:
#include < FatReader.h >
#include < SdReader.h >
#include < avr/pgmspace.h >
#include "WaveUtil.h"
#include "WaveHC.h"
SdReader kort; Detta objekt innehåller information för kortet
FatVolume vol; Detta innehåller information för partitionen på kortet
FatReader rot. Detta innehåller information för filsystemet på kortet
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()) återvända;
putstring ("\n\rSD I/O fel:");
Serial.Print(Card.ErrorCode(), HEX);
putstring (",");
Serial.println(Card.errorData(), HEX);
While(1);
}
void setup() {
Ställ in serieporten
Serial.BEGIN(9600);
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
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 titta i
om (vol.init (kort, del))
bryta; 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ök ö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!
}
Usch! Vi fick tidigare de hårda delarna.
putstring_nl("ready!");
}
void loop() {
putstring("."); avkommentera här för att se om slingan inte är kör
int sensorValue;
sensorValue = analogRead(2); Läs analog ingång stift 2
IF(sensorValue<100) {/ / Detta avgör låten vi spelar
playcomplete ("vatten. WAV");
playcomplete ("fredag. WAV");
}
annars om (sensorValue > = 100 & & sensorValue < 250) {
playcomplete ("milkbaby. WAV");
playcomplete ("baby. WAV");}
annat {playcomplete ("koks. WAV");
playcomplete ("myjeans. WAV");
}
}
void playcomplete(char *name) {
Ring vår hjälpare för att hitta och spela detta namn
playfile(Name);
samtidigt (wave.isplaying) {//while spelar!
int16_t potval = 450;
uint32_t newsamplerate;
int16_t lastpotval = 0;
#define HYSTERESIS 3
int sensorValue;
sensorValue = analogRead(5); läsa in 5 som är omgivande ljussensorn
IF(sensorValue<10) {
Break;} om vi kommer nära omgivande ljussensorn, det slutar låten och ändra den till en annan musik
Detta är den kod som ändrar hastigheten
potval = analogRead(0); Läs bend sensorn och denna kodförändringar hastigheten beroende på sensorn
om (((potval-lastpotval) > HYSTERESIS) || ((lastpotval-potval) > HYSTERESIS)) {
newsamplerate = wave.dwSamplesPerSec; få den ursprungliga samplingsfrekvensen
newsamplerate * = potval; skala det analoga värde
newsamplerate = 512; Vi vill 'dela' mellan 2 x rusade upp och avtog.
wave.setSampleRate(newsamplerate); Ange det omedelbart!
Serial.println (newsamplerate, DEC); för felsökning
lastpotval = potval;
}
Serial.Print(potval,dec);
Delay(100);
}
dess gjort spelar nu
}
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();
Sluta
}
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"); hemkomst.
}
OK dags att spela! starta uppspelningen
Wave.Play();}