KL25Z RGB LED fade demo using the HSI2RGBW_PWM libary

Dependencies:   HSI2RGBW_PWM mbed

Fork of KL25Z_HSI2RGBW_PWM by Frank Vannieuwkerke

HSI to RGB demo with direct PWM output

Drives the KL25Z on-board RGB LED.
Other demo code, driving an external RGBW power LED : see this page.

Committer:
frankvnk
Date:
Sun Feb 02 15:14:42 2014 +0000
Revision:
3:d7de0bf4cd0c
Parent:
0:562d0087dd7f
Initial release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 0:562d0087dd7f 1 /*
frankvnk 0:562d0087dd7f 2 ***************************************************
frankvnk 0:562d0087dd7f 3 * Code ported from http://saikoled.com *
frankvnk 0:562d0087dd7f 4 * Licensed under GPL3 *
frankvnk 0:562d0087dd7f 5 * Created 14 February 2013 *
frankvnk 0:562d0087dd7f 6 * Original MCU board : Arduino Leonardo *
frankvnk 0:562d0087dd7f 7 * Original CPU : ATmega32u4 *
frankvnk 0:562d0087dd7f 8 * Copyright 2013, Brian Neltner *
frankvnk 0:562d0087dd7f 9 ***************************************************
frankvnk 0:562d0087dd7f 10
frankvnk 0:562d0087dd7f 11 Sources
frankvnk 0:562d0087dd7f 12 -------
frankvnk 0:562d0087dd7f 13 https://github.com/saikoLED/MyKi/blob/master/myki_16_bit_random_fade/myki_16_bit_random_fade.ino
frankvnk 0:562d0087dd7f 14 https://github.com/saikoLED/MyKi/blob/master/myki_16_bit_fade/myki_16_bit_fade.ino
frankvnk 0:562d0087dd7f 15 Above files are combined into this file using defines.
frankvnk 0:562d0087dd7f 16
frankvnk 0:562d0087dd7f 17 http://blog.saikoled.com/post/44677718712/how-to-convert-from-hsi-to-rgb-white
frankvnk 0:562d0087dd7f 18
frankvnk 0:562d0087dd7f 19 Other demos : Psychadelic demo
frankvnk 0:562d0087dd7f 20 DO NOT TRY THIS IF YOU ARE EPILEPTIC! THESE FREQUENCIES ARE EVEN WORSE THAN MOST STROBING LIGHTS!
frankvnk 0:562d0087dd7f 21 http://blog.saikoled.com/post/45760195354/generating-vivid-geometric-hallucinations-using-flicker
frankvnk 0:562d0087dd7f 22
frankvnk 0:562d0087dd7f 23 This software implements 4x 16-bit PWM with a filtered fading algorithm
frankvnk 0:562d0087dd7f 24 in HSI color space and HSI -> RGBW conversion to allow for better
frankvnk 0:562d0087dd7f 25 pastel color.
frankvnk 0:562d0087dd7f 26 */
frankvnk 0:562d0087dd7f 27
frankvnk 0:562d0087dd7f 28 #include "mbed.h"
frankvnk 0:562d0087dd7f 29 #include "hsi2rgbw_pwm.h"
frankvnk 0:562d0087dd7f 30
frankvnk 0:562d0087dd7f 31 #define RANDOM_FADE // Disable this define to set Normal fade.
frankvnk 0:562d0087dd7f 32
frankvnk 0:562d0087dd7f 33 // Constants
frankvnk 0:562d0087dd7f 34 #define steptime 1 // Color transition time in ms.
frankvnk 0:562d0087dd7f 35 #define maxsaturation 1.0
frankvnk 0:562d0087dd7f 36
frankvnk 0:562d0087dd7f 37 #ifdef RANDOM_FADE
frankvnk 0:562d0087dd7f 38 #define propgain 0.0005 // "Small Constant"
frankvnk 0:562d0087dd7f 39 #define minsaturation 0.9
frankvnk 0:562d0087dd7f 40 #else
frankvnk 0:562d0087dd7f 41 #define hue_increment 0.01
frankvnk 0:562d0087dd7f 42 #endif
frankvnk 0:562d0087dd7f 43
frankvnk 0:562d0087dd7f 44 Serial pc(USBTX, USBRX);
frankvnk 0:562d0087dd7f 45
frankvnk 0:562d0087dd7f 46 // HSI to RGBW conversion with direct output to PWM channels
frankvnk 3:d7de0bf4cd0c 47 hsi2rgbw_pwm led(LED_RED, LED_GREEN, LED_BLUE);
frankvnk 0:562d0087dd7f 48
frankvnk 0:562d0087dd7f 49 struct HSI {
frankvnk 0:562d0087dd7f 50 float h;
frankvnk 0:562d0087dd7f 51 float s;
frankvnk 0:562d0087dd7f 52 float i;
frankvnk 0:562d0087dd7f 53 #ifdef RANDOM_FADE
frankvnk 0:562d0087dd7f 54 float htarget;
frankvnk 0:562d0087dd7f 55 float starget;
frankvnk 0:562d0087dd7f 56 #endif
frankvnk 0:562d0087dd7f 57 } color;
frankvnk 0:562d0087dd7f 58
frankvnk 0:562d0087dd7f 59 void updatehue() {
frankvnk 0:562d0087dd7f 60 #ifdef RANDOM_FADE
frankvnk 0:562d0087dd7f 61 color.htarget += ((rand()%360)-180)*.1;
frankvnk 0:562d0087dd7f 62 color.htarget = fmod(color.htarget, 360);
frankvnk 0:562d0087dd7f 63 color.h += propgain*(color.htarget-color.h);
frankvnk 0:562d0087dd7f 64 color.h = fmod(color.h, 360);
frankvnk 0:562d0087dd7f 65 #else
frankvnk 0:562d0087dd7f 66 color.h = color.h + hue_increment;
frankvnk 0:562d0087dd7f 67 if(color.h > 360)
frankvnk 0:562d0087dd7f 68 color.h = 0;
frankvnk 0:562d0087dd7f 69 #endif
frankvnk 0:562d0087dd7f 70 }
frankvnk 0:562d0087dd7f 71
frankvnk 0:562d0087dd7f 72 void updatesaturation() {
frankvnk 0:562d0087dd7f 73 #ifdef RANDOM_FADE
frankvnk 0:562d0087dd7f 74 color.starget += ((rand()%10000)-5000)/0.00001;
frankvnk 0:562d0087dd7f 75 if (color.starget > maxsaturation) color.starget = maxsaturation;
frankvnk 0:562d0087dd7f 76 else if (color.starget < minsaturation) color.starget = minsaturation;
frankvnk 0:562d0087dd7f 77 color.s += propgain*(color.starget-color.s);
frankvnk 0:562d0087dd7f 78 if (color.s > maxsaturation) color.s = maxsaturation;
frankvnk 0:562d0087dd7f 79 else if (color.s < minsaturation) color.s = minsaturation;
frankvnk 0:562d0087dd7f 80 #else
frankvnk 0:562d0087dd7f 81 color.s = maxsaturation;
frankvnk 0:562d0087dd7f 82 #endif
frankvnk 0:562d0087dd7f 83 }
frankvnk 0:562d0087dd7f 84
frankvnk 0:562d0087dd7f 85 void primary_colors() {
frankvnk 0:562d0087dd7f 86 printf("briefly show RED - GREEN - BLUE using hsi2rgbw.\r\n");
frankvnk 3:d7de0bf4cd0c 87 color.s = 1;
frankvnk 3:d7de0bf4cd0c 88 color.i = 1;
frankvnk 0:562d0087dd7f 89 for (color.h = 0 ; color.h < 360 ; color.h += 120)
frankvnk 0:562d0087dd7f 90 {
frankvnk 0:562d0087dd7f 91 led.hsi2rgbw(color.h, color.s, color.i);
frankvnk 0:562d0087dd7f 92 wait(1);
frankvnk 0:562d0087dd7f 93 }
frankvnk 0:562d0087dd7f 94 }
frankvnk 0:562d0087dd7f 95
frankvnk 0:562d0087dd7f 96 void cycle_rgbw() {
frankvnk 0:562d0087dd7f 97 float rgbw[4] = {0,0,0,0};
frankvnk 3:d7de0bf4cd0c 98 color.s = 1;
frankvnk 3:d7de0bf4cd0c 99 color.i = 1;
frankvnk 3:d7de0bf4cd0c 100 printf("briefly show RED - GREEN - BLUE using direct PWM output.\r\n");
frankvnk 0:562d0087dd7f 101 rgbw[0] = 1.0f;
frankvnk 0:562d0087dd7f 102 led.pwm(rgbw);
frankvnk 0:562d0087dd7f 103 wait(1);
frankvnk 0:562d0087dd7f 104 rgbw[0] = 0.0f;
frankvnk 0:562d0087dd7f 105 rgbw[1] = 1.0f;
frankvnk 0:562d0087dd7f 106 led.pwm(rgbw);
frankvnk 0:562d0087dd7f 107 wait(1);
frankvnk 0:562d0087dd7f 108 rgbw[1] = 0.0f;
frankvnk 0:562d0087dd7f 109 rgbw[2] = 1.0f;
frankvnk 0:562d0087dd7f 110 led.pwm(rgbw);
frankvnk 0:562d0087dd7f 111 wait(1);
frankvnk 0:562d0087dd7f 112 }
frankvnk 0:562d0087dd7f 113
frankvnk 0:562d0087dd7f 114 void sendcolor() {
frankvnk 0:562d0087dd7f 115 while (color.h >=360) color.h = color.h - 360;
frankvnk 0:562d0087dd7f 116 while (color.h < 0) color.h = color.h + 360;
frankvnk 0:562d0087dd7f 117 if (color.i > 1) color.i = 1;
frankvnk 0:562d0087dd7f 118 if (color.i < 0) color.i = 0;
frankvnk 0:562d0087dd7f 119 if (color.s > 1) color.s = 1;
frankvnk 0:562d0087dd7f 120 if (color.s < 0) color.s = 0;
frankvnk 0:562d0087dd7f 121 // Fix ranges (somewhat redundantly).
frankvnk 0:562d0087dd7f 122 led.hsi2rgbw(color.h, color.s, color.i);
frankvnk 0:562d0087dd7f 123 }
frankvnk 0:562d0087dd7f 124
frankvnk 0:562d0087dd7f 125 void setup() {
frankvnk 3:d7de0bf4cd0c 126 led.invertpwm(1); //KL25Z RGB LED uses common anode.
frankvnk 0:562d0087dd7f 127 color.h = 0;
frankvnk 0:562d0087dd7f 128 color.s = maxsaturation;
frankvnk 0:562d0087dd7f 129 color.i = 0;
frankvnk 0:562d0087dd7f 130 #ifdef RANDOM_FADE
frankvnk 0:562d0087dd7f 131 color.htarget = 0;
frankvnk 0:562d0087dd7f 132 color.starget = maxsaturation;
frankvnk 0:562d0087dd7f 133 #endif
frankvnk 0:562d0087dd7f 134
frankvnk 0:562d0087dd7f 135 // Initial color = off, hue of red fully saturated.
frankvnk 0:562d0087dd7f 136 while (color.i < 1) {
frankvnk 0:562d0087dd7f 137 sendcolor();
frankvnk 0:562d0087dd7f 138 color.i = color.i + 0.001; // Increase Intensity
frankvnk 0:562d0087dd7f 139 updatehue();
frankvnk 0:562d0087dd7f 140 updatesaturation();
frankvnk 0:562d0087dd7f 141 wait_ms(steptime);
frankvnk 0:562d0087dd7f 142 }
frankvnk 0:562d0087dd7f 143 }
frankvnk 0:562d0087dd7f 144
frankvnk 0:562d0087dd7f 145 int main() {
frankvnk 0:562d0087dd7f 146 pc.baud (115200);
frankvnk 3:d7de0bf4cd0c 147 printf("HSI to RGB random fade.\r\n");
frankvnk 0:562d0087dd7f 148 printf("Initialize.\r\n");
frankvnk 3:d7de0bf4cd0c 149
frankvnk 0:562d0087dd7f 150 setup();
frankvnk 0:562d0087dd7f 151 primary_colors();
frankvnk 0:562d0087dd7f 152 cycle_rgbw();
frankvnk 0:562d0087dd7f 153 printf("Run.\r\n");
frankvnk 0:562d0087dd7f 154 while(1) {
frankvnk 0:562d0087dd7f 155 sendcolor();
frankvnk 0:562d0087dd7f 156 updatehue();
frankvnk 0:562d0087dd7f 157 updatesaturation();
frankvnk 0:562d0087dd7f 158 wait_ms(steptime);
frankvnk 0:562d0087dd7f 159 }
frankvnk 0:562d0087dd7f 160 }