Introduction: LED House Numbers - Change Color Daily - Arduino Powered

This project started with a need for new house numbers.  I wanted something that lights up and realized there aren't many options out there.

Then I figured if I'm going to make them light up I might as well have them change color.  I decided to have them change color every night.

The important parts for this project are an Arduino and an LED strip.  I used the LPD8806 from Adafruit.  This strip is awesome.  It actually has a separate chip attached to each LED.  This allows you to do all kinds of cool lighting effects.  You could light up the numbers in rainbow colors.  Or you could have the colors swirl in a circle or pulsate.  Anything is possible.

If all you want are the numbers to change color you could just buy a basic RGB strip and use the Arduino and PWM to change colors.  It all depends on how fancy you want your numbers to look.

For now I've got them changing colors every night.  Next,  I'm thinking I'll add a random function so every night will be a surprise.




Step 1: Parts List

Here's what I used...

1.  Arduino Uno.  Any Arduino should work fine
2.  LED strip 1 meter.  I got this at Adafruit.  The model is LPD8806
4.  5v power supply.  Also from Adafruit
3.  Sheet of 1/4 inch ABS
4.  Sheet of 60% acrylic
5.  ABS cement
6.  3M double sided tape
6.  Caulk
7.  Misc wire
8.  Sheet of 1/4 inch MDF for back

Step 2: Cut Numbers From the ABS Sheet

This is probably the most important step since it dictates the whole look of the project.  I chose to have the plastic shop first cut the sheet into an an 18x12 rectangle and round the corners.  Then I found a local shop to cut the numbers out using a CNC router.  This was very affordable and gave it a professional look.

You could use a regular hand router and some templates, but I decided against this since I'm not very good with a router and knew it wouldn't come out nearly as polished.

Step 3: Attach the Translucent Sheet

The next step is to attach the translucent sheet onto the ABS sheet.  This acrylic is called 60%.  Which I believe means it let's 40% of the light through.  It's excellent at letting the light through but diffusing it enough so that you don't see the individual LED's.

To mount it I used heavy duty 3M double sided tape.  I love this stuff!  Since I bought it I've been using it for everything.  It's incredibly strong and way easier to work with than adhesives.  3M makes a lot of tape.  The model number I got was 5952.


Step 4: Build the Enclosure

Next it's time to build an enclosure so you can house the electronics.  To do this I cut some strips out of a separate ABS Sheet.  Then I glued them to the main sheet using ABS cement.

The good news is once the ABS cement dries it aint going anywhere.  Which is why I like working with ABS.

The bad news is you better work fast.  ABS cement dries fast!  Also, if you are ever going to follow instructions now's the time.  Either wear a mask or do this in a well ventilated area.  Of course, that's only if you want to keep your brain cells.

After gluing I clamped the strips to make sure they were tight.  The whole thing was solid in about an hour.

I also glued some small corner pieces so I'd have something to attach the back to.

Then I caulked around the edges to make it weather tight.

Step 5: Add Electronics

Now it's time to add all of the electronics.

I positioned the Arduino at the bottom near the hole so I could have access to the USB connection even after the unit was mounted.

Then I put the LED strip around the edge.

I mounted everything with, you guessed it, 3M tape.

Step 6: Add Back

For the back I just used a piece of MDF that I had laying around.  ABS would be more elegant but I ran out.

I just screwed it on and then caulked around the gap.  This essentially locks it closed but since I live in the Northwest I need it to be weather tight.

I added a wire for hanging and it's good to go.

Step 7: Arduino Code

The end result looks great.  The numbers are very bright and visible from across the street.  In fact they might be a little bright for some of the neighbors.

Below is the code I used for the Arduino Uno.  

I have never done any coding before playing around with the Arduino so I'm sure it's not perfect.  There are no doubt more elegant ways to get the same result but this works.

In the future I'm going to tweak the code to do things like add random colors or other color effects.  I could also add some code to account for the changes in daylight and daylight savings time.

For now the numbers light up every night with a different color.  And every morning they go off.

Here's the code:

//House Numbers Sketch
//the sketch starts by setting the time for Saturday at 18:00
//every night at 18:00 the lights will go on and display the
//color for the night
//every morning at 6:00 the lights will go off


#include "LPD8806.h"  //library for LPD8806 LED strip
#include "SPI.h"

int dataPin = 2;  
int clockPin = 3;

LPD8806 strip = LPD8806(32, dataPin, clockPin);

#include <Time.h>     //this is required to get time capabilities
#include <TimeAlarms.h>

void setup()


{

  // Start up the LED strip
  strip.begin();

  // Update the strip, to start they are all 'off'
  strip.show();


  Serial.begin(9600);
  setTime(18,00,0,1,1,11); // set time to Saturday 18:00 Jan 1 2011
  // create the alarms

  Alarm.alarmRepeat(dowSaturday,18,00,10,SaturdayOn);  // This sets the first alarm at 18:00:10 every Saturday

  Alarm.alarmRepeat(dowSunday,06,00,00,SundayOff);  // second alarm to turn lights off 6:00 AM


  Alarm.alarmRepeat(dowSunday,18,00,00,SundayOn); 

  Alarm.alarmRepeat(dowMonday,6,00,00,MondayOff); 


    Alarm.alarmRepeat(dowMonday,18,00,00,MondayOn); 

  Alarm.alarmRepeat(dowTuesday,6,00,00,TuesdayOff); 


    Alarm.alarmRepeat(dowTuesday,18,00,00,TuesdayOn); 

  Alarm.alarmRepeat(dowWednesday,6,00,00,WednesdayOff); 


    Alarm.alarmRepeat(dowWednesday,18,00,00,WednesdayOn); 

  Alarm.alarmRepeat(dowThursday,6,00,00,ThursdayOff); 


    Alarm.alarmRepeat(dowThursday,18,00,00,ThursdayOn); 

  Alarm.alarmRepeat(dowFriday,6,00,00,FridayOff); 


  Alarm.alarmRepeat(dowFriday,18,00,00,FridayOn); 

  Alarm.alarmRepeat(dowSaturday,6,00,00,SaturdayOff); 

}


void loop() {


  digitalClockDisplay();
  Alarm.delay(1000); // wait one second between clock display
}


// functions to be called when an alarm triggers:

void SaturdayOn(){
colorChase(strip.Color(0,127,127), 1000); //on Saturday turn alarm on and display this color
}

void SundayOff(){
colorChase(strip.Color(000,000,000), 1000); //on Sunday morning turn strip off
}


void SundayOn(){
colorChase(strip.Color(127,15,30), 1000);
}

void MondayOff(){
colorChase(strip.Color(000,000,000), 1000);
}


void MondayOn(){
colorChase(strip.Color(20,127,20), 1000);
}

void TuesdayOff(){
colorChase(strip.Color(000,000,000), 1000);
}



void TuesdayOn(){
colorChase(strip.Color(20,0,127), 1000);
}

void WednesdayOff(){
colorChase(strip.Color(000,000,000), 1000);
}


void WednesdayOn(){
colorChase(strip.Color(90,20,90), 1000);
}

void ThursdayOff(){
colorChase(strip.Color(000,000,000), 1000);
}


void ThursdayOn(){
colorChase(strip.Color(10,95,120), 1000);
}

void FridayOff(){
colorChase(strip.Color(000,000,000), 1000);
}

void FridayOn(){
colorChase(strip.Color(0,85,85), 1000);
}

void SaturdayOff(){
colorChase(strip.Color(000,000,000), 1000);
}


void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println();
}

void printDigits(int digits)
{
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}


// code for LED strip

void colorChase(uint32_t c, uint8_t wait) {
  int i;

  for (i=0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, 0);
  }

  for (i=0; i < strip.numPixels(); i++) {   
      strip.setPixelColor(i, c);               

      }
      strip.show();
      delay(wait);
  }