Description:
I was in the holiday mood and wanted to make a decoration for my home so I came up with this. I made the electronics box big enough any electronics you wish to use to light up the display should fix. I personally used a NeoPixel LED Strip with an Arduino Nano and a 9v battery. All the electronics actually came from the Alien3D Nov subscription box.

Print Details:
Printed using Hatchbox White PLA and Filacube Mint Blue, printed at .2mm layer height.

Print Settings and orientation:
Print all the layers flat, and the electronics lid. Print the box standing up. The front cover is printed with the top upside down on the bed. None of the parts should need supports.

Assembly:
I highly recommend to test your electronics before installing, and install the lights you will use first. There is am opening on the bottom to put the wires through to the electronics box.

I have included the code I used to make my lights fade between colors at the bottom of the post or you can visit:
https://adrianotiger.github.io/Neopixel-Effect-Generator/
and then you can create your own light effects.

Links:
PrusaPrinters:
https://www.prusaprinters.org/prints/48541-christmas-shadow-box-display

My Mini Factory:
https://www.myminifactory.com/object/3d-print-christmas-shadow-box-display-144844

Cults 3D:
https://cults3d.com/en/3d-model/art/3d-christmas-shadow-box-display

Support me on Patreon:

Become a Patron!

Follow me on Social Media:

Or if you would like to donate via Paypal:

#include <Adafruit_NeoPixel.h>

class Strip
{
public:
  uint8_t   effect;
  uint8_t   effects;
  uint16_t  effStep;
  unsigned long effStart;
  Adafruit_NeoPixel strip;
  Strip(uint16_t leds, uint8_t pin, uint8_t toteffects, uint16_t striptype) : strip(leds, pin, striptype) {
    effect = -1;
    effects = toteffects;
    Reset();
  }
  void Reset(){
    effStep = 0;
    effect = (effect + 1) % effects;
    effStart = millis();
  }
};

struct Loop
{
  uint8_t currentChild;
  uint8_t childs;
  bool timeBased;
  uint16_t cycles;
  uint16_t currentTime;
  Loop(uint8_t totchilds, bool timebased, uint16_t tottime) {currentTime=0;currentChild=0;childs=totchilds;timeBased=timebased;cycles=tottime;}
};

Strip strip_0(30, 10, 30, NEO_GRB + NEO_KHZ800);
struct Loop strip0loop0(2, false, 1);

//[GLOBAL_VARIABLES]

void setup() {

  //Your setup here:

  strip_0.strip.begin();
}

void loop() {

  //Your code here:

  strips_loop();
}

void strips_loop() {
  if(strip0_loop0() & 0x01)
    strip_0.strip.show();
}

uint8_t strip0_loop0() {
  uint8_t ret = 0x00;
  switch(strip0loop0.currentChild) {
    case 0: 
           ret = strip0_loop0_eff0();break;
    case 1: 
           ret = strip0_loop0_eff1();break;
  }
  if(ret & 0x02) {
    ret &= 0xfd;
    if(strip0loop0.currentChild + 1 >= strip0loop0.childs) {
      strip0loop0.currentChild = 0;
      if(++strip0loop0.currentTime >= strip0loop0.cycles) {strip0loop0.currentTime = 0; ret |= 0x02;}
    }
    else {
      strip0loop0.currentChild++;
    }
  };
  return ret;
}

uint8_t strip0_loop0_eff0() {
    // Strip ID: 0 - Effect: Fade - LEDS: 30
    // Steps: 3000 - Delay: 1
    // Colors: 2 (0.0.247, 255.255.255)
    // Options: duration=3000, every=1, 
  if(millis() - strip_0.effStart < 1 * (strip_0.effStep)) return 0x00;
  uint8_t r,g,b;
  double e;
  e = (strip_0.effStep * 1) / (double)3000;
  r = ( e ) * 255 + 0 * ( 1.0 - e );
  g = ( e ) * 255 + 0 * ( 1.0 - e );
  b = ( e ) * 255 + 247 * ( 1.0 - e );
  for(uint16_t j=0;j<30;j++) {
    if((j % 1) == 0)
      strip_0.strip.setPixelColor(j, r, g, b);
    else
      strip_0.strip.setPixelColor(j, 0, 0, 0);
  }
  if(strip_0.effStep >= 3000) {strip_0.Reset(); return 0x03; }
  else strip_0.effStep++;
  return 0x01;
}

uint8_t strip0_loop0_eff1() {
    // Strip ID: 0 - Effect: Fade - LEDS: 30
    // Steps: 3000 - Delay: 1
    // Colors: 2 (255.255.255, 0.10.255)
    // Options: duration=3000, every=1, 
  if(millis() - strip_0.effStart < 1 * (strip_0.effStep)) return 0x00;
  uint8_t r,g,b;
  double e;
  e = (strip_0.effStep * 1) / (double)3000;
  r = ( e ) * 0 + 255 * ( 1.0 - e );
  g = ( e ) * 10 + 255 * ( 1.0 - e );
  b = ( e ) * 255 + 255 * ( 1.0 - e );
  for(uint16_t j=0;j<30;j++) {
    if((j % 1) == 0)
      strip_0.strip.setPixelColor(j, r, g, b);
    else
      strip_0.strip.setPixelColor(j, 0, 0, 0);
  }
  if(strip_0.effStep >= 3000) {strip_0.Reset(); return 0x03; }
  else strip_0.effStep++;
  return 0x01;
}