----
<pre>
<span style="color: #7E7E7E;">//Ian Petrov VIS147A Final</span><span style="color: #7E7E7E;">//code edited from Adafruit Wave Shield Site</span>#include <FatReader.h>#include <SdReader.h>#include <avr/pgmspace.h>#include <span style="color: #006699;">"WaveUtil.h"</span>#include <span style="color: #006699;">"WaveHC.h"</span>
SdReader card; <span style="color: #7E7E7E;"> // This object holds the information for the card</span>FatVolume vol; <span style="color: #7E7E7E;"> // This holds the information for the partition on the card</span>FatReader root; <span style="color: #7E7E7E;"> // This holds the information for the filesystem on the card</span>FatReader f; <span style="color: #7E7E7E;"> // This holds the information for the file we're play</span>
WaveHC wave; <span style="color: #7E7E7E;"> // This is the only wave (audio) object, since we will only play one at a time</span>
#define DEBOUNCE 100 <span style="color: #7E7E7E;"> // button debouncer</span>
<span style="color: #7E7E7E;">// this handy function will return the number of bytes currently free in RAM, great for debugging! </span> <span style="color: #CC6600;">int</span> freeRam(<span style="color: #CC6600;">void</span>)
{
extern <span style="color: #CC6600;">int</span> __bss_end; extern <span style="color: #CC6600;">int</span> *__brkval; <span style="color: #CC6600;"> int</span> free_memory; <span style="color: #CC6600;"> if</span>((<span style="color: #CC6600;">int</span>)__brkval == 0) { free_memory = ((<span style="color: #CC6600;">int</span>)&free_memory) - ((<span style="color: #CC6600;">int</span>)&__bss_end); } <span style="color: #CC6600;"> else</span> { free_memory = ((<span style="color: #CC6600;">int</span>)&free_memory) - ((<span style="color: #CC6600;">int</span>)__brkval); } <span style="color: #CC6600;"> return</span> free_memory; }
<span style="color: #CC6600;">void</span> sdErrorCheck(<span style="color: #CC6600;">void</span>)
{
<span style="color: #CC6600;"> if</span> (!card.errorCode()) <span style="color: #CC6600;">return</span>; putstring(<span style="color: #006699;">"\n\rSD I/O error: "</span>); <span style="color: #CC6600;"><b> Serial</b></span>.<span style="color: #CC6600;">print</span>(card.errorCode(), <span style="color: #006699;">HEX</span>); putstring(<span style="color: #006699;">", "</span>); <span style="color: #CC6600;"><b> Serial</b></span>.<span style="color: #CC6600;">println</span>(card.errorData(), <span style="color: #006699;">HEX</span>); <span style="color: #CC6600;"> while</span>(1);
}
<span style="color: #CC6600;">void</span> <span style="color: #CC6600;"><b>setup</b></span>() { <span style="color: #7E7E7E;"> // set up serial port</span> <span style="color: #CC6600;"><b> Serial</b></span>.<span style="color: #CC6600;">begin</span>(9600); putstring_nl(<span style="color: #006699;">"WaveHC with 6 buttons"</span>); putstring(<span style="color: #006699;">"Free RAM: "</span>); <span style="color: #7E7E7E;">// This can help with debugging, running out of RAM is bad</span> <span style="color: #CC6600;"><b> Serial</b></span>.<span style="color: #CC6600;">println</span>(freeRam()); <span style="color: #7E7E7E;">// if this is under 150 bytes it may spell trouble!</span> <span style="color: #7E7E7E;"> // Set the output pins for the DAC control. This pins are defined in the library</span> <span style="color: #CC6600;"> pinMode</span>(2, <span style="color: #006699;">OUTPUT</span>); <span style="color: #CC6600;"> pinMode</span>(3, <span style="color: #006699;">OUTPUT</span>); <span style="color: #CC6600;"> pinMode</span>(4, <span style="color: #006699;">OUTPUT</span>); <span style="color: #CC6600;"> pinMode</span>(5, <span style="color: #006699;">OUTPUT</span>); <span style="color: #7E7E7E;"> // pin13 LED</span> <span style="color: #CC6600;"> pinMode</span>(13, <span style="color: #006699;">OUTPUT</span>); <span style="color: #7E7E7E;"> // enable pull-up resistors on switch pins (analog inputs)</span> <span style="color: #CC6600;"> digitalWrite</span>(14, <span style="color: #006699;">HIGH</span>); <span style="color: #CC6600;"> digitalWrite</span>(15, <span style="color: #006699;">HIGH</span>); <span style="color: #CC6600;"> digitalWrite</span>(16, <span style="color: #006699;">HIGH</span>); <span style="color: #CC6600;"> digitalWrite</span>(17, <span style="color: #006699;">HIGH</span>); <span style="color: #CC6600;"> digitalWrite</span>(18, <span style="color: #006699;">HIGH</span>); <span style="color: #CC6600;"> digitalWrite</span>(19, <span style="color: #006699;">HIGH</span>); <span style="color: #7E7E7E;"> // if (!card.init(true)) { //play with 4 MHz spi if 8MHz isn't working for you</span> <span style="color: #CC6600;"> if</span> (!card.init()) { <span style="color: #7E7E7E;">//play with 8 MHz spi (default faster!) </span> putstring_nl(<span style="color: #006699;">"Card init. failed!"</span>); <span style="color: #7E7E7E;">// Something went wrong, lets print out why</span> sdErrorCheck(); <span style="color: #CC6600;"> while</span>(1); <span style="color: #7E7E7E;">// then 'halt' - do nothing!</span> } <span style="color: #7E7E7E;"> // enable optimize read - some cards may timeout. Disable if you're having problems</span> card.partialBlockRead(<span style="color: #CC6600;">true</span>); <span style="color: #7E7E7E;">// Now we will look for a FAT partition!</span> uint8_t part; <span style="color: #CC6600;"> for</span> (part = 0; part < 5; part++) { <span style="color: #7E7E7E;">// we have up to 5 slots to look in</span> <span style="color: #CC6600;"> if</span> (vol.init(card, part)) <span style="color: #CC6600;"> break</span>; <span style="color: #7E7E7E;">// we found one, lets bail</span> } <span style="color: #CC6600;"> if</span> (part == 5) { <span style="color: #7E7E7E;">// if we ended up not finding one :(</span> putstring_nl(<span style="color: #006699;">"No valid FAT partition!"</span>); sdErrorCheck(); <span style="color: #7E7E7E;"> // Something went wrong, lets print out why</span> <span style="color: #CC6600;"> while</span>(1); <span style="color: #7E7E7E;">// then 'halt' - do nothing!</span> } <span style="color: #7E7E7E;"> // Lets tell the user about what we found</span> putstring(<span style="color: #006699;">"Using partition "</span>); <span style="color: #CC6600;"><b> Serial</b></span>.<span style="color: #CC6600;">print</span>(part, <span style="color: #006699;">DEC</span>); putstring(<span style="color: #006699;">", type is FAT"</span>); <span style="color: #CC6600;"><b> Serial</b></span>.<span style="color: #CC6600;">println</span>(vol.fatType(),<span style="color: #006699;">DEC</span>); <span style="color: #7E7E7E;">// FAT16 or FAT32?</span> <span style="color: #7E7E7E;"> // Try to open the root directory</span> <span style="color: #CC6600;"> if</span> (!root.openRoot(vol)) { putstring_nl(<span style="color: #006699;">"Can't open root dir!"</span>); <span style="color: #7E7E7E;">// Something went wrong,</span> <span style="color: #CC6600;"> while</span>(1); <span style="color: #7E7E7E;">// then 'halt' - do nothing!</span> } <span style="color: #7E7E7E;"> // Whew! We got past the tough parts.</span> putstring_nl(<span style="color: #006699;">"Ready!"</span>);
}
<span style="color: #CC6600;">void</span> playcomplete(<span style="color: #CC6600;">char</span> good) { <span style="color: #7E7E7E;"> // call our helper to find and play this name</span> playfile(<span style="color: #006699;">"GOOD.WAV"</span>); <span style="color: #CC6600;"> while</span> (wave.isplaying) { <span style="color: #7E7E7E;"> // do nothing while its playing</span> } <span style="color: #7E7E7E;"> // now its done playing</span>
}
<span style="color: #CC6600;">void</span> <span style="color: #CC6600;"><b>loop</b></span>() { <span style="color: #7E7E7E;"> //putstring("."); // uncomment this to see if the loop isnt running </span> <span style="color: #CC6600;"> switch</span> (check_switches()) { <span style="color: #7E7E7E;">//this is the loop which cycles the arnold sounds based</span> <span style="color: #CC6600;"> case</span> 1: <span style="color: #7E7E7E;">//on which switch you connect to.</span> playcomplete(<span style="color: #006699;">"STOP.WAV"</span>); <span style="color: #CC6600;"> break</span>; <span style="color: #CC6600;"> case</span> 2: playcomplete(<span style="color: #006699;">"SOB.WAV"</span>); <span style="color: #CC6600;"> break</span>; <span style="color: #CC6600;"> case</span> 3: playcomplete(<span style="color: #006699;">"DONT.WAV"</span>); <span style="color: #CC6600;"> break</span>; <span style="color: #CC6600;"> case</span> 4: playcomplete(<span style="color: #006699;">"LACK.WAV"</span>); <span style="color: #CC6600;"> break</span>; <span style="color: #CC6600;"> case</span> 5: playcomplete(<span style="color: #006699;">"FIST.WAV"</span>); }
}
<span style="color: #CC6600;">byte</span> check_switches()
{
<span style="color: #CC6600;"> static</span> <span style="color: #CC6600;">byte</span> previous[6]; <span style="color: #CC6600;"> static</span> <span style="color: #CC6600;">long</span> time[6]; <span style="color: #CC6600;"> byte</span> reading; <span style="color: #CC6600;"> byte</span> pressed; <span style="color: #CC6600;"> byte</span> index; pressed = 0;
<span style="color: #CC6600;"> for</span> (<span style="color: #CC6600;">byte</span> index = 0; index < 6; ++index) { reading = <span style="color: #CC6600;">digitalRead</span>(14 + index); <span style="color: #CC6600;"> if</span> (reading == <span style="color: #006699;">LOW</span> && previous[index] == <span style="color: #006699;">HIGH</span> && <span style="color: #CC6600;">millis</span>() - time[index] > DEBOUNCE) { <span style="color: #7E7E7E;"> // switch pressed</span> time[index] = <span style="color: #CC6600;">millis</span>(); pressed = index + 1; <span style="color: #CC6600;"> break</span>; } previous[index] = reading; } <span style="color: #7E7E7E;"> // return switch number (1 - 6)</span> <span style="color: #CC6600;"> return</span> (pressed);
}
<span style="color: #7E7E7E;">// Plays a full file from beginning to end with no pause.</span><span style="color: #CC6600;">void</span> playcomplete(<span style="color: #CC6600;">char</span> *name) { <span style="color: #7E7E7E;"> // call our helper to find and play this name</span> playfile(name); <span style="color: #CC6600;"> while</span> (wave.isplaying) { <span style="color: #7E7E7E;"> // do nothing while its playing</span> } <span style="color: #7E7E7E;"> // now its done playing</span>
}
<span style="color: #CC6600;">void</span> playfile(<span style="color: #CC6600;">char</span> *name) { <span style="color: #7E7E7E;"> // see if the wave object is currently doing something</span> <span style="color: #CC6600;"> if</span> (wave.isplaying) {<span style="color: #7E7E7E;">// already playing something, so stop it!</span> wave.<span style="color: #CC6600;">stop</span>(); <span style="color: #7E7E7E;">// stop it</span> } <span style="color: #7E7E7E;"> // look in the root directory and open the file</span> <span style="color: #CC6600;"> if</span> (!f.open(root, name)) { putstring(<span style="color: #006699;">"Couldn't open file "</span>); <span style="color: #CC6600;"><b>Serial</b></span>.<span style="color: #CC6600;">print</span>(name); <span style="color: #CC6600;">return</span>; } <span style="color: #7E7E7E;"> // OK read the file and turn it into a wave object</span> <span style="color: #CC6600;"> if</span> (!wave.create(f)) { putstring_nl(<span style="color: #006699;">"Not a valid WAV"</span>); <span style="color: #CC6600;">return</span>; } <span style="color: #7E7E7E;"> // ok time to play! start playback</span> wave.play();
}
</pre>