Introduction: Arduino Christmas Light Controller

If you liked this instructable, consider checking out my new website www.TheSiliconJunkie.com

You've probably seen all those videos where people make there christmas lights dance to music, you think to your self wow that looks realy cool.... i could never do that. WELL... you can the idea is actually quite simple.
WHATS A RELAY?
a relay is a component that can be used to control large amounts of voltage or current with just a small voltage, it does this by using that small voltage (5 volts in our case) to create a magnetic feild that will pull a switch type object to connect the larger current (120 volts in our case). Image 2 is a diagram on how a relay works





Step 1: Supplies

• 1x Arduino
• 1x Protoshield/ breadboard
8x 5v DC relays »»»  search.digikey.com/scripts/DkSearch/dksus.dll
• 8x 1N4004 diodes »»» search.digikey.com/scripts/DkSearch/dksus.dll
• 8x 2N2222 transistors »»» search.digikey.com/scripts/DkSearch/dksus.dll
• 8x 1K (Brown,Black,Red) ohm resistor (radio shack)
• 1x double/single sided PCB (radioshack)
• 1x sharpie
• 16x nuts and bolts (discuss size later)
• 8x dead sets of lights (for there male plugs)
• 500 ft of 5 strand cable
• a set of connector things
• some wire and some other stuff that you should have
• a place to display your light show
• and a some what knowledge of making pcb's

LETS BEGIN SHALL WE


Step 2:

Once you have all your parts i started out by testing one relay on a bread board
1. Put all the components in acourding to the scematic (image 1)
2. Open the arduino program and goto open>digital>Blink
3. Upload it to your arduino
4. Connect where it says arduino pin on the schematic to digital pin 13

if all works well then its time to multiply that by 8 on a pcb

Step 3: Making the PCB

sorry this step isnt to detailed because i forgot to take pictures but heres my best

BRAIN STORM:
I started by jotting down some idea patterns on some paper heres what i came up with (image 1)

DRILL THE HOLES:
then i placed each component on the pcb and marked it on the pcb. Then i drilled all the holes
IMPORTANT: KEEP IN MIND WHICH SIDE HAS THE COMPONENTS ON IT AND WHICH SIDE HAS THE TRACES

CONNECT THE DOTS:
Once all the holes are drilled it just a simple game of connect the dots. Do this with your sharpie it must be a "Sharpie" sharpie not some no name brand because i tested 3 types of markers 2 no names and the sharpie, the no namers ink bubbled up during the etching process (not a good thing). Also make sure to color in the lines dark, and your 5 volt and GND traces a little thicker than the others.

ETCHING TIME:
Once you are done drawing your lines and are satisfied with it. Get a tuperware bowl and some etchant solution and etch your board, keeping an eye on it so it doesnt over etch. When its done take it out and clean off all the excess acid and use some nail polish remover or rubbing alcohol to clean off all the sharpie.

SOLDER IN THE COMPONENTS:
Before i started soldering i took some 800 grit sand paper and sanded down the copper a little so it was clean, that way the solder sticks to it alot better. Now just place the components and solder them in one at a time. (image 2)

WIRING:
I chose to use a "weaving" method to reduce tension on the solder joints, which so far has seemed to work great. (image 3,4)

Step 4: Wire Up Your Display

For my display i chose these 8 trees in my yard. (image 1) You can pick what ever you want as long as the arduino can somehow be inside and warm. For me the best option was to put him in the garage. I went to home depot and bought some 5 strand sprinkler wire cause it was on sale for $24 for 500ft. (image 2). Since your setup probable woulnt be the same as mine ill just show you how wire on each plug.

1) Get 8 dead christmass lights and cut off the female plug (image 4)
2) Get all the supplies in image 5
3) Layout the cable the way you want it
4) Find where your gonna put the plug to connect the tree into and using the knife cut open the casing
5) Pull out the ground (for me its WHITE) and cut it in half, strip both ends and connect both sides of the ground to one wire on the plug using a crimp connector.
6) Do the same thing for the colored wire which is the power coming into the tree. (image 6)
7) Tape up the connectors nicely (image 7)
8) Fold the wires nicely against the cable and tape it again (image 8)

Once done it should look like image 9. Now just do that to all the trees.

Step 5: Bringing It All Together

Once all the plugs are connected and you have every going to where it needs to be, we need to connect each tree to the pcb.

1) i used some wire from the dead lights to connect all the positives on the pcb (image 1)
2) get the crimp connectors and connect some onto the wires coming from the trees like (image 2) leave the white be for now
3) connect those wires to the pcb in the correct order
4) i took an old exstention cord and cut the cord off and connected one end to the 120v input on the pcb and the other to the 2 whites
5) lastly connect the arduino up to the pcb (image 3)
6) tape up those connection and store it somewhere safe
7) upload the Joy To The World code, and see if it works. if so GREAT!!!! if not, not good. if you cant figure out the problem post a comment and ill try my best at helping you.

Joy To The World code:

int tree1 = 6;
int tree2 = 7;
int tree3 = 8;
int tree4 = 9;
int tree5 = 2;
int tree6 = 3;
int tree7 = 4;
int tree8 = 5;
int s = 150;
int ds = 225;
int e = 300;
int de = 450;
int q = 600;
int dq = 900;
int h = 1200;
int dh = 1800;
int start;
int end;
int time;

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 loop()
{
  start = millis();
  digitalWrite(tree1, HIGH);
  digitalWrite(tree8, HIGH);
  delay(q);
  digitalWrite(tree1, LOW);
  digitalWrite(tree8, LOW);

  digitalWrite(tree2, HIGH);
  digitalWrite(tree7, HIGH);
  delay(de);
  digitalWrite(tree2, LOW);
  digitalWrite(tree7, LOW);

  digitalWrite(tree3, HIGH);
  digitalWrite(tree6, HIGH);
  delay(s);
  digitalWrite(tree3, LOW);
  digitalWrite(tree6, LOW);

  digitalWrite(tree4, HIGH);
  digitalWrite(tree5, HIGH);
  delay(1050);
  digitalWrite(tree4, LOW);
  digitalWrite(tree5, LOW);

  digitalWrite(tree1, HIGH);
  digitalWrite(tree8, HIGH);
  delay(s);
  digitalWrite(tree1, LOW);
  digitalWrite(tree8, LOW);

  digitalWrite(tree2, HIGH);
  digitalWrite(tree7, HIGH);
  delay(q);
  digitalWrite(tree2, LOW);
  digitalWrite(tree7, LOW);

  digitalWrite(tree3, HIGH);
  digitalWrite(tree6, HIGH);
  delay(q);
  digitalWrite(tree3, LOW);
  digitalWrite(tree6, LOW);

  digitalWrite(tree4, HIGH);
  digitalWrite(tree5, HIGH);
  delay(dq);
  digitalWrite(tree4, LOW);
  digitalWrite(tree5, LOW);

  digitalWrite(tree1, HIGH);
  digitalWrite(tree2, HIGH);
  digitalWrite(tree7, HIGH);
  digitalWrite(tree8, HIGH);
  delay(e);
  digitalWrite(tree1, LOW);
  digitalWrite(tree2, LOW);
  digitalWrite(tree7, LOW);
  digitalWrite(tree8, LOW);

  digitalWrite(tree2, HIGH);
  digitalWrite(tree3, HIGH);
  digitalWrite(tree6, HIGH);
  digitalWrite(tree7, HIGH);
  delay(dq);
  digitalWrite(tree2, LOW);
  digitalWrite(tree3, LOW);
  digitalWrite(tree6, LOW);
  digitalWrite(tree7, LOW);

  digitalWrite(tree1, HIGH);
  digitalWrite(tree2, HIGH);
  digitalWrite(tree7, HIGH);
  digitalWrite(tree8, HIGH);
  delay(e);
  digitalWrite(tree1, LOW);
  digitalWrite(tree2, LOW);
  digitalWrite(tree7, LOW);
  digitalWrite(tree8, LOW);

  digitalWrite(tree3, HIGH);
  digitalWrite(tree4, HIGH);
  digitalWrite(tree5, HIGH);
  digitalWrite(tree6, HIGH);
  delay(dq);
  digitalWrite(tree3, LOW);
  digitalWrite(tree4, LOW);
  digitalWrite(tree5, LOW);
  digitalWrite(tree6, LOW);

  digitalWrite(tree1, HIGH);
  digitalWrite(tree2, HIGH);
  digitalWrite(tree7, HIGH);
  digitalWrite(tree8, HIGH);
  delay(e);
  digitalWrite(tree1, LOW);
  digitalWrite(tree2, LOW);
  digitalWrite(tree7, LOW);
  digitalWrite(tree8, LOW);

  digitalWrite(tree1, HIGH);
  digitalWrite(tree2, HIGH);
  digitalWrite(tree3, HIGH);
  digitalWrite(tree4, HIGH);
  digitalWrite(tree5, HIGH);
  digitalWrite(tree6, HIGH);
  digitalWrite(tree7, HIGH);
  digitalWrite(tree8, HIGH);
  delay(dq);
  digitalWrite(tree1, LOW);
  digitalWrite(tree2, LOW);
  digitalWrite(tree3, LOW);
  digitalWrite(tree4, LOW);
  digitalWrite(tree5, LOW);
  digitalWrite(tree6, LOW);
  digitalWrite(tree7, LOW);
  digitalWrite(tree8, LOW);

  digitalWrite(tree8, HIGH);
  delay(e);
  digitalWrite(tree8, LOW);

  digitalWrite(tree1, HIGH);
  delay(e);
  digitalWrite(tree1, LOW);

  digitalWrite(tree7, HIGH);
  delay(e);
  digitalWrite(tree7, LOW);  

  digitalWrite(tree2, HIGH);
  delay(e);
  digitalWrite(tree2, LOW);

  digitalWrite(tree6, HIGH);
  delay(e);
  digitalWrite(tree6, LOW);

  digitalWrite(tree3, HIGH);
  delay(de);
  digitalWrite(tree3, LOW);

  digitalWrite(tree5, HIGH);
  delay(s);
  digitalWrite(tree5, LOW);
 
  digitalWrite(tree4, HIGH);
  delay(e);
  digitalWrite(tree4, LOW);
 
  digitalWrite(tree8, HIGH);
  delay(e);
  digitalWrite(tree8, LOW);

  digitalWrite(tree1, HIGH);
  delay(e);
  digitalWrite(tree1, LOW);

  digitalWrite(tree7, HIGH);
  delay(e);
  digitalWrite(tree7, LOW);  

  digitalWrite(tree2, HIGH);
  delay(e);
  digitalWrite(tree2, LOW);

  digitalWrite(tree6, HIGH);
  delay(e);
  digitalWrite(tree6, LOW);

  digitalWrite(tree3, HIGH);
  delay(de);
  digitalWrite(tree3, LOW);

  digitalWrite(tree5, HIGH);
  delay(s);
  digitalWrite(tree5, LOW);
 
  digitalWrite(tree4, HIGH);
  delay(e);
  digitalWrite(tree4, LOW);
 
  digitalWrite(tree2, HIGH);
  digitalWrite(tree7, HIGH);
  delay(e);
  digitalWrite(tree2, LOW);
  digitalWrite(tree7, LOW);
 
  digitalWrite(tree1, HIGH);
  digitalWrite(tree8, HIGH);
  delay(e);
  digitalWrite(tree1, LOW);
  digitalWrite(tree8, LOW);
 
  digitalWrite(tree2, HIGH);
  digitalWrite(tree7, HIGH);
  delay(e);
  digitalWrite(tree2, LOW);
  digitalWrite(tree7, LOW);
 
  digitalWrite(tree1, HIGH);
  digitalWrite(tree8, HIGH);
  delay(e);
  digitalWrite(tree1, LOW);
  digitalWrite(tree8, LOW);
 
  digitalWrite(tree2, HIGH);
  digitalWrite(tree7, HIGH);
  delay(75);
  digitalWrite(tree2, LOW);
  digitalWrite(tree7, LOW);
 
  digitalWrite(tree3, HIGH);
  digitalWrite(tree6, HIGH);
  delay(75);
  digitalWrite(tree3, LOW);
  digitalWrite(tree6, LOW);
 
  digitalWrite(tree4, HIGH);
  digitalWrite(tree5, HIGH);
  delay(dq);
  digitalWrite(tree4, LOW);
  digitalWrite(tree5, LOW);
 
  digitalWrite(tree4, HIGH);
  digitalWrite(tree5, HIGH);
  delay(75);
  digitalWrite(tree4, LOW);
  digitalWrite(tree5, LOW);
 
  digitalWrite(tree3, HIGH);
  digitalWrite(tree6, HIGH);
  delay(75);
  digitalWrite(tree3, LOW);
  digitalWrite(tree6, LOW);
 
  digitalWrite(tree4, HIGH);
  digitalWrite(tree5, HIGH);
  delay(e);
  digitalWrite(tree4, LOW);
  digitalWrite(tree5, LOW);
 
  digitalWrite(tree3, HIGH);
  digitalWrite(tree6, HIGH);
  delay(e);
  digitalWrite(tree3, LOW);
  digitalWrite(tree6, LOW);
 
  digitalWrite(tree4, HIGH);
  digitalWrite(tree5, HIGH);
  delay(e);
  digitalWrite(tree4, LOW);
  digitalWrite(tree5, LOW);
 
  digitalWrite(tree3, HIGH);
  digitalWrite(tree6, HIGH);
  delay(75);
  digitalWrite(tree3, LOW);
  digitalWrite(tree6, LOW);
 
  digitalWrite(tree2, HIGH);
  digitalWrite(tree7, HIGH);
  delay(75);
  digitalWrite(tree2, LOW);
  digitalWrite(tree7, LOW);
 
  digitalWrite(tree1, HIGH);
  digitalWrite(tree8, HIGH);
  delay(dq);
  digitalWrite(tree1, LOW);
  digitalWrite(tree8, LOW);
 
  digitalWrite(tree1, HIGH);
  digitalWrite(tree2, HIGH);
  digitalWrite(tree7, HIGH);
  digitalWrite(tree8, HIGH);
  delay(75);
  digitalWrite(tree1, LOW);
  digitalWrite(tree2, LOW);
  digitalWrite(tree7, LOW);
  digitalWrite(tree8, LOW);
 
  digitalWrite(tree2, HIGH);
  digitalWrite(tree3, HIGH);
  digitalWrite(tree6, HIGH);
  digitalWrite(tree7, HIGH);
  delay(75);
  digitalWrite(tree2, LOW);
  digitalWrite(tree3, LOW);
  digitalWrite(tree6, LOW);
  digitalWrite(tree7, LOW);
 
  digitalWrite(tree3, HIGH);
  digitalWrite(tree4, HIGH);
  digitalWrite(tree5, HIGH);
  digitalWrite(tree6, HIGH);
  delay(e);
  digitalWrite(tree3, LOW);
  digitalWrite(tree4, LOW);
  digitalWrite(tree5, LOW);
  digitalWrite(tree6, LOW);
 
  digitalWrite(tree1, HIGH);
  digitalWrite(tree2, HIGH);
  digitalWrite(tree3, HIGH);
  digitalWrite(tree4, HIGH);
  digitalWrite(tree5, HIGH);
  digitalWrite(tree6, HIGH);
  digitalWrite(tree7, HIGH);
  digitalWrite(tree8, HIGH);
  delay(q);
  digitalWrite(tree1, LOW);
  digitalWrite(tree2, LOW);
  digitalWrite(tree3, LOW);
  digitalWrite(tree4, LOW);
  digitalWrite(tree5, LOW);
  digitalWrite(tree6, LOW);
  digitalWrite(tree7, LOW);
  digitalWrite(tree8, LOW);
 
  digitalWrite(tree1, HIGH);
  digitalWrite(tree8, HIGH);
  delay(e);
  digitalWrite(tree1, LOW);
  digitalWrite(tree8, LOW);
 
  digitalWrite(tree2, HIGH);
  digitalWrite(tree7, HIGH);
  delay(de);
  digitalWrite(tree2, LOW);
  digitalWrite(tree7, LOW);
 
  digitalWrite(tree3, HIGH);
  digitalWrite(tree6, HIGH);
  delay(s);
  digitalWrite(tree3, LOW);
  digitalWrite(tree6, LOW);
 
  digitalWrite(tree4, HIGH);
  digitalWrite(tree5, HIGH);
  delay(e);
  digitalWrite(tree4, LOW);
  digitalWrite(tree5, LOW);
 
  digitalWrite(tree3, HIGH);
  digitalWrite(tree6, HIGH);
  delay(e);
  digitalWrite(tree3, LOW);
  digitalWrite(tree6, LOW);
 
  digitalWrite(tree2, HIGH);
  digitalWrite(tree7, HIGH);
  delay(q);
  digitalWrite(tree2, LOW);
  digitalWrite(tree7, LOW);
 
  digitalWrite(tree1, HIGH);
  digitalWrite(tree8, HIGH);
  delay(q);
  digitalWrite(tree1, LOW);
  digitalWrite(tree8, LOW);
 
  digitalWrite(tree1, HIGH);
  digitalWrite(tree2, HIGH);
  digitalWrite(tree3, HIGH);
  digitalWrite(tree4, HIGH);
  digitalWrite(tree5, HIGH);
  digitalWrite(tree6, HIGH);
  digitalWrite(tree7, HIGH);
  digitalWrite(tree8, HIGH);
  delay(h);
  digitalWrite(tree1, LOW);
  digitalWrite(tree2, LOW);
  digitalWrite(tree3, LOW);
  digitalWrite(tree4, LOW);
  digitalWrite(tree5, LOW);
  digitalWrite(tree6, LOW);
  digitalWrite(tree7, LOW);
  digitalWrite(tree8, LOW);
  delay(20000);
 
  end = millis();
  time = end - start;
  Serial.println(time);
}