Go Down

Topic: Pimp Your Pumpkin - An Arduino Jack-O-Lantern 2.0 (Read 767 times) previous topic - next topic

DCrosby

Oct 06, 2013, 08:36 am Last Edit: Nov 01, 2013, 04:26 am by DCrosby Reason: 1
I followed the original how-to, to get prepared for this year's celebration and did a couple things different, and added others.

Original Article is here : http://forum.arduino.cc/index.php?PHPSESSID=loe4mbup8sh2f9cumiac1482t6&topic=8476.15

This is a true "HALLOWEEN(c) Pumpkin" as it plays John Crpenters Haloween theme when mad / activated.

It uses the same orange / red led's for activation. It does use a PIR  Motion Sensor, which I found at my local electronics supply shop. I used about $13 incl. sensor and wires, not including the Arduino Board. I as of right now don't have a pumpkin, as I'll wait a bit closer to the date, but will see if my wife has a plastic one to test drive, and I'll make a small video.

For Right now here's the source.

Code: [Select]
#include "pitches.h"
int ledPin = 13;                // choose the pin for the LED
int inputPin = 8;                // choose the input pin (for PIR sensor)
int candle = 4;
int mad = 2;
int musicPin = 10;
int pirState = LOW;             // we start, assuming no motion detected
int val = 0;                     // variable for reading the pin status
int flickerInterval = 25;
long yellowTimer = 0;
long redTimer = 0;

//Halloween Theme
int melody[] = {NOTE_CS6,NOTE_FS5,NOTE_FS5,NOTE_CS6,NOTE_FS5,NOTE_FS5,NOTE_CS6,NOTE_D5,NOTE_FS5,
               NOTE_CS6,NOTE_FS5,NOTE_FS5,NOTE_CS6,NOTE_FS5,NOTE_FS5,NOTE_CS6,NOTE_D5,NOTE_FS5,
               NOTE_C6,NOTE_F5,NOTE_F5,NOTE_C6,NOTE_F5,NOTE_F5,NOTE_C6,NOTE_F5,NOTE_CS5,NOTE_F5,
               NOTE_C6,NOTE_F5,NOTE_F5,NOTE_C6,NOTE_F5,NOTE_F5,NOTE_C6,NOTE_F5,NOTE_CS5,NOTE_F5,
               NOTE_B5,NOTE_E5,NOTE_E5,NOTE_B5,NOTE_E5,NOTE_E5,NOTE_B5,NOTE_E5,NOTE_C6,NOTE_E5,
               NOTE_B5,NOTE_E5,NOTE_E5,NOTE_B5,NOTE_E5,NOTE_E5,NOTE_B5,NOTE_E5,NOTE_C6,NOTE_E5};
int noteDurations[] = {4,4,4,4,4,4,4,4,4,
                      4,4,4,4,4,4,4,4,4,
                      4,4,4,4,4,4,4,4,4,4,
                      4,4,4,4,4,4,4,4,4,4,
                      4,4,4,4,4,4,4,4,4,4,
                      4,4,4,4,4,4,4,4,4,4};

void setup() {
 pinMode(ledPin, OUTPUT);      // declare LED as output
 pinMode(inputPin, INPUT);     // declare sensor as input
 pinMode(candle, OUTPUT);
 pinMode(mad, OUTPUT);
 //Serial.begin(9600);
 noTone(musicPin);  
}

void loop(){
 val = digitalRead(inputPin);  // read input value
 unsigned long curMil = millis();
 if (val == HIGH) {            // check if the input is HIGH    
   digitalWrite(ledPin, HIGH);  // turn LED ON
   noTone(musicPin);
   //Play Music
   // iterate over the notes of the melody:
   for (int thisNote = 0; thisNote < 58; thisNote++) {
     // to calculate the note duration, take one second
     // divided by the note type.
     //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
     int noteDuration = 1000/noteDurations[thisNote];
     tone(musicPin, melody[thisNote],noteDuration);
 
     // to distinguish the notes, set a minimum time between them.
     // the note's duration + 30% seems to work well:
     int pauseBetweenNotes = noteDuration * 1.30;
     delay(pauseBetweenNotes);
     // stop the tone playing:
     noTone(musicPin);
     digitalWrite(candle, LOW);
     digitalWrite(mad, HIGH);        
   }    
   if (pirState == LOW) {      
     // we have just turned on      
       
     //Serial.println("Motion detected!");
     // We only want to print on the output change, not state      
     pirState = HIGH;
     
     }    
   } else {
     digitalWrite(ledPin, LOW); // turn LED OFF
     unsigned long currentMillis = millis();
     noTone(musicPin);    
     if (pirState == HIGH){                
       // we have just turned off
       //Serial.println("Motion ended!");
       // We only want to print on the output change, not state
       pirState = LOW;      
       digitalWrite(mad, LOW);        
     }
     if(currentMillis - yellowTimer > flickerInterval)
       {
                   yellowTimer = currentMillis;
                   analogWrite(candle, random(0, 256));
       }
       
   }
}


I had some issues I wanted to have it play the song, regardless how long it was, and so I added a sizeof statement into the play music loop, it ended up not working so I copied the comma separated list into a spreadsheet had it count the indexes and manually populated the number. Very frustration, if I used the sizeof statement it would always buzz at the end... very annoying. So I may still have some unnecessary  noTone(musicPin);'s in there due to my paranoia of buzzing the house to death.

NOTE: pitches.h can be found here : http://arduino.cc/en/Tutorial/tone   at the bottom of the page.

YouTube Video
http://youtu.be/o_4Sf_cfjAY

Go Up