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 : Pimp Your Pumpkin - An Arduino Jack-O-Lantern - Exhibition - Arduino Forum
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.
#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