Example program to cycle the RGB LED on the mbed application board through all colours

Dependencies:   C12832_lcd LCD_fonts mbed

Fork of app-board-RGB by Chris Styles

Test Program to show the RGB Led on the mbed Lab Board

The color is changed by Pot 2, the value by Pot 1.

The program use a function to convert hue , saturation and value to RGB.

With this parameters you can change the color thru the rainbow. see http://en.wikipedia.org/wiki/HSL_and_HSV

main.cpp

Committer:
dreschpe
Date:
2012-10-20
Revision:
2:52c13333401e
Parent:
1:670665e77763
Child:
3:139f52e5e15c

File content as of revision 2:52c13333401e:

/**
  * Demo for the RGB Led on the mbed Lab Board
  * Pot 2 changes the color 
  * Pot 1 changes the value
  * the saturation is set to maximum
  * 
  * Copyright (c) 2012 Peter Drescher - DC2PD
  * This Demo run only on LPC1768 !
  * The LPC11U24 has different PWM pins !
  */   


#include "mbed.h"
#include "Small_7.h"
#include "Arial_9.h"
#include "stdio.h"
#include "C12832_lcd.h"

/* the led's are connected to vcc, so a PwmOut of 100% will shut off the led and 0% will let it shine ! */
PwmOut r (p23);
PwmOut g (p24);
PwmOut b (p25);

// LCD object
C12832_LCD LCD("LCD");

AnalogIn Pot1(p19);
AnalogIn Pot2(p20);

// function to convert hue , saturation and  value to RGB
// see http://en.wikipedia.org/wiki/HSL_and_HSV
void hsv2rgb(float H,float S, float V)
{
    float f,h,p,q,t;
    int i;
    if( S == 0.0) {
        r = 1.0 - V;  // invert pwm !
        g = 1.0 - V;
        b = 1.0 - V;
        return;
    }
    if(H > 360.0) H = 0.0;   // check values
    if(S > 1.0) S = 1.0; 
    if(S < 0.0) S = 0.0;
    if(V > 1.0) V = 1.0;
    if(V < 0.0) V = 0.0;
    h = H / 60.0;
    i = (int) h;
    f = h - i;
    p = V * (1.0 - S);
    q = V * (1.0 - (S * f));
    t = V * (1.0 - (S * (1.0 - f)));

    switch(i) {
        case 0:
            r = 1.0 - V;  // invert pwm !
            g = 1.0 - t;
            b = 1.0 - p;
            break;
        case 1:
            r = 1.0 - q;
            g = 1.0 - V;
            b = 1.0 - p;
            break;
        case 2:
            r = 1.0 - p;
            g = 1.0 - V;
            b = 1.0 - t;
            break;
        case 3:
            r = 1.0 - p;
            g = 1.0 - q;
            b = 1.0 - V;
            break;
        case 4:
            r = 1.0 - t;
            g = 1.0 - p;
            b = 1.0 - V;
            break;
        case 5:
        default:
            r = 1.0 - V;
            g = 1.0 - p;
            b = 1.0 - q;
            break;
    }
}

    
int main()
{
    float h;       //  hue 
    float s,v;   // saturation and  value;
    unsigned short temp;
    r.period(0.001);  // set pwm period
    
    LCD.claim(stdout);      // send stdout to the LCD display
    LCD.cls();
    LCD.locate(10,0);
    LCD.set_font((unsigned char*) Arial_9);
    printf("RGB Led Demo");
    LCD.copy_to_lcd();
    LCD.set_font((unsigned char*) Small_7);
    s = 1.0;
    for(;;){
        // get Poti 1 for color
        temp = Pot1.read_u16();
        temp = temp >> 6;        // truncate to 10 Bit
        h = temp * 0.3515625;  // scale to 0 - 360;
        LCD.locate(0,13);
        printf("Colour = %3.2f degree",h);
        // get Poti 2 fo value
        temp = Pot2.read_u16();
        temp = temp >> 6;
        v = temp * 0.0009765624;  // scale to 0 - 1;
        LCD.locate(0,23);
        printf("Val = %01.3f ",v);
        LCD.copy_to_lcd();
        hsv2rgb(h,s,v);
        wait_ms(500);
    }
}