My Christmas light display for 2016 is a definite improvement from what I had in 2015. I didn't meet my goal of having lights synchronised to music (which I'll explain below), but I succeeded in putting together a reliable animation sequence using LED strips powered by an Arduino.
You can see the video below:
I was looking through an Arduino blog post titled "12 Dazzling Holiday Light Displays With Arduino" one morning, and I was pleasantly surprised to find my lights included in the list!
I was really proud of myself for getting a display working with LED strips. I failed plenty of times along the way, but I got there in the end. I'm utilising the FastLED library, which does a lot of the heavy lifting for me.
My wiring is far from perfect, but it's a whole lot more robust than last year's efforts. I've learned a lot from this experience, and I think next year's lights will be even more reliable. I've had just one cable-related issue with this year's lights.
I really wanted to have full sequencing working for this year's lights. I actually made a fair amount of progress down this road. I had my LED sequencing software essentially working, and I could drive LED strips just fine. The main thing I had to figure out was how to turn those bytes of data into a kickass show.
After some experimentation, I started down the path of using one Arduino Due to drive all of my LED strips. The Arduino would read the animation data from an SD card and spit it out as needed. There were some downfalls with this approach, but I didn't even get far enough to consider solving those.
A Problem Of Distance
My display is using cheap-and-nasty UCS1903 LED strips. They generally do the job fine, but the data signal does not handle long distances very well. Even with optimal placement of my Arduino Due (which would expose it to the elements), the distance between the Due and the farthest LED strips was so great that the signal degraded to the point that the LED strips didn't even recognise it.
This issue stumped me, and extinguished the flame that was my enthusiasm for the project. I didn't touch it for quite some time. Eventually, I decided I still wanted something for this Christmas, and that something is what you can see in the video above.
Whilst I was building my compromise project, I came across the wonders of the ESP8266. The ESP8266 (more accurately, the ESP8266-based boards such as the ESP-01) are a Wi-Fi enabled microcontroller that pack quite a bit of processing power inside a tiny form factor for a very small price.
I ordered a few of these from eBay and played around with them. I realised that these chips could make my Christmas light dreams a reality. My sequencing software would contain a UDP server that could be polled by 8266 boards to get animation data and feed it to the LED strips. This approach works nicely for a few reasons:
- The 8266 controllers can be situated right next to the LED strips, so long as they're within range of the Wi-Fi signal.
- The server design means that the 8266 chips don't need to worry about synchronising data, and can tolerate dropped packets and even a network dropout.
This is what I'm working now, and will (hopefully) be the subject of various blog posts throughout the next year.
Until then, I'm happy with what I've been able to pull off for 2016.