#include #include #include #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 //Constants #define buttonPin 7 #define fire 6 #define small_blue 16 #define big_blue 17 #define lights_left 18 #define lights_right 19 //Variables int buttonState = 0; // variable for reading the pushbutton status int count=0; int count1=1; unsigned long current_time=0; unsigned long last_played=0; // 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; putstring("\n\rSD I/O error: "); Serial.print(card.errorCode(), HEX); putstring(", "); Serial.println(card.errorData(), HEX); while(1); } void setup() { // set up serial port Serial.begin(9600); putstring("Free RAM: "); // This can help with debugging, running out of RAM is bad Serial.println(freeRam()); // if this is under 150 bytes it may spell trouble! // 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); // Set the output pins for the lights pinMode(fire, OUTPUT); pinMode(small_blue, OUTPUT); pinMode(big_blue, OUTPUT); pinMode(lights_left, OUTPUT); pinMode(lights_right, OUTPUT); pinMode(buttonPin, INPUT); //Turn lights on when Arduino is turned on //digitalWrite(fire, HIGH); digitalWrite(small_blue, HIGH); //digitalWrite(big_blue, HIGH); digitalWrite(lights_left, HIGH); digitalWrite(lights_right, HIGH); // if (!card.init(true)) { //play with 4 MHz spi if 8MHz isn't working for you if (!card.init()) { //play with 8 MHz spi (default faster!) putstring_nl("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 :( putstring_nl("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 putstring("Using partition "); Serial.print(part, DEC); putstring(", type is FAT"); Serial.println(vol.fatType(),DEC); // FAT16 or FAT32? // Try to open the root directory if (!root.openRoot(vol)) { putstring_nl("Can't open root dir!"); // Something went wrong, while(1); // then 'halt' - do nothing! } // Whew! We got past the tough parts. putstring_nl("Ready!"); } //----------------------------------------------------------------------------------------- void loop() { buttonState = digitalRead(buttonPin); current_time=millis(); if (((current_time - last_played)>300000)) { counter(); count++; switch (count){ case 1: digitalWrite(fire, HIGH); digitalWrite(small_blue, HIGH); digitalWrite(big_blue, LOW); digitalWrite(lights_left, LOW); digitalWrite(lights_right, HIGH); break; case 2: digitalWrite(fire, LOW); digitalWrite(small_blue, HIGH); digitalWrite(big_blue, HIGH); digitalWrite(lights_left, LOW); digitalWrite(lights_right, HIGH); break; case 3: digitalWrite(fire, HIGH); digitalWrite(small_blue, LOW); digitalWrite(big_blue, HIGH); digitalWrite(lights_left, LOW); digitalWrite(lights_right, LOW); count=0; break; } } if (buttonState == HIGH) { switch (count1) { case 1: //Remote Controlled Delorean Scene digitalWrite(fire, LOW); digitalWrite(small_blue, HIGH); digitalWrite(big_blue, LOW); digitalWrite(lights_left, HIGH); digitalWrite(lights_right, LOW); playfile("REMOTE~1.WAV"); delay(51000); timetravel(); counter(); break; case 2: //Lybians! playfile("THELYB~1.WAV"); digitalWrite(fire, LOW); digitalWrite(small_blue, HIGH); digitalWrite(big_blue, LOW); digitalWrite(lights_left, HIGH); digitalWrite(lights_right, LOW); counter(); break; case 3: //Don't Need Roads playfile("ROADS.WAV"); digitalWrite(big_blue, LOW); digitalWrite(small_blue, LOW); digitalWrite(lights_right, LOW); digitalWrite(fire, LOW); digitalWrite(lights_left, HIGH); delay(14000); digitalWrite(big_blue, HIGH); counter(); break; case 4: //This is a hold up playfile("THISAH~1.WAV"); digitalWrite(fire, LOW); digitalWrite(small_blue, LOW); digitalWrite(big_blue, LOW); digitalWrite(lights_left, LOW); digitalWrite(lights_right, HIGH); counter(); break; case 5: //Lybian Chase Scene digitalWrite(lights_right, LOW); playfile("LYBIAN~1.WAV"); digitalWrite(fire, LOW); digitalWrite(small_blue, HIGH); digitalWrite(big_blue, LOW); digitalWrite(lights_left, HIGH); digitalWrite(lights_right, LOW); delay(20000); timetravel(); counter(); break; case 6: //Plutonium playfile("PLUTON~1.WAV"); digitalWrite(fire, LOW); digitalWrite(small_blue, HIGH); digitalWrite(big_blue, LOW); digitalWrite(lights_left, HIGH); digitalWrite(lights_right, LOW); counter(); break; case 7: //BOILER playfile("THEBOI~1.WAV"); digitalWrite(fire, LOW); digitalWrite(small_blue, LOW); digitalWrite(big_blue, LOW); digitalWrite(lights_left, LOW); digitalWrite(lights_right, HIGH); counter(); break; case 8: //Great Scott playfile("GREATS~1.WAV"); digitalWrite(fire, LOW); digitalWrite(small_blue, HIGH); digitalWrite(big_blue, LOW); digitalWrite(lights_left, HIGH); digitalWrite(lights_right, LOW); counter(); break; case 9: //It's Destroyed playfile("ITSDES~.WAV"); digitalWrite(fire, LOW); digitalWrite(small_blue, LOW); digitalWrite(big_blue, LOW); digitalWrite(lights_left, LOW); digitalWrite(lights_right, HIGH); counter(); break; case 10: //Don't Worry playfile("DONTWO~1.WAV"); digitalWrite(fire, HIGH); digitalWrite(small_blue, HIGH); digitalWrite(big_blue, LOW); digitalWrite(lights_left, HIGH); digitalWrite(lights_right, LOW); counter(); break; case 11: //Bojo playfile("YOUBOJO.WAV"); digitalWrite(fire, LOW); digitalWrite(small_blue, LOW); digitalWrite(big_blue, HIGH); digitalWrite(lights_left, HIGH); digitalWrite(lights_right, LOW); counter(); break; case 12: //Butt Head playfile("LOOKINAT.WAV "); counter(); break; case 13: //Theme Song playfile("BTTFTH~1.WAV"); theme(); break; } } } //============================================================================================ // 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(); } //---------------------------------------------------------------------------- void timetravel() { for (int i=0; i <= 23; i++){ digitalWrite(small_blue, HIGH); delay(75); digitalWrite(small_blue, LOW); digitalWrite(big_blue, HIGH); delay(75); digitalWrite(big_blue, LOW); digitalWrite(lights_left, HIGH); delay(75); digitalWrite(lights_left, LOW); } //Fade fire in for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { // sets the value (range from 0 to 255): analogWrite(fire, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(30); } } //------------------------------------------------------------------ void theme() { digitalWrite(fire, LOW); digitalWrite(small_blue, LOW); digitalWrite(big_blue, LOW); digitalWrite(lights_left, LOW); digitalWrite(lights_right, LOW); delay(3200); fade(); fade(); fade(); fade(); delay(4000); for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { // sets the value (range from 0 to 255): analogWrite(fire, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(30); } digitalWrite(big_blue, HIGH); delay(2000); digitalWrite(lights_right, HIGH); delay(5500); for(int fadeValue = 0 ; fadeValue <= 3; fadeValue +=1) { circle(); delay(100); } //fade fire out for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=10) { // sets the value (range from 0 to 255): analogWrite(fire, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(30); } digitalWrite(fire, LOW); digitalWrite(lights_right, HIGH); delay(2000); digitalWrite(big_blue, HIGH); delay(1000); for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { // sets the value (range from 0 to 255): analogWrite(fire, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(30); } all_off(); delay(3000); digitalWrite(lights_right, HIGH); delay(3000); digitalWrite(big_blue, HIGH); delay(3000); digitalWrite(lights_left, HIGH); delay(3000); fade(); digitalWrite(big_blue, LOW); fade(); digitalWrite(lights_left, LOW); fade(); digitalWrite(lights_right, LOW); fade(); fade(); delay(12000); digitalWrite(lights_right, HIGH); delay(4000); digitalWrite(lights_left, HIGH); delay(4000); digitalWrite(fire, HIGH); delay(3500); all_off(); delay(17500); all_on(); delay(9000); for(int fadeValue = 0 ; fadeValue <= 3; fadeValue +=1) { circle(); delay(100); } delay(3000); digitalWrite(lights_right, HIGH); delay(2000); digitalWrite(big_blue, HIGH); delay(2000); digitalWrite(lights_left, HIGH); delay(5500); for(int fadeValue = 0 ; fadeValue <= 5; fadeValue +=1) { circle(); delay(100); } all_on(); while (wave.isplaying) { // do nothing while its playing } digitalWrite(small_blue, LOW); digitalWrite(big_blue, LOW); digitalWrite(lights_left, LOW); digitalWrite(lights_right, LOW); // fade out for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { // sets the value (range from 0 to 255): analogWrite(fire, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(50); } digitalWrite(lights_left, HIGH); digitalWrite(lights_right, HIGH); counter(); } //----------------------------------------------------------------------- void fade() { for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { // sets the value (range from 0 to 255): analogWrite(fire, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(50); } // fade out for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { // sets the value (range from 0 to 255): analogWrite(fire, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(50); } } //----------------------------------------------------------------------- void circle() { digitalWrite(fire, LOW); digitalWrite(small_blue, LOW); digitalWrite(big_blue, LOW); digitalWrite(lights_left, LOW); digitalWrite(lights_right, HIGH); delay(100); digitalWrite(lights_right, LOW); digitalWrite(lights_left, HIGH); delay(100); digitalWrite(fire, HIGH); digitalWrite(lights_left, LOW); } //-------------------------------------------------------------------------------- void counter() { if (count1==13){ count1=0; } while (wave.isplaying) { // do nothing while its playing } count1++; last_played=millis(); } //-------------------------------------------------------------------------------- void all_off() { digitalWrite(fire, LOW); digitalWrite(small_blue, LOW); digitalWrite(big_blue, LOW); digitalWrite(lights_left, LOW); digitalWrite(lights_right, LOW); } //-------------------------------------------------------------------------------- void all_on() { digitalWrite(fire, HIGH); digitalWrite(small_blue, HIGH); digitalWrite(big_blue, HIGH); digitalWrite(lights_left, HIGH); digitalWrite(lights_right, HIGH); }