Introduction: Arduino Mood Light

This is a simple project based on Adafruit Arduino - Lesson 3. RGB LED

https://learn.adafruit.com/adafruit-arduino-lesson-3-rgb-leds/arduino-sketch

You will find lots of useful information on RGB LEDs if you follow the link.

The original programme was to cycle through a number of discrete colours.

What I wanted to see was the LEDs cycling through the full spectrum of colours with a gradual and almost imperceptible change.

I decided that the best way to do this was with sine waves.

Step 1: A Little About Sine Waves

Sine waves are continuous waves which can be found in nature as sound waves, radio waves, light waves and many other forms. They can be described by their amplitude (how big they are) and their frequency (the rate at which the wave repeats).

Now for a little Maths

The sine wave can be describe by the formula A sin(2*PI*F*t)

Where A is the amplitude.

Amplitude is the maximum value that the wave deviates from the central axis (usually zero).

F is the frequency or how many times the wave cycles in 1 second and is measured in (Hertz: Hz), The wave shown in the picture is of frequency 1Hz.

t is the time in seconds (s) and is the variable quantity that allows the formula to describe a wave rather than just give a fixed answer.

The period as shown on the diagram (sometimes known as the wavelength) can be described as:

p (period) = 1/F (frequency).

2*PI is the ratio of the radius of a circle (analogous to the amplitude), to the circumference of a circle (analogous to the period of the wave).

Step 2: What You Will Need

A computer loaded with the arduino ide https://www.arduino.cc/en/Main/Software

An arduino

RGB LEDs

Solderless breadboard

Resistors 330 ohm x 3 or 6 if you use two LEDs

connecting wires

Step 3: Connecting Everything Up

Connect as shown. Please note: I used common cathode LEDs, if you have used common anode you may need to take this into account when wiring.

The common cathode LEDs are wired as follows.

From the flat side

Green

Cathode (longest pin)

Blue

Red

For the Arduino I have used pins 9, 10 and 11, these are PWM pins which are necessary for the programme to work.

Step 4: The Code

/*

Based on Adafruit Arduino - Lesson 3. RGB LED

https://learn.adafruit.com/adafruit-arduino-lesson-3-rgb-leds/arduino-sketch

Programme to vary colours on RGB LED's using sinewaves

By Ray Houghton

Please feel free to use this software or muck about with

it as you please.

*/

int redPin = 11;

int greenPin = 10;

int bluePin = 9;

float t;

/* Output pins for LEDs (these are all PWM outputs*/

//uncomment this line if using a Common Anode LED

//#define COMMON_ANODE

void setup()

{

pinMode(redPin, OUTPUT);

pinMode(greenPin, OUTPUT);

pinMode(bluePin, OUTPUT);

//set pins to output

}

void loop()

{

for (t = 0; t < 1000; t = t + 0.001)

// sets instantaneous time element of sine functions.

{

/* Sine functions to vary the PWM outputs are of the form

offset + amplitude * sin(2 * pi * F * t)

Where offset ensures sinewave does not go less than zero and

where F is the desired frequency

NOTE: Red green and blue are different brightnesses with RGB LEDs,

so offset and amplitude are adjusted to compensate.

*/

int redsat = 126 + 126*sin(2*3.141592654*0.03*t);

int greensat = 64 + 64*sin(2*3.141592654*0.027*t);

int bluesat = 32 + 32*sin(2*3.141592654*0.025*t);

//Call function setColor

setColor(redsat, greensat, bluesat);

delay(1);

}

}

void setColor(int red, int green, int blue)

{

#ifdef COMMON_ANODE

red = 255 - red;

green = 255 - green;

blue = 255 - blue;

#endif

analogWrite(redPin, red);

analogWrite(greenPin, green);

analogWrite(bluePin, blue);

}

Step 5: A Little Explanation of the Code

The code describes the sine waves in the above diagram.

To give a variation between zero output and maximum output, the sine waves need to vary between 0 and 255. A normal sine function of the form:

A sin(2*PI*F*t)

Will give a wave which varies between – 128 and +128. To make the wave between 0 and 255 we need to add an offset. This gives the form

MAX/2 + A sin(2*PI*F*t)

Where A is the maximum (MAX) amplitude available (256) divided by 2.

As the RGB LEDs give different intensities for red, green and blue, I have reduced the amplitude and the offset.

The frequencies used give a period of around 30 seconds.

redsat = 126 + 126*sin(2*3.141592654*0.03*t);

greensat = 64 + 64*sin(2*3.141592654*0.027*t);

bluesat = 32 + 32*sin(2*3.141592654*0.025*t);

The three sine waves described in the code are at slightly different frequencies,

this means that the mix of colours will change in a way which will not repeat until the variable (t) expires (1000 in steps of 0.001).

First Time Author Contest 2016

Participated in the
First Time Author Contest 2016