Introduction: Color Changing Nightlight - Arduino Microcontroller

So, instead of buying a nightlight for my kid's room, I decided I could do a much better job of it. This nightlight cycles through 1500 colors over 7 mins and turns on when it is dark and turns off when it is light. It is also small enough into small objects to add effect. Items needed are:

Arduino Microcontroller or equivalent                          (used a Mapleleaf for this)
RBG HB LED common cathode                                   (this one is COM-09264 from sparkfun.com)
Photoresistor                                                                    (this one is from Radioshack, any will do)
10k ohm Resistor

Step 1: Setup Arduino

First create a voltage divider with the photoresistor and the 10k resistor. You can choose any ADC pin, I used 20. I also connected the photoresistor to VCC and 10k to ground. If you choose to swap those, it will change your threshold values and inequalities in your if statements. You can see the configuration in the picture. I didn't install current restricting resistors on the RGB LED because this microcontroller doesn't source much current, but if you may not be that lucky, read the spec sheet for the LED to see current values. The reason I'm crossing the board with the resistor and LED is because many of the grounds on this board were not working.

Step 2: Programming

Here is the program if used, you may have to changes sometimes to adapt it to your microcontroller.

/*
NightLight
*/

int sensorValue = 0;  // Variable to store the value coming from the photoresistor
int ledPin1 = 0; // Connect an LED to PWM pin 0
int ledPin2 = 1;        // '' pin 1
int ledPin3 = 2; // '' pin 2
int fadeValue2 = 0; // Variable for fading 2 colors at once
int threshold = 850; // Threshold value for the photoresistor
void lightup(void);


void setup() {
    pinMode(20, INPUT_ANALOG); // Setup pin 20 to read a voltage
    pinMode(ledPin1, PWM);   // setup the pin as PWM
    pinMode(ledPin2, PWM);
    pinMode(ledPin3, PWM);
}

void loop() {
    sensorValue = analogRead(20); // Read the analog value
    if(sensorValue < threshold) {
      lightup();   // If less than threshold call lightup
    }
    if(sensorValue > threshold) {
      pwmWrite(ledPin1, 0);  // If not less than threshold turn off LED
      pwmWrite(ledPin2, 0);
      pwmWrite(ledPin3, 0);
    }

    delay(10);
}

void lightup(void) {
    pwmWrite(ledPin1, 65535);
    for (int fadeValue = 0; fadeValue <= 65535; fadeValue += 1280) {
        // Sets the value (range from 0 to 65535):                              yellow
        pwmWrite(ledPin2, fadeValue);
        // Wait for 30 milliseconds to see the dimming effect:
        delay(1000);
    }
    for (int fadeValue = 0; fadeValue <= 65535; fadeValue += 1280) {
        // Sets the value (range from 0 to 65535):                              white
        pwmWrite(ledPin3, fadeValue);
        // Wait for 30 milliseconds to see the dimming effect:
        delay(1000);
    }
    for (int fadeValue = 65535 ; fadeValue >= 0; fadeValue -= 1280) {
        // Sets the value (range from 0 to 1280):                               violet
        pwmWrite(ledPin2, fadeValue);
        // Wait for 30 milliseconds to see the dimming effect:
        delay(1000);
    }
    for (int fadeValue = 65535 ; fadeValue >= 0; fadeValue -= 1280) {
        // Sets the value (range from 0 to 1280):                               blue
        pwmWrite(ledPin1, fadeValue);
        // Wait for 30 milliseconds to see the dimming effect:
        delay(1000);
    }
    for (int fadeValue = 65535 ; fadeValue >= 0; fadeValue -= 1280) {
        // Sets the value (range from 0 to 1280):                               green
        pwmWrite(ledPin3, fadeValue);
        pwmWrite(ledPin2, fadeValue2);
        fadeValue2 += 1280;
        // Wait for 30 milliseconds to see the dimming effect:
        delay(1000);
        sensorValue = analogRead(20);       
    }
    for (int fadeValue = 0; fadeValue <= 65535; fadeValue += 1280) {
        // Sets the value (range from 0 to 65535):                              lt blue
        pwmWrite(ledPin3, fadeValue);
        // Wait for 30 milliseconds to see the dimming effect:
        delay(1000);
        sensorValue = analogRead(20);     
    }
    fadeValue2 = 65535;

    for (int fadeValue = 0; fadeValue <= 65535; fadeValue += 1280) {
        // Sets the value (range from 0 to 65535):                              red
        pwmWrite(ledPin1, fadeValue);
        pwmWrite(ledPin2, fadeValue2);
        pwmWrite(ledPin3, fadeValue2);
        fadeValue2 -= 1280;
        // Wait for 30 milliseconds to see the dimming effect:
        delay(1000);     
    }
}

Adjusting the value for threshold will change the sensitivity to ambient light.