Étape 6: Code d’Arduino
* http://www.ladyada.net/make/waveshield/download.html
*
* code modifié de http://www.ladyada.net/media/wavshield/SampleRateMod.pde
*
* L’orientation de l’accéléromètre est importante pour que ce code s’exécute correctement. Le
* accéléromètre doit être à peu près parallèle à l’Arduino, avec la commande de volume sur le dessus comme le
* dispositif repose sur la hanche.
*/
#include < WaveHC.h >
#include < WaveUtil.h >
Carte de SdReader ; Cet objet conserve les informations de la carte
Vol FatVolume ; Il conserve les informations pour la partition sur la carte
FatReader racine ; Il conserve les informations pour le répertoire racine de volumes
Fichier FatReader ; Cet objet représente le fichier WAV
WaveHC vague ; C’est le seul objet (audio) de la vague, puisque nous allons jouer seulement un à la fois
/*
Définir des macros pour mettre des messages d’erreur dans la mémoire flash
*/
#define error(msg) error_P(PSTR(msg))
Trucs de LED
intervalle long = 1000 ;
int ledPin = 7 ; le nombre de l’axe de la LED
int ledState = faible ; ledState permet de définir la LED
long previousMillis = 0 ; va stocker la dernière fois mise à jour de LED
//////////////////////////////////// SETUP
void setup() {}
pinMode (ledPin, sortie) ;
Serial.Begin(9600) ;
Serial.println ("vague test!") ;
Essayez card.init(true) si des erreurs se produisent sur bouclier vague V1.0
Si (! card.init()) {}
erreur ("carte init. a échoué!") ;
}
Enable optimiser la lecture - certaines cartes peuvent timeout
card.partialBlockRead(true) ;
Si (! vol.init(card)) {}
erreur ("aucune partition!") ;
}
Si (! root.openRoot(vol)) {}
erreur ("Impossible d’ouvrir racine") ;
}
putstring_nl ("fichiers trouvés:") ;
root.ls() ;
}
declarition avant
void playcomplete (FatReader & fichier) ;
//////////////////////////////////// LOOP
void loop() {}
uint8_t i, r ;
nom c, Char [15] ;
dir_t dir ;
root.Rewind() ;
Faites défiler les fichiers dans le répertoire
tandis que (root.readDir(dir) > 0) {}
seulement jouer. Fichiers WAV
Si (! strncmp_P ((char *) & dir.name[8]. PSTR("wav"))) continuer ;
Si (! file.open (vol, dir)) {}
putstring ("Impossible d’ouvrir ») ;
printEntryName(dir) ;
continuer ;
}
putstring ("\n\rPlaying") ;
printEntryName(dir) ;
Serial.println() ;
playcomplete(file) ;
file.Close() ;
}
}
/////////////////////////////////// HELPERS
/*
imprimer des message d’erreur et arrêter
*/
void error_P (const char * str)
{
PgmPrint ("erreur:") ;
SerialPrint_P(str) ;
sdErrorCheck() ;
while(1) ;
}
/*
imprimer des message d’erreur et en cas d’erreur d’e/s SD, idéal pour le débogage !
*/
Sub sdErrorCheck(void)
{
Si (! card.errorCode()) retourner ;
PgmPrint ("\r\nSD I/O erreur:") ;
Serial.Print(Card.ErrorCode(), HEX) ;
PgmPrint (",") ;
Serial.println(Card.ErrorData(), HEX) ;
while(1) ;
}
int16_t lastpotval = 0 ;
#define hystérésis 3
/*
* lire le fichier avec les modifications de taux d’échantillonnage
*/
void makeLEDsblink() {}
unsigned long currentMillis = millis() ;
putstring ("currentMillis =") ; Serial.println(currentMillis) ;
putstring ("prevMillis =") ; Serial.println(previousMillis) ;
putstring ("interval =") ; Serial.println(Interval) ;
Si (currentMillis - previousMillis > intervalle) {}
enregistrer la dernière fois vous cligna des yeux la LED
previousMillis = currentMillis ;
Si le voyant est éteint le faire tourner sur et vice versa :
Si (ledState == faible) {}
ledState = élevé ; }
else {}
ledState = bas ;
}
Définissez la LED avec la ledState de la variable :
digitalWrite (ledPin, ledState) ;
}
}
void playcomplete (FatReader & file) {}
int16_t potval = 450 ;
uint32_t newsamplerate ;
int counter1 = 0 ;
int counter2 = 0 ;
int accelValue ;
Si (! wave.create(file)) {}
putstring_nl ("pas un valide" WAV") ; retour ;
}
OK le temps de jouer !
Wave.Play() ;
alors que {(wave.isplaying)
makeLEDsblink() ;
accelValue = analogRead(0) ;
Serial.println(accelValue) ;
Si {(accelValue < 350)
counter2 ++ ;
}
Si {(counter1 > 30)
Serial.println(counter2) ;
potval = (counter2 * 18) + 450 ;
counter1 = 0 ;
counter2 = 0 ;
}
Si (((potval-lastpotval) > hystérésis) || ((lastpotval-potval) > hystérésis)) {
putstring ("pot =") ; Serial.println (potval, DEC) ;
putstring ("tickspersam =") ; Serial.Print (wave.dwSamplesPerSec, DEC) ; putstring ("->") ;
newsamplerate = wave.dwSamplesPerSec ;
newsamplerate * = potval ;
newsamplerate / = 512 ; Nous voulons « split » entre accéléré et ralenti.
Si (newsamplerate > 48000) {}
newsamplerate = 48000 ;
}
Si {(newsamplerate < 1000)
newsamplerate = 1000 ;
}
wave.setSampleRate(newsamplerate) ;
intervalle = 7500000/newsamplerate ;
putstring ("interval =") ; Serial.println (potval, DEC) ; Serial.println(Interval) ;
Serial.println (newsamplerate, DEC) ;
lastpotval = potval ;
}
Delay(100) ;
counter1 ++ ;
}
sdErrorCheck() ;
}