KL25Z RGB LED fade demo using the HSI2RGBW_PWM libary
Dependencies: HSI2RGBW_PWM mbed
Fork of KL25Z_HSI2RGBW_PWM by
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.
main.cpp@3:d7de0bf4cd0c, 2014-02-02 (annotated)
- 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?
User | Revision | Line number | New 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 | } |