Arduino personliga Soundtrack Hoodie (5 / 6 steg)
Steg 5: kod
Huvuddelen av koden är för WaveShield, baserat på http://www.ladyada.net/make/waveshield/Det finns flera flera knappen exempel runt - jag använde en mash-up baserad på Rayshobby blogg http://rayshobby.net/?p=16 med lite av detta en, kastat i.
Slumpmässigt urval kod för den sista knappen är anpassad från www.arduino.cc/en/Tutorial/Blink & www.arduino.cc/en/Reference/Random.
#include < FatReader.h >
#include < SdReader.h >
#include < avr/pgmspace.h >
#include "WaveUtil.h"
#include "WaveHC.h"
int buttonPinR = 0; Höger arm knappar på analoga stift 0
int buttonValueR = 0;
int buttonPinL = 1; Vänster arm knappar på Analog pinne 1
int buttonValueL = 0;
lång randChoose = 0; Initiera slumpmässiga element
lång randNumber;
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
int wasplaying = 0;
int rVal;
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()
{
Serial.BEGIN(9600);
Serial.println ("Wave test!");
pinMode (2, utgång);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
pinMode (13, OUTPUT);
randomSeed (analogRead (1)); setup slumpgenerator
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!");
}
Knappar kalibreras med en 10K resistor på 5v stift med ett 9v batteri anslutet till Arduino kontakten.
Använd värden från din analoga Läs skiss till fäste värdet som tilldelats varje knapp. Din kan variera från de tilldelade här.
Höger arm knappar på stift 0
void loop() {
buttonValueR = analogRead(buttonPinR);
om (buttonValueR > 645 & & buttonValueR < 660) {
playcomplete ("R1. WAV");
}
Delay(25); Det är alltid bra att långsamma saker ner lite när man läser ingångar
om (buttonValueR > 225 & & buttonValueR < 240) {
playcomplete ("R2. WAV");
}
Delay(25);
om (buttonValueR > 165 & & buttonValueR < 185) {
playcomplete ("R3. WAV");
}
Delay(25);
om (buttonValueR > 325 & & buttonValueR < 345) {
playcomplete ("R4. WAV");
}
Delay(25);
om (buttonValueR > 495 & & buttonValueR < 515) {
playcomplete ("R5. WAV");
}
Vänster arm knappar på stift 1
buttonValueL = analogRead(buttonPinL);
om (buttonValueL > 645 & & buttonValueL < 660) {
playcomplete ("L1. WAV");
}
Delay(25);
om (buttonValueL > 225 & & buttonValueL < 245) {
playcomplete ("L2. WAV");
}
Delay(25);
om (buttonValueL > 165 & & buttonValueL < 185) {
playcomplete ("L3. WAV");
}
Delay(25);
om (buttonValueL > 325 & & buttonValueL < 350) {
playcomplete ("L4. WAV");
}
Delay(25);
Randomize ljud påverkar spelade när du trycker på den sista knappen på vänster arm
om (buttonValueL > 495 & & buttonValueL < 515) {
randChoose = random (1, 20); generera ett val mellan 1 och 20
växel (randChoose)
{
fall 1:
playcomplete ("RAND1. WAV");
bryta;
fall 2:
playcomplete ("RAND2. WAV");
bryta;
fall 3:
playcomplete ("RAND3. WAV");
bryta;
fall 4:
playcomplete ("RAND4. WAV");
bryta;
fall 5:
playcomplete ("RAND5. WAV");
bryta;
fall 6:
playcomplete ("RAND6. WAV");
bryta;
fall 7:
playcomplete ("RAND7. WAV");
bryta;
mål 8:
playcomplete ("RAND8. WAV");
bryta;
mål 9:
playcomplete ("RAND9. WAV");
bryta;
mål 10:
playcomplete ("RAND10. WAV");
bryta;
mål 11:
playcomplete ("RAND11. WAV");
bryta;
ärende 12:
playcomplete ("RAND12. WAV");
bryta;
ärende 13:
playcomplete ("RAND13. WAV");
bryta;
fall 14:
playcomplete ("RAND14. WAV");
bryta;
mål 15:
playcomplete ("RAND15. WAV");
bryta;
fall 16:
playcomplete ("RAND16. WAV");
bryta;
fall 17:
playcomplete ("RAND17. WAV");
bryta;
fall 18:
playcomplete ("RAND18. WAV");
bryta;
fall 19:
playcomplete ("RAND19. WAV");
bryta;
mål 20:
playcomplete ("RAND20. WAV");
bryta;
}
Delay(25);
}
}
Spelar en full fil från början till slut med ingen paus.
void playcomplete(char *name) {
Ring vår hjälpare för att hitta och spela detta namn
playfile(Name);
samtidigt (wave.isplaying) {
göra ingenting samtidigt dess spelar
}
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();
}