Introduction: Arduino Christmas Light With Music Sync

I came across two great instructables and decided to combine them.  https://www.instructables.com/id/Arduino-Christmas-Light-Controller/  takes eight lines of lights and uses code on the Arduino to "play" "Joy To The World".  I tested it using LEDs, and it is very accurate.  I wanted to make this project, but I wanted to have the lights synchronized to music.  So, I took a look at https://www.instructables.com/id/Yet-Another-Daft-Punk-Coffee-TableDisplay/.  It takes musical input and uses it to trigger a sequence of patterns on an LED matrix.  So, I followed the steps in the first project and added the musical input from the second.  Then, I modified the code to work with the eight trees of lights (see code below).  The good thing about this project is if you can't get the synchronization portion to work, you can still use what you have built to run the original Arduino Christmas Light Controller project.  I included two drawings -- the first is the copper trails of the PCB.  These are not to scale.  As the author of the first project pointed out, you use an etching permanent marker to draw the trails.  I recommend drilling the holes for the chip and relays first.  I found that I needed to erase with rubbing alcohol and re-draw some of the trails after drilling.  The second drawing is the component side of the board. 


#define SENSOR_PIN A0 // analog input pin for music
//void showScenario(int);
// trigger next scenario when music amplitude > threshold
// increase threshold to decrease sensitivity
// decrease threshold to increase sensitivity
int threshold = 5;
// debouncing - filter out consecutive triggers that are too close
// together to slow down the animation.  decrease this value
// to make it more sensitive to shorter beat intervals
int minBeatInterval = 1000;
int threshCrossed = 0;
int scenario = 1;
int cnt = 32768;
int tree1 = 6;
int tree2 = 7;
int tree3 = 8;
int tree4 = 9;
int tree5 = 2;
int tree6 = 3;
int tree7 = 4;
int tree8 = 5;
void setup()
{
pinMode(tree1, OUTPUT);
pinMode(tree2, OUTPUT);
pinMode(tree3, OUTPUT);
pinMode(tree4, OUTPUT);
pinMode(tree5, OUTPUT);
pinMode(tree6, OUTPUT);
pinMode(tree7, OUTPUT);
pinMode(tree8, OUTPUT);
digitalWrite(tree1,HIGH);
delay(1000);
digitalWrite(tree2,HIGH);
delay(1000);
digitalWrite(tree3,HIGH);
delay(1000);
digitalWrite(tree4,HIGH);
delay(1000);
digitalWrite(tree5,HIGH);
delay(1000);
digitalWrite(tree6,HIGH);
delay(1000);
digitalWrite(tree7,HIGH);
delay(1000);
digitalWrite(tree8,HIGH);
delay(1000);
digitalWrite(tree1,LOW);
digitalWrite(tree2,LOW);
digitalWrite(tree3,LOW);
digitalWrite(tree4,LOW);
digitalWrite(tree5,LOW);
digitalWrite(tree6,LOW);
digitalWrite(tree7,LOW);
digitalWrite(tree8,LOW);
Serial.begin(9600);
}
void showScenario(int s){
int theScenario;
theScenario = s;
 if (theScenario == 1){
digitalWrite(tree1, LOW);
digitalWrite(tree8, LOW);
digitalWrite(tree1, HIGH);
digitalWrite(tree3, HIGH);
}
if (theScenario == 2){
digitalWrite(tree1, LOW);
digitalWrite(tree3, LOW);
digitalWrite(tree6, HIGH);
digitalWrite(tree8, HIGH);
}
if (theScenario == 3){
digitalWrite(tree6, LOW);
digitalWrite(tree8, LOW);
digitalWrite(tree3, HIGH);
digitalWrite(tree4, HIGH);
}
if (theScenario == 4){
digitalWrite(tree3, LOW);
digitalWrite(tree4, LOW);
digitalWrite(tree5, HIGH);
digitalWrite(tree6, HIGH);  
}
if (theScenario == 5)
{digitalWrite(tree5, LOW);
digitalWrite(tree6, LOW);
digitalWrite(tree3, HIGH);
digitalWrite(tree4, HIGH);
}
if (theScenario == 6){
digitalWrite(tree3, LOW);
digitalWrite(tree4, LOW);
digitalWrite(tree5, HIGH);
digitalWrite(tree6, HIGH);  
}
if (theScenario == 7){
digitalWrite(tree5, LOW);
digitalWrite(tree6, LOW);
digitalWrite(tree1, HIGH);
digitalWrite(tree3, HIGH);
}
if (theScenario == 8){
digitalWrite(tree1, LOW);
digitalWrite(tree3, LOW);
digitalWrite(tree2, HIGH);
digitalWrite(tree4, HIGH); 
}
if (theScenario == 9){
digitalWrite(tree2, LOW);
digitalWrite(tree4, LOW);
digitalWrite(tree3, HIGH);
digitalWrite(tree5, HIGH); 
}
if (theScenario == 10){
digitalWrite(tree3, LOW);
digitalWrite(tree5, LOW);
digitalWrite(tree4, HIGH);
digitalWrite(tree6, HIGH);
}
if (theScenario == 11){
digitalWrite(tree4, LOW);
digitalWrite(tree6, LOW);
digitalWrite(tree5, HIGH);
digitalWrite(tree7, HIGH); 
}
if (theScenario == 12){
digitalWrite(tree5, LOW);
digitalWrite(tree7, LOW);
digitalWrite(tree6, HIGH);
digitalWrite(tree8, HIGH);
}
if (theScenario == 13){
digitalWrite(tree6, LOW);
digitalWrite(tree8, LOW);
digitalWrite(tree1, HIGH);
digitalWrite(tree4, HIGH);  
}
if (theScenario == 14){
digitalWrite(tree1, LOW);
digitalWrite(tree4, LOW);
digitalWrite(tree5, HIGH);
digitalWrite(tree8, HIGH);
}
if (theScenario == 15){
digitalWrite(tree5, LOW);
digitalWrite(tree8, LOW);
digitalWrite(tree2, HIGH);
digitalWrite(tree4, HIGH); 
}
if (theScenario == 16){
digitalWrite(tree2, LOW);
digitalWrite(tree4, LOW);
digitalWrite(tree5, HIGH);
digitalWrite(tree7, HIGH);
}
if (theScenario == 17){
digitalWrite(tree5, LOW);
digitalWrite(tree7, LOW);
digitalWrite(tree1, HIGH);
}
if (theScenario == 18){
digitalWrite(tree1, LOW);
digitalWrite(tree2, HIGH);
}
if (theScenario == 19){
digitalWrite(tree2, LOW);
digitalWrite(tree3, HIGH);
}
if (theScenario == 20){
digitalWrite(tree3, LOW);
digitalWrite(tree2, HIGH);
digitalWrite(tree4, HIGH);
}
if (theScenario == 21){
digitalWrite(tree2, LOW);
digitalWrite(tree4, LOW);
digitalWrite(tree3, HIGH);
}
if (theScenario == 22){
digitalWrite(tree3, LOW);
digitalWrite(tree4, HIGH);
}
if (theScenario == 23){
digitalWrite(tree4, LOW);
digitalWrite(tree3, HIGH);
digitalWrite(tree5, HIGH); 
}
if (theScenario == 24){
digitalWrite(tree3, LOW);
digitalWrite(tree5, LOW);
digitalWrite(tree4, HIGH);
}
if (theScenario == 25){
digitalWrite(tree4, LOW);
digitalWrite(tree5, HIGH);
}
if (theScenario == 26){
digitalWrite(tree5, LOW);
digitalWrite(tree4, HIGH);
digitalWrite(tree6, HIGH); 
}
if (theScenario == 27){
digitalWrite(tree4, LOW);
digitalWrite(tree6, LOW);
digitalWrite(tree5, HIGH);
}
if (theScenario == 28){
digitalWrite(tree5, LOW);
digitalWrite(tree6, HIGH);
}
if (theScenario == 29){
digitalWrite(tree6, LOW);
digitalWrite(tree5, HIGH);
digitalWrite(tree7, HIGH); 
}
if (theScenario == 30){
digitalWrite(tree5, LOW);
digitalWrite(tree7, LOW);
digitalWrite(tree6, HIGH);
}
if (theScenario == 31){
digitalWrite(tree6, LOW);
digitalWrite(tree7, HIGH);
}
if (theScenario == 32){
digitalWrite(tree7, LOW);
digitalWrite(tree8, HIGH); 
}
if (theScenario == 33){
digitalWrite(tree8, LOW);
digitalWrite(tree4, HIGH);
digitalWrite(tree5, HIGH); 
}
if (theScenario == 34){
digitalWrite(tree4, LOW);
digitalWrite(tree5, LOW);
digitalWrite(tree3, HIGH);
digitalWrite(tree6, HIGH); 
}
if (theScenario == 35){
digitalWrite(tree3, LOW);
digitalWrite(tree6, LOW);
digitalWrite(tree2, HIGH);
digitalWrite(tree7, HIGH); 
}
if (theScenario == 36){
digitalWrite(tree2, LOW);
digitalWrite(tree7, LOW);
digitalWrite(tree1, HIGH);
digitalWrite(tree8, HIGH); 
}
if (theScenario == 37){
digitalWrite(tree1, LOW);
digitalWrite(tree8, LOW);
digitalWrite(tree4, HIGH);
digitalWrite(tree5, HIGH); 
}
if (theScenario == 38){
digitalWrite(tree4, LOW);
digitalWrite(tree5, LOW);
digitalWrite(tree3, HIGH);
digitalWrite(tree6, HIGH); 
}
if (theScenario == 39){
digitalWrite(tree3, LOW);
digitalWrite(tree6, LOW);
digitalWrite(tree2, HIGH);
digitalWrite(tree7, HIGH); 
}
if (theScenario == 40){
digitalWrite(tree2, LOW);
digitalWrite(tree7, LOW);
digitalWrite(tree1, HIGH);
digitalWrite(tree8, HIGH); 
}
}void loop() {
int sensorValue = analogRead(SENSOR_PIN);
cnt++;
if (sensorValue > threshold) {
if (!threshCrossed && (cnt > minBeatInterval) ) {
showScenario(scenario);
scenario++;
}
if (scenario > 40){
scenario = 1;

threshCrossed = 1;
cnt = 0;

if (sensorValue < threshold){
threshCrossed = 0;
}
}