///////////////////////////////////////////////////////////////////
// Propcicle's Arduino Code for Proton Pack and Wand Lights
// Feel free to use in your pack along with an Arduino Mega Board
// Developed October 2015 Rev 12
///////////////////////////////////////////////////////////////////
int arrayIndex = 0; //Index variable for powercell lights
int arrayEnd = 15; //Index limiter for powercell lights
int cyclo = 1; //Index variable for cyclotron lights
int powon = 25; //LED On delay for power up sequence, recommend setting to 25
int state = 0; //state = 0 for pack off, state = 1 for normal powercell cycle
int wandon = 0; //state for wand firing, 1 = shutdown sequence needs activated
int wandpass = 0; //state to only trigger wand on sound first time switch is activated
int arrayIndexW = 0; //Index variable for powercell lights
int arrayEndW = 12; //Index limiter for powercell lights
int dir = 1; //Wand light direction
int redPin = 5; //Define red RGB output pin
int greenPin = 6; //Define green RGB output pin
int bluePin = 7; //Define blue RGB output pin
int cycloP = 5; //Index variable for prpton stream firing
// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
unsigned long previousMillis = 0; // will store last time powercell LED was updated
unsigned long duration = 50; // interval at which to blink powercell (milliseconds)
unsigned long previousMillisP = 0; // will store last time LED was updated for proton stream firing
unsigned long durationP = 50; // interval at which to blink proton stream (milliseconds)
unsigned long previousMillisW = 0; // will store last time graph LED was updated
unsigned long durationW = 70; // interval at which to blink graph (milliseconds)
void setup() {
pinMode(1, INPUT); // Pack Power On - "Activate" Switch
pinMode(2, INPUT); // Vent Light On - Bottom Bar Graph Switch
pinMode(3, INPUT); // Fire the stream - "Intensify" button
pinMode(4, INPUT); // Start/Stop Song - Top Bar Graph Switch
pinMode(5, OUTPUT); // Proton Stream Output - red channel LED
pinMode(6, OUTPUT); // Proton Stream Output - green channel LED
pinMode(7, OUTPUT); // Proton Stream Output - blue channel LED
pinMode(8, OUTPUT); // Vent Light Output
pinMode(9, OUTPUT); // Wand LED 1
pinMode(10, OUTPUT); // Wand LED 2
pinMode(11, OUTPUT); // Wand LED 3
pinMode(12, OUTPUT); // Wand LED 4
pinMode(13, OUTPUT); // Wand LED 5
pinMode(14, OUTPUT); // Wand LED 6
pinMode(15, OUTPUT); // Wand LED 7
pinMode(16, OUTPUT); // Wand LED 8
pinMode(17, OUTPUT); // Wand LED 9
pinMode(18, OUTPUT); // Wand LED 10
pinMode(19, OUTPUT); // Wand LED 11
pinMode(20, OUTPUT); // Wand LED 12
pinMode(21, OUTPUT); // Wand LED 13
pinMode(22, OUTPUT); // Power Cell LED 1
pinMode(23, OUTPUT); // Power Cell LED 2
pinMode(24, OUTPUT); // Power Cell LED 3
pinMode(25, OUTPUT); // Power Cell LED 4
pinMode(26, OUTPUT); // Power Cell LED 5
pinMode(27, OUTPUT); // Power Cell LED 6
pinMode(28, OUTPUT); // Power Cell LED 7
pinMode(29, OUTPUT); // Power Cell LED 8
pinMode(30, OUTPUT); // Power Cell LED 9
pinMode(31, OUTPUT); // Power Cell LED 10
pinMode(32, OUTPUT); // Power Cell LED 11
pinMode(33, OUTPUT); // Power Cell LED 12
pinMode(34, OUTPUT); // Power Cell LED 13
pinMode(35, OUTPUT); // Power Cell LED 14
pinMode(36, OUTPUT); // Slow Blo light Output
pinMode(37, OUTPUT); // Clear Arco light Output - Alternate with Fwd Hat Light
pinMode(38, OUTPUT); // Fwd Hat Light Output - Alternate with Arco Light
pinMode(40, OUTPUT); // Rear Hat Light - constant on after startup
pinMode(42, OUTPUT); // State 1 - Powerup Active - Basic Trigger on AudioFX board T01.wav
pinMode(43, OUTPUT); // State 3 - Wand Fire Off - Basic Trigger on AudioFX board T03.wav
pinMode(44, OUTPUT); // State 2 - Normal Power Hum - Holding Loop Trigger on AudioFX board
pinMode(45, OUTPUT); // State 1 - Start Ghostbusters Song - Holding Loop Trigger on AudioFX board T00HOLDL.ogg
pinMode(46, OUTPUT); // State 3 - Pack Power off - Basic Trigger on AudioFX board T02.wav
pinMode(48, OUTPUT); // State 3 - Wand Fire - Holding Loop Trigger on AudioFX board T04HOLDL.wav
pinMode(49, OUTPUT); // Wand light on - Basic Trigger on AudioFX board T05.wav
pinMode(50, OUTPUT); // Cyclo Light LED 1
pinMode(51, OUTPUT); // Cyclo Light LED 2
pinMode(52, OUTPUT); // Cyclo Light LED 3
pinMode(53, OUTPUT); // Cyclo Light LED 4
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(14, LOW);
digitalWrite(15, LOW);
digitalWrite(16, LOW);
digitalWrite(17, LOW);
digitalWrite(18, LOW);
digitalWrite(19, LOW);
digitalWrite(20, LOW);
digitalWrite(21, LOW);
digitalWrite(42, HIGH); // Default State 1 - Powerup Active - Basic Trigger on AudioFX board T01.wav
digitalWrite(43, HIGH); // Default State 3 - Wand Fire Off - Basic Trigger on AudioFX board T03.wav
digitalWrite(44, HIGH); // Default State 2 - Normal Power Hum - Holding Loop Trigger on AudioFX board T06HOLDL.wav
digitalWrite(45, HIGH); // Default State 1 - Ghostbusters Song - Holding Loop Trigger on AudioFX board T00HOLDL.wav
digitalWrite(46, HIGH); // Default State 3 - Pack Power off - Basic Trigger on AudioFX board T02.wav
digitalWrite(48, HIGH); // Default State 3 - Wand Fire - Holding Loop Trigger on AudioFX board T04HOLDL.wav
digitalWrite(49, HIGH); // Wand light on - Basic Trigger on AudioFX board T05.wav
}
void loop()
{
// here is where you'd put code that needs to be running all the time.
unsigned long currentMillis; //Powercell time tracker
unsigned long elapsedMillis; //Powercell time tracker
unsigned long currentMillisP; //Proton Stream time tracker
unsigned long elapsedMillisP; //Proton Stream time tracker
unsigned long currentMillisW; //Wand time tracker
unsigned long elapsedMillisW; //Wand time tracker
//Code for pack on sequence
if (state == 0 && digitalRead(1) == LOW) //Initial Starting point
{
//Do nothing - all lights off
analogWrite(redPin, 255); //Turn off red channel of RGB
analogWrite(greenPin, 255); //Turn off green channel of RGB
analogWrite(bluePin, 255); //Turn off blue channel of RGB
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(14, LOW);
digitalWrite(15, LOW);
digitalWrite(16, LOW);
digitalWrite(17, LOW);
digitalWrite(18, LOW);
digitalWrite(19, LOW);
digitalWrite(20, LOW);
digitalWrite(21, LOW);
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(51, LOW);
digitalWrite(52, LOW);
digitalWrite(53, LOW);
digitalWrite(50, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
digitalWrite(38, LOW);
digitalWrite(40, LOW);
digitalWrite(42, HIGH);
digitalWrite(43, HIGH);
digitalWrite(44, HIGH);
digitalWrite(45, HIGH);
digitalWrite(46, HIGH);
digitalWrite(48, HIGH);
digitalWrite(49, HIGH);
digitalWrite(8, LOW);
state = 0;
cyclo = 0;
}
else if (state == 0 && digitalRead(1) == HIGH) //Startup Sequence
{
digitalWrite(42, LOW); //Powerup active
delay(50);
for (int y = 0; y < 14; y = y + 1) {
int x = 1; //Light Loop incrementor
for (int powled = 35; powled > 21 + y; powled = powled - x) {
digitalWrite(powled, HIGH);
delay(powon);
digitalWrite(powled, LOW);
}
digitalWrite(22 + y, HIGH);
}
digitalWrite(42, HIGH); //Powerup complete
state = 1;
}
else if (state == 1 && digitalRead(1) == HIGH) //Normal Running Sequence
{
//Code for turning on the next cyclo light
digitalWrite(40, HIGH); //Any light that is normally on during operation
switch (cyclo)
{
case 1:
digitalWrite(51, HIGH);
digitalWrite(37, HIGH);
digitalWrite(36, LOW);
break;
case 2:
digitalWrite(52, HIGH);
digitalWrite(38, HIGH);
digitalWrite(36, LOW);
break;
case 3:
digitalWrite(53, HIGH);
digitalWrite(38, HIGH);
digitalWrite(36, LOW);
break;
case 4:
digitalWrite(50, HIGH);
digitalWrite(37, HIGH);
digitalWrite(36, HIGH);
break;
default:
cyclo = 0;
}
//Main Code for incrementing Powercell lights
if (digitalRead(3) == HIGH && digitalRead(2) == HIGH) // Code to speed up Powercell cycles when firing
{ duration = 20;
digitalWrite(44, HIGH); // Turn off power hum
} else
{ duration = 50;
digitalWrite(44, LOW); // Turn on power hum
}
currentMillis = millis(); // capture current "time" for powercell cycle
// all time related variable are unsigned long
elapsedMillis = currentMillis - previousMillis; // see how much time has passed
if (elapsedMillis >= duration) { // time for next occurrence of event?
previousMillis = previousMillis + duration; // set up time for next occurrence of event
arrayIndex = arrayIndex + 1; // increment pointer
if (arrayIndex == arrayEnd) {
arrayIndex = 0; // reset to beginning
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
//delay(40); //Optional delay before starting lights again
switch (cyclo)
{
//Code for turning off the previous cyclo light
case 1:
digitalWrite(51, LOW);
digitalWrite(37, LOW);
digitalWrite(36, LOW);
break;
case 2:
digitalWrite(52, LOW);
digitalWrite(36, LOW);
break;
case 3:
digitalWrite(53, LOW);
digitalWrite(38, LOW);
digitalWrite(36, LOW);
break;
case 4:
digitalWrite(50, LOW);
cyclo = 0;
break;
}
cyclo = cyclo + 1;
}
// do action based on value stored at arrayIndex
// This cycles the powercell lights
digitalWrite(22 + arrayIndex, HIGH); //Check 21 or 22
} // end time check
if (state == 1 && digitalRead(4) == HIGH) //Song Activation Loop
{
digitalWrite(44, HIGH); //Normal Cycle Inactive
digitalWrite(45, LOW); //Start Song
delay(50);
}
else
{
digitalWrite(45, HIGH); //No song active
digitalWrite(42, HIGH);
digitalWrite(43, HIGH);
digitalWrite(46, HIGH);
digitalWrite(49, HIGH);
}
if (state == 1 && digitalRead(2) == HIGH && wandpass == 0) //Vent Light Activation Loop
{
digitalWrite(42, HIGH); //Startup Inactive
digitalWrite(43, HIGH); //Wand Stop Sound Inactive
digitalWrite(44, HIGH); //Normal Cycle Inactive
digitalWrite(46, HIGH); //Shutdown Inactive
digitalWrite(49, LOW); //Wand on Sound Active
digitalWrite(8, HIGH); //Turn on vent light
delay(200); //Delay for sound board to read input
wandpass = 1;
}
else if (state == 1 && digitalRead(2) == HIGH && wandpass == 1)
{
digitalWrite(8, HIGH); //Turn on vent light
digitalWrite(49, HIGH); //No vent startup sound
}
else
{
digitalWrite(8, LOW); //Turn off vent light
digitalWrite(49, HIGH); //No ent startup sound
wandpass = 0;
}
// Wand graph code
currentMillisW = millis(); // capture current "time" for wand graph
elapsedMillisW = currentMillisW - previousMillisW; // see how much time has passed
if (elapsedMillisW >= durationW) { // time for next occurrence of event?
previousMillisW = previousMillisW + durationW; // set up time for next occurrence of event
if (state == 1 && digitalRead(3) == HIGH) //Graph cycle when firing code
{
// firing bar graph cycle (middle sweep)
if (arrayIndexW == 5) {
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(14, LOW);
digitalWrite(15, LOW);
digitalWrite(16, LOW);
digitalWrite(17, LOW);
digitalWrite(18, LOW);
digitalWrite(19, LOW);
digitalWrite(20, LOW);
digitalWrite(21, LOW);
arrayIndexW = 0; // increment pointer
}
digitalWrite(15 - arrayIndexW, HIGH);
digitalWrite(16 + arrayIndexW, HIGH);
arrayIndexW = arrayIndexW + 1; // increment pointer
}
// normal bar graph cycle (up-down-repeat)
if (state == 1 && digitalRead(3) == LOW && dir == 1 && arrayIndexW != arrayEndW) {
//arrayIndexW = 0; // reset to beginning
digitalWrite(9 + arrayIndexW, HIGH);
arrayIndexW = arrayIndexW + 1; // increment pointer
}
if (arrayIndexW == arrayEndW) {
dir = 0;
}
if (arrayIndexW == 0) {
dir = 1;
}
if (state == 1 && digitalRead(3) == LOW && dir == 0 && arrayIndexW != 0) {
digitalWrite(9 + arrayIndexW, LOW);
arrayIndexW = arrayIndexW - 1; // increment pointer
}
} // end time check for graph code
if (state == 1 && digitalRead(2) == HIGH && digitalRead(3) == HIGH) //Proton Stream Activation Loop
{
digitalWrite(42, HIGH); //Startup Inactive
digitalWrite(43, HIGH); //Wand Stop Sound Inactive
digitalWrite(44, HIGH); //Normal Cycle Inactive
digitalWrite(46, HIGH); //Shutdown Inactive
digitalWrite(48, LOW); //Wand firing sound
wandon = 1;
switch (cycloP)
{
case 1: //red RGB
analogWrite(redPin, 0);
analogWrite(greenPin, 255);
analogWrite(bluePin, 255);
break;
case 2: //white RGB
analogWrite(redPin, 0);
analogWrite(greenPin, 0);
analogWrite(bluePin, 0);
break;
case 3: //blue RGB
analogWrite(redPin, 255);
analogWrite(greenPin, 255);
analogWrite(bluePin, 0);
break;
case 4: //purple RGB
analogWrite(redPin, 175);
analogWrite(greenPin, 255);
analogWrite(bluePin, 175);
break;
case 5: //aqua RGB
analogWrite(redPin, 255);
analogWrite(greenPin, 0);
analogWrite(bluePin, 0);
break;
case 6: //turn off RGB
analogWrite(redPin, 255);
analogWrite(greenPin, 255);
analogWrite(bluePin, 255);
break;
default:
cycloP = 0;
}
currentMillisP = millis(); // capture current "time" for powercell cycle
// all time related variable are unsigned long
elapsedMillisP = currentMillisP - previousMillisP; // see how much time has passed
if (elapsedMillisP >= durationP) { // time for next occurrence of event?
previousMillisP = previousMillisP + durationP; // set up time for next occurrence of event
cycloP = cycloP + 1;
}
} // end loop
else {
analogWrite(redPin, 255); //Turn off red channel of RGB
analogWrite(greenPin, 255); //Turn off green channel of RGB
analogWrite(bluePin, 255); //Turn off blue channel of RGB
digitalWrite(48, HIGH); //Wand fire sound off
if (wandon == 1)
{
digitalWrite(43, LOW); //Wand fire out sound on - need to trigger only on first pass through
delay(51); // Time delay to trigger Audio FX board
digitalWrite(43, HIGH); //Wand fire out sound off
wandon = 0;
}
}
}
else if (state == 1 && digitalRead(1) == LOW) //Turn all Lights off - initiate power down sequence
{
digitalWrite(42, HIGH); //Startup Inactive
digitalWrite(44, HIGH); //Normal Cycle Inactive
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, HIGH);
digitalWrite(27, HIGH);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
digitalWrite(30, HIGH);
digitalWrite(31, HIGH);
digitalWrite(32, HIGH);
digitalWrite(33, HIGH);
digitalWrite(34, HIGH);
digitalWrite(35, HIGH);
digitalWrite(51, HIGH);
digitalWrite(52, HIGH);
digitalWrite(53, HIGH);
digitalWrite(50, HIGH);
delay(100);
digitalWrite(46, LOW); //Shutdown Active Sound
delay(150);
digitalWrite(46, HIGH);
for (int y = 14; y > -1; y = y - 1) {
int x = 1; //Light Loop incrementor
for (int powled = 35; powled > 21 + y; powled = powled - x) {
//digitalWrite(powled, HIGH);
delay(powon - 10);
digitalWrite(powled, LOW);
}
digitalWrite(22 + y, LOW);
}
digitalWrite(42, HIGH); // All sounds off
digitalWrite(43, HIGH);
digitalWrite(44, HIGH);
digitalWrite(45, HIGH);
digitalWrite(46, HIGH);
digitalWrite(48, HIGH);
digitalWrite(49, HIGH);
digitalWrite(22, LOW); // All lights off
digitalWrite(23, LOW);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(51, LOW);
digitalWrite(52, LOW);
digitalWrite(53, LOW);
digitalWrite(50, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
digitalWrite(38, LOW);
digitalWrite(40, LOW);
state = 0;
cyclo = 0;
}
}
This Post Contains Spoilers