Rebecca's Outfit (6 / 7 steg)
Steg 6: Arduino kod
* http://www.ladyada.net/make/waveshield/download.html
*
* kod ändras från http://www.ladyada.net/media/wavshield/SampleRateMod.pde
*
* Accelerometern orientering är viktig för denna koden ska fungera. Den
* accelerometer bör vara ungefär parallella till Arduino, med Volymkontrollen på toppen som den
* enheten vilar på höften.
*/
#include < WaveHC.h >
#include < WaveUtil.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 volymer rotmapp
FatReader fil. Det här objektet representerar WAV-fil
WaveHC våg; Detta är enda våg (audio)-objektet, eftersom vi bara kommer att spela en i taget
/*
* Definiera makro för att få felmeddelanden i flash-minne
*/
#define error(msg) error_P(PSTR(msg))
LED grejer
långa intervall = 1000;
int ledPin = 7. antal LED stift
int ledState = låg; ledState används för att ange LED
lång previousMillis = 0; kommer att lagra förra gången LED uppdaterades
//////////////////////////////////// SETUP
void setup() {
pinMode (ledPin, produktionen);
Serial.BEGIN(9600);
Serial.println ("Wave test!");
prova card.init(true) om fel uppstår på V1.0 Wave sköld
om (! card.init()) {
fel ("kort init. misslyckades!");
}
Aktivera optimera Läs - vissa kort kan timeout
card.partialBlockRead(true);
om (! vol.init(card)) {
fel ("ingen partition!");
}
om (! root.openRoot(vol)) {
fel kunde inte ("öppna root");
}
putstring_nl ("filer som hittas:");
root.ls();
}
framåt declarition
void playcomplete (FatReader & file);
//////////////////////////////////// LOOP
void loop() {
uint8_t i, r;
char c, namn [15].
dir_t dir;
root.Rewind();
Bläddra igenom filerna i katalogen
samtidigt (root.readDir(dir) > 0) {
bara spela. WAV-filer
om (! strncmp_P ((char *) & dir.name[8]. PSTR("wav"))) fortsätta;
om (! file.open (vol, dir)) {
putstring kan inte ("öppna");
printEntryName(dir);
fortsätta;
}
putstring ("\n\rPlaying");
printEntryName(dir);
Serial.println();
playcomplete(File);
File.Close();
}
}
/////////////////////////////////// HELPERS
/*
* skriva ut felmeddelande och stoppa
*/
void error_P (const char * str)
{
PgmPrint ("fel:");
SerialPrint_P(str);
sdErrorCheck();
While(1);
}
/*
* skriva ut felmeddelande och stoppa om SD i/o-fel, bra för felsökning!
*/
void sdErrorCheck(void)
{
om (! card.errorCode()) återvända;
PgmPrint ("\r\nSD I/O fel:");
Serial.Print(Card.ErrorCode(), HEX);
PgmPrint (",");
Serial.println(Card.errorData(), HEX);
While(1);
}
int16_t lastpotval = 0;
#define HYSTERESIS 3
/*
* spela upp filen med urval ränteförändringar
*/
void makeLEDsblink() {
osignerade långa currentMillis = millis();
putstring ("currentMillis ="); Serial.println(currentMillis);
putstring ("prevMillis ="); Serial.println(previousMillis);
putstring ("intervall ="); Serial.println(Interval);
om (currentMillis - previousMillis > intervall) {
spara den senaste gången du blinkade lysdioden
previousMillis = currentMillis;
om lysdioden är stänger den på och vice versa:
om (ledState == låg) {
ledState = hög; }
annat {
ledState = låg;
}
Set LED med ledState av variabeln:
digitalWrite (ledPin, ledState);
}
}
void playcomplete (FatReader & file) {
int16_t potval = 450;
uint32_t newsamplerate;
int counter1 = 0;
int counter2 = 0;
int accelValue;
om (! wave.create(file)) {
putstring_nl ("inte en giltig WAV"); hemkomst.
}
OK dags att spela!
Wave.Play();
samtidigt (wave.isplaying) {
makeLEDsblink();
accelValue = analogRead(0);
Serial.println(accelValue);
om (accelValue < 350) {
counter2 ++;
}
om (counter1 > 30) {
Serial.println(counter2);
potval = (counter2 * 18) + 450;
counter1 = 0;
counter2 = 0;
}
om (((potval-lastpotval) > HYSTERESIS) || ((lastpotval-potval) > HYSTERESIS)) {
putstring ("pot ="); Serial.println (potval, DEC);
putstring ("tickspersam ="); Serial.Print (wave.dwSamplesPerSec, DEC); putstring ("->");
newsamplerate = wave.dwSamplesPerSec;
newsamplerate * = potval;
newsamplerate = 512; Vi vill dela upp mellan rusade upp och avtog.
om (newsamplerate > 48000) {
newsamplerate = 48000;
}
om (newsamplerate < 1000) {
newsamplerate = 1000;
}
wave.setSampleRate(newsamplerate);
intervall = 7500000/newsamplerate;
putstring ("intervall ="); Serial.println (potval, DEC); Serial.println(Interval);
Serial.println (newsamplerate, DEC);
lastpotval = potval;
}
Delay(100);
counter1 ++;
}
sdErrorCheck();
}