Digitally addressable RGB LED strips are becoming more available and less expensive through hobbyist electronics stores and direct from factories in China, so it's time to update your holiday house lighting!
This project uses an Arduino to control strips of digitally addressable LEDs, and the idea is to put them up once, and then use different programs for each holiday throughout the year.
In a previous project, I added permanent analog LEDs. Those are good, but the whole strip is always the same color. With digital LEDs, you can do a lot more animation effects since each individual LED can be controlled.
There are many Instructables on using these LEDs - the main effort in this one was finding a way to easily mount them on the outside of the house, while still being able to remove them for repair, painting etc.
The LEDs used were strands of WS2812b LEDs, which is a combination of a 5050 RGB LED + a WS2811 controller chip in a single surface mount package. These are very bright LEDs! You can buy them in 5 meter strips, and they can come with a silicone jacket for waterproofing.
Programming them is easy with a few free Arduino libraries. For this one, I used the "Neopixel" code from Adafruit. FastSPI is another popular library.
One big caveat - this was not an easy project! The Arduino coding part is relatively easy, but there is a lot of soldering of connectors and planning involved. Also, the LEDs are somewhat sensitive to power fluctuations, and seem a bit prone to failure. Even with the precautions mentioned here and elsewhere, I still ended up taking down portions of the strings several times and eventually replacing about 10 of the individual LEDs. Now that they are up and working (so far!), they are very cool - much more interesting than those boring static lights! :-)
The main idea was to come up with a way to mount the LED Strips easily, be able to work on them as needed, and take them down for painting. So, I used some plastic molding as a backing to make the strips rigid, and cup hooks and screw eyes to mount them to the house. That way, each strip can be taken down as needed for any work.
Electronics and Wiring Parts
For my single story house, I decided to follow the roof line. So, it made sense to have a separate strip for each section of roof line, and on the longer runs, a couple of of the 8 foot strips end-to-end. Each strip can be taken down to make way for painting etc., or to work on the strip itself. This happens a lot since the LEDs do go bad from time to time (see the Troubleshooting section).
For the electrical wiring, the WS2812b LEDs have a +5V, Gnd, and a data line. Since the digital commands are passed down the data line from LED to LED and strip to strip, that wire needs to form one continuous circuit from the beginning to the end. You can still light up the LEDs in any order, but the single control line will connect them all.
Similarly, all the strips should have their ground wires connected to make sure the signal has the same ground reference across all the strips.
Since each strip needed to wired and tested individually, I used the same input connector for each strip, wired in the same way, even if not all the input pins were needed in normal operation. That way, I can pull and test any strip with the same signal and power connector from the Arduino controller. As mentioned before, I had a few bad LEDs, so I used this system a lot - highly recommended!
The WS27812b LED strips have three wires, and come with a variety of connectors. I ended up discarding all of those and using JST-M 4 conductor connectors on each strip. The lead-in connector only uses three of the wires for testing, and the fourth was sometimes used to bring power from the end to the start of the segment (or a separate 2 pin connector was used). Standardizing on three pin connectors would be fine too, and if I did this project again, I would probably do that, especially if the connectors had color coded wires to make wiring easier. The output connectors were wired differently for each strip - to match the power requirements for the subsequent strip.
For example, if one strip is at the end of a set on one power supply, and the next strip starts a new power supply, the output of the first strip would not connect the +5 wire across. The second strip would have a separate connector for power to come in, and also the main input connector would have the power line connected for testing only.
At the very beginning, use a small resistor in series with the signal wire from the Arduino - 200-500 ohms.
Make sure to use capacitors at the power supplies!
Generally, the female connectors are used as the input side of the strips.
So, all the ground wires for everything are connected together, and the data line runs between all the LEDs in order. The +5 lines should only be shared between sets of LEDs using that power supply - it is best to not cross the +5 lines between the power supplies since they are not all exactly the same voltage and can oppose each other a bit.
Getting enough power to all the LEDs is the hardest part of this project. Since each 5050 LED module can use 60 ma of current, 150 LEDs will draw up to 9 amps. 150 LEDs are what you would get with a single 5 meter LED strip with 30 LEDs per meter.
I highly recommend the Do It Yourself Christmas web site RGB power discussion for it's excellent coverage of power issues with LED lights for houses. I found it after I did my initial work, and it would have saved me a lot of time debugging the system. One key piece of advice is that you should be adding power every 50 LEDs or so since the voltage drop on the strips themselves is significant. I had some runs of up to 76 LEDs, which seemed OK. It might be good to test this before wiring everything up - use bright white (all LEDs on full) to test - see the Troubleshooting section for more info.
For longer runs, power will need to be added at a few places, even if it's from the same power supply as "power injection". Power Injection simply means running multiple wires from your power supply to sections of the LEDs to have less voltage drop than running the power through the strip itself. So, for 150 LEDs in three sets of 50, you can use a single 10 amp 5v supply, but should run power lines to the start, two middle sections (every 50 LEDs) and the end of that string. So, that is 4 power lines - each optimally using 18-2 wire, so it's a lot of wire and connectors. I chose to run those lines along the LEDs, adding connectors at the beginning and end of each strip so I could take them down easier. That was a lot of soldering, but the Deans style connectors are pretty easy to solder (wish I had them at the start!). There are some YouTube videos with demos on how to solder them. You could also run the power wires separately in longer runs independent of the strips. The strips would still be removable and testable individually.
So, you will see a mix of JST-M 2 and Deans style connectors in the photos since I switched in mid-project. I found the Deans style connectors easier to work with - easier to solder, and the polarity was obvious.
For my house, I only had a few locations where there were power outlets available, so I had to carefully plan out where the wall adapters were located and which LEDs they would supply. For my wiring then, I had power going in a couple directions, and the attached diagram shows where I ended up at the planning stage.
Since I had to add power over some long distances, the other technique is to use higher voltage wall adapters and DC to DC converters to convert the higher voltage to 5 volts right at the strips. This seemed to work well, and power injection was still used from the converter to the surrounding LEDs. One trick with the DC to DC converters is keeping them waterproof while allowing them to dissipate heat. I will try a pill bottle and see how it goes.
One other idea is to run separate power adapters or DC to DC converters for each set of 50 or so LEDs. The cost of the converters and power supplies would be lower since they would not need to handle as much power, but the wiring would likely end up being as complex.
The attached plans show what I was thinking before I started wiring, and what I ended up with.
The molding was attached to the eaves with screw eyes and cup hooks. That way, each segment can be taken down as needed for repair or to move for painting etc.
To mount the LED strips, I attached them to thin plastic molding to give them some rigidity. Each strip was cut to the proper length for the portion of the roof they were to go on. I kept them from touching each other since there will be connectors on each end.
The cup hooks go on the house at places that make sense - every few feet. I spray painted mine to match the house. I drilled pilot holes to make it easier to screw them in. Then you can hold the strip up and mark the locations in the bottom of the strip for the screw eyes. I drilled a small pilot hole at the marks (see pictures), and screwed the screw eyes in.
Now, you can cut the LED strips to match each plastic strip. The LED strips have certain locations with solder pads where they can be cut, so the plastic strips may be a bit long in some cases, which is not a big problem - barely noticeable that the LEDS have a small gap with so many lit up. I used zip ties every few inches (every three solder pads) to attach the LED strips to the plastic strips. You will need to solder connectors on the end, so don't put zip ties at the very end until you are done. Leaving a couple off for now will make the soldering easier, and you can add the end zip ties after the soldering is complete and the strip is tested.
Once all the connections were made and the LEDs tested, I used RTV silicone to seal up the ends of the strips.
I used water tight kitchen storage containers to hold the power adapters with holes drilled for the connectors to pass through. I sealed those holes with RTV silicone also.
I had a number of LEDs that did not work at all or had one color broken. I am not sure if it was inherent in the quality of the LEDs, or from bad voltages/signals in my system.
The first LED can burn out more often than others, especially if you are not using capacitors on the power supplies. If you have a bad LED, generally all LEDs after that one will not go on. To test this, power up just that strip, and use a breadboard jumper wire to connect the data out copper trace from the previous LED to the data input copper trace of the next LED. I pushed the jumper wire pins right through the silicone jacket to make these connections.
Sometimes, a lit LED does not pass the data, and needs to be replaced. Sometimes, the first dark LED is the one that needs to be replaced. By jumping the data line, you should be able to decide which case you have.
Once you have identified the LED to be replaced, cut the silicone jacket between the LEDs next to it - using the space between the LEDs will keep the LED clear when you glue the jacket back together. Cut out the LED at the cut marks - you will want the copper pads of the two surrounding LEDs on the strip to be cut so they are right at the edge so solder can bridge to them. Cut a new LED in the same way - with the copper right up to the edge. Then, solder a bridge for the three lines (+5, Gnd, and Data) to add the new LED to the string.
It is possible that UV light will affect the lifetime of the LEDs.
I had some power distribution issues. Although I spent time making sure I was not exceeding the 10 amps available with each adapter, there was more voltage drop in the wires than I expected.
One symptom for this issue is seeing some flashing lights in random colors in the string. A second, more subtle symptom of power issues is when you have the LEDs on at full white, and some of them seem more orange in color - typically near the end of a string.
One way to verify this as a power issue is to run the strips at low values or brightness for the LEDs, then try them at full brightness, including white. If the dimmer level works while the brighter flickers, then it's most likely a power issue. I also wrote a program to make the whole strip fade from zero to all colors full on in a slow loop to look for those effects.
If you have any of these issues, you will need to improve the power wires, or add more power supplies in the strings. If the power supply is relatively close (a few feet) to the set of LEDs, you can use power injection to help - see the planning step and links.
If the power supply needs to be farther away, you can use a higher voltage power supply and DC to DC converter to step the voltage down nearer to the LED strip.
I used a combination of these techniques to enable full white on my LED strips.
To control the strips, I used an Arduino. In my case, I had 500+ LEDs, so I needed an Arduino Mega to have enough memory to hold the RGB array (3 bytes per LED for the R, G, and B color byte values).
For the LED control, I used the Adafruit Neopixel library, and added a few new animation routines. The code is attached. The signal wires for the LED strip was connected to pin 6, and the ground wire needs to be connected with the Arduino for the signal reference. In addition, I just used the 5 volts from the strip to power the Arduino, so the Arduino is powered from the 5v pin.
There are other libraries like FastSPI and one from Pololu. There is also an Arduino code sample that only needs an Uno since it does not use an array.
You could also use a controller like the T-1000s and LED Edit, though I had a lot of trouble getting that working with the Java version on my machine, so I would not recommend that unless you like to tinker.
Now that I have the LEDs up, the real art is in the programming and animations!
Pulling out the Arduino, and downloading a new animation for each holiday can be a hassle, so you could add a panel of push buttons for each holiday. I have now posted another Instructable on how to make this project controllable from the web to make reprogramming easier.