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