Introduction: Animated LED Holiday Scene

About: A Maker since childhood with all the classic symptoms, a robot builder, and an Internet software CTO/Tech Product Manager.

This is a fun holiday project using digital LEDs to back-light a holiday scene. An Arduino runs the LED animations, so you can use different effects for each LED. By varying the distance of the LEDs from the backing, you can control the area that they cover.

The LEDs could be simply placed behind the printout of the scene, but by adding some foam core as backing and cutting out holes and shapes, you can control exactly where the light appears.

Step 1: Parts

The parts list is pretty simple:

  • Arduino Uno. The Uno is a big board relative to the size of this project, but will be behind the scene and out of view. The advantage is that it's very easy to use - no special drivers etc. which can be bedeviling to configure and use for the tiny boards. Also, there is a built-in 5v regulator capable of handling a few of the digital LEDs. There are official Unos, and clones that cost less.
  • (4) WS2812b LEDs on individual boards - you can use more or less as needed. The 5v regulator on the Uno can handle about 450 ma with USB and 650 ma with a power adapter or battery. The WS2812b LEDs consume about 60 ma when on full white, so 7 or less LEDs is totally safe. You can run more LEDs (Neopixel rings have 16 LEDs) if all the LEDs are not all on white at the same time. Adafruit sells these LEDs too - they call the WS2812 LEDs "Neopixels".
  • 22 gauge solid core wire - this can be inserted directly into the Arduino pins. Having three colors of this wire is helpful - red (+5), black (gnd), and one other color like yellow (data).
  • Hot melt glue, maybe scrap-booking tape, white glue etc.
  • You can use a 9v battery to power the scene, but since the digital LEDs draw a lot of power, it will only last about a day. So, a power adapter is recommended. Anything that powers an Arduino Uno is fine - 9v is common, or you can USB power.

Step 2: Building the Scene

The scene can be anything that you like. I was using this for the holidays, so I was looking for a few elements, like a tree that could have a separate star on top and couple characters to light up like Santa Claus and a reindeer like Rudolph. There are a lot of scenes of houses in the snow with trees too.

You need some kind of backing to stiffen the scene up while letting the light through. So, printing on card stock is not a great solution. I used foam core, and cut out parts of it to let specific LEDs light up specific areas nicely.

To figure out where to cut the foam core, I took the main image, flipped it horizontally, and glued it to the foam core. Then the desired areas can be cut out from that pattern.

For my pattern, I made small holes for Santa's nose and the tree star. I made bigger areas for the tree and the snowman. For the small holes, the LEDs will be right up against the backing. For the larger areas, the LEDs will be farther away to wash the areas. See the pictures in the next step for details on wiring.

After that, the main image print can be simply glued or taped to the front. My first prototype worked fine using white glue in sections, but I found the alignment of the holes a bit off on the second one. So, I added a bit of padding to the front image (and printed the image proportionally larger so it still lines up with the back). The new larger image wraps around the sides a bit, giving a cleaner look.

I tried both ink jet and color laser printed fronts. White glue seemed fine for both - smoothed it thin with my finger. For the color laser printed one, the colors are more vivid, but the white glue was slightly bumpy. I also tried double-sided scrap-booking tape to hold the front, and wrapped the edges over to the back and glued them with white glue. This approach yielded the best finish. The laser print edges, however, can get chipped, so I used a magic marker to touch those up. So, both work fine - the ink jet is easier, but looks less vivid. I also tried Mod Podge, and that worked well too.

Only glue or tape a small part first so you can check the alignment against a back light - once the small area is attached and lined up, you can glue/tape the rest.

The only other trick is that I had two large areas pretty close to each other, so I used some scrap foam core to make a divider between them. That also ended up acting like a stand to hold the scene. See the next step for pictures.

Step 3: Wiring and Mounting the LEDs

The LED modules are pretty straight forward to wire up. The +5 and Ground come directly from those pins on the Arduino, and the Data comes from digital pin 6 for my code - that is configurable in the code.

Cut 4" lengths of the 22 gauge wire in each of the three colors - 4 sets in all. Strip the ends very short for the LED connections - about 1/8". Tin the wires and LED pads first to make soldering them together easier. If the LED pads have through holes, you can skip them and just solder the wires on the back - I found that easier than soldering the wires through the holes.

For the first LED, make sure to use the data in pad - the LEDs do have a direction that you have to use. Input comes from the Arduino, and output goes to the next LED. So, for the first three wires, one end will connect to the Arduino - those can be stripped a bit longer - 1/4", and the other end goes to the first LED. After that, you can just solder them in a row - see the pictures.

If you want, you can plan out the location and wiring more closely - I just made them the same and bent the wires as needed.

The first LED after the Arduino is #0, then the second one is #1 etc - in order as you move away from the Arduino. The order is important for the program to make sure you light up the right ones with the right colors.

It may help a lot to load a test program in the Arduino and test it with each LED you solder.

After the LEDs are soldered, you can tape or glue them to the board for each part of the scene. The solid core wire makes the offset ones easy to place.

That's it! A sample program is attached, so you can see how to run multiple animations at the same time. If you make other designs, post them in the comments!

Here's the code I used, it can be improved, for sure!

/*****************************************************************************
 *
 *  holiday scene animation for WS2812b LEDs connected to pin 6
 *  4 LEDs: 0=tree star, 1=tree, 2=snowman, 3=santa nose
 *  11/15/2015 Carl F. Sutter
 *  
 *******************************************************************************/

#include <Adafruit_NeoPixel.h>  // support Adafruit!

#define LED_PIN 6
#define NUMPIXELS 4

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);


int nose_red = 30;       // current nose red color
int nose_red_min = 10;   // lowest red color for nose
int nose_red_max = 50;   // highest red color for nose
int nose_red_step = 1;   // step size for the nose color change
boolean nose_up = true;  // direction of nose color change - true=up, false=down - start on up


void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  randomSeed(analogRead(0));
} // setup


void loop() {
  // tree star - random twinkles
  if (random(4) == 0) {  // only change every 4 loops
    strip.setPixelColor(0, strip.Color(255, random(50,255), 0));
  }

  // tree body
  //strip.setPixelColor(1, strip.Color(0, random(100,155), 0));
  strip.setPixelColor(1, strip.Color(0, 100, 0));

  // snowman
  strip.setPixelColor(2, strip.Color(30, 30, 255));

  // santa nose
  if (nose_up) {
    nose_red += nose_red_step;
    if (nose_red > nose_red_max) {
      nose_red = nose_red_max;
      nose_up = false;
    }
  } else {
    nose_red -= nose_red_step;
    if (nose_red < nose_red_min) {
      nose_red = nose_red_min;
      nose_up = true;
    }
  }
  strip.setPixelColor(3, strip.Color(nose_red, 0, 0));
  
  strip.show();
  delay(40);
} // loop

Step 4: Taking It Further & Laser Cutting

Some ideas for extending this further:

  • Add Fiber Optics to light up things like stars - these can all go back to one or more LEDs to light up.
  • Add a small hobby servo to animate part of the scene - all easily controlled from the Arduino
  • The foam core front could be extended to make a box to hide the Arduino and wires

Laser cutting

I had some of these laser cut for a group project. The service said that foam core melted too much, so I tried Depron foam. That proved to be really hard to glue a sheet of paper to. So, I switched to Gator Foam board. This seems to work well for laser cutting and gluing the paper with Mod Podge glue. The laser file is attached.

Make It Glow! Contest

Participated in the
Make It Glow! Contest

Tech Contest

Participated in the
Tech Contest

Homemade Gifts Contest 2015

Participated in the
Homemade Gifts Contest 2015