Last active
October 1, 2015 15:07
-
-
Save brian-lc/a700ef3620361a40546a to your computer and use it in GitHub Desktop.
Audio code for the adafruit wav shield
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <FatReader.h> | |
| #include <SdReader.h> | |
| #include <avr/pgmspace.h> | |
| #include "WaveUtil.h" | |
| #include "WaveHC.h" | |
| SdReader card; // This object holds the information for the card | |
| FatVolume vol; // This holds the information for the partition on the card | |
| FatReader root; // This holds the information for the filesystem on the card | |
| FatReader f; // This holds the information for the file we're play | |
| WaveHC wave; // This is the only wave (audio) object, since we will only play one at a time | |
| byte PrevValUpin = HIGH; // Storing the previous reading to "debounce" startup of the current sense board | |
| byte PrevValDpin = HIGH; | |
| int DownPinNum = 8; // The pins to sense the up/down signals | |
| int UpPinNum = 9; | |
| // this handy function will return the number of bytes currently free in RAM, great for debugging! | |
| int freeRam(void) | |
| { | |
| extern int __bss_end; | |
| extern int *__brkval; | |
| int free_memory; | |
| if((int)__brkval == 0) { | |
| free_memory = ((int)&free_memory) - ((int)&__bss_end); | |
| } | |
| else { | |
| free_memory = ((int)&free_memory) - ((int)__brkval); | |
| } | |
| return free_memory; | |
| } | |
| void sdErrorCheck(void) | |
| { | |
| if (!card.errorCode()) return; | |
| Serial.println("\n\rSD I/O error: "); | |
| Serial.print(card.errorCode(), HEX); | |
| Serial.print(", "); | |
| Serial.println(card.errorData(), HEX); | |
| while(1); | |
| } | |
| void setup() { | |
| // set up serial port | |
| Serial.begin(9600); | |
| // Set the output pins for the DAC control. This pins are defined in the library | |
| pinMode(2, OUTPUT); | |
| pinMode(3, OUTPUT); | |
| pinMode(4, OUTPUT); | |
| pinMode(5, OUTPUT); | |
| // Listening on these pins for triggers | |
| pinMode(DownPinNum, INPUT); // Basket down | |
| pinMode(UpPinNum, INPUT); // Basket up | |
| if (!card.init()) { //play with 8 MHz spi (default faster!) | |
| Serial.println("Card init. failed!"); // Something went wrong, lets print out why | |
| sdErrorCheck(); | |
| while(1); // then 'halt' - do nothing! | |
| } | |
| // enable optimize read - some cards may timeout. Disable if you're having problems | |
| card.partialBlockRead(true); | |
| // Now we will look for a FAT partition! | |
| uint8_t part; | |
| for (part = 0; part < 5; part++) { // we have up to 5 slots to look in | |
| if (vol.init(card, part)) | |
| break; // we found one, lets bail | |
| } | |
| if (part == 5) { // if we ended up not finding one :( | |
| Serial.println("No valid FAT partition!"); | |
| sdErrorCheck(); // Something went wrong, lets print out why | |
| while(1); // then 'halt' - do nothing! | |
| } | |
| // Lets tell the user about what we found | |
| Serial.print("Using partition "); | |
| Serial.print(part, DEC); | |
| Serial.print(", type is FAT"); | |
| Serial.println(vol.fatType(),DEC); // FAT16 or FAT32? | |
| // Try to open the root directory | |
| if (!root.openRoot(vol)) { | |
| Serial.println("Can't open root dir!"); // Something went wrong, | |
| while(1); // then 'halt' - do nothing! | |
| } | |
| delay(5000); // wait a few seconds for the secondary board to boot | |
| } | |
| void loop() { | |
| byte downPin; | |
| byte upPin; | |
| downPin = digitalRead(DownPinNum); | |
| upPin = digitalRead(UpPinNum); | |
| if (PrevValDpin == LOW && downPin == HIGH){ | |
| Serial.print("DOWN"); | |
| playcomplete("DOWN.wav"); | |
| delay(1000); | |
| } | |
| if (PrevValUpin == LOW && upPin == HIGH){ | |
| Serial.print("UP"); | |
| playcomplete("UP.wav"); | |
| delay(1000); | |
| } | |
| PrevValDpin = downPin; | |
| PrevValUpin = upPin; | |
| delay(2); | |
| } | |
| // Plays a full file from beginning to end with no pause. | |
| void playcomplete(char *name) { | |
| // call our helper to find and play this name | |
| playfile(name); | |
| while (wave.isplaying) { | |
| // do nothing while its playing | |
| } | |
| // now its done playing | |
| } | |
| void playfile(char *name) { | |
| // see if the wave object is currently doing something | |
| if (wave.isplaying) {// already playing something, so stop it! | |
| wave.stop(); // stop it | |
| } | |
| // look in the root directory and open the file | |
| if (!f.open(root, name)) { | |
| putstring("Couldn't open file "); Serial.print(name); return; | |
| } | |
| // OK read the file and turn it into a wave object | |
| if (!wave.create(f)) { | |
| putstring_nl("Not a valid WAV"); return; | |
| } | |
| // ok time to play! start playback | |
| wave.play(); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment