Last active
November 28, 2015 09:00
-
-
Save kasperkamperman/990cd7424e12af5318f3 to your computer and use it in GitHub Desktop.
Get RGB values based on a 16bit hue input value. A lookup table is used with 256 values and in between we interpolate with lerp16by8 (FastLED library).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Implementation of a 16bit HSB lookup table. | |
The table is rendered with a Processing sketch where HSB is converted to RGB. | |
*/ | |
#include<FastLED.h> | |
const uint32_t HSBLUT[] = { | |
0xFFFF0000, 0xFFFF0500, 0xFFFF0B00, 0xFFFF1100, 0xFFFF1700, 0xFFFF1D00, 0xFFFF2300, 0xFFFF2900, 0xFFFF2F00, 0xFFFF3500, 0xFFFF3B00, 0xFFFF4100, 0xFFFF4700, 0xFFFF4D00, 0xFFFF5300, 0xFFFF5900, | |
0xFFFF5F00, 0xFFFF6500, 0xFFFF6B00, 0xFFFF7100, 0xFFFF7700, 0xFFFF7D00, 0xFFFF8300, 0xFFFF8900, 0xFFFF8F00, 0xFFFF9400, 0xFFFF9A00, 0xFFFFA000, 0xFFFFA600, 0xFFFFAC00, 0xFFFFB200, 0xFFFFB800, | |
0xFFFFBE00, 0xFFFFC400, 0xFFFFCA00, 0xFFFFD000, 0xFFFFD600, 0xFFFFDC00, 0xFFFFE200, 0xFFFFE800, 0xFFFFEE00, 0xFFFFF400, 0xFFFFFA00, 0xFFFDFF00, 0xFFF7FF00, 0xFFF1FF00, 0xFFEBFF00, 0xFFE5FF00, | |
0xFFDFFF00, 0xFFD9FF00, 0xFFD4FF00, 0xFFCEFF00, 0xFFC8FF00, 0xFFC2FF00, 0xFFBCFF00, 0xFFB6FF00, 0xFFB0FF00, 0xFFAAFF00, 0xFFA4FF00, 0xFF9EFF00, 0xFF98FF00, 0xFF92FF00, 0xFF8CFF00, 0xFF86FF00, | |
0xFF80FF00, 0xFF7AFF00, 0xFF74FF00, 0xFF6EFF00, 0xFF68FF00, 0xFF62FF00, 0xFF5CFF00, 0xFF56FF00, 0xFF50FF00, 0xFF4AFF00, 0xFF44FF00, 0xFF3FFF00, 0xFF39FF00, 0xFF33FF00, 0xFF2DFF00, 0xFF27FF00, | |
0xFF21FF00, 0xFF1BFF00, 0xFF15FF00, 0xFF0FFF00, 0xFF09FF00, 0xFF03FF00, 0xFF00FF02, 0xFF00FF08, 0xFF00FF0E, 0xFF00FF14, 0xFF00FF1A, 0xFF00FF20, 0xFF00FF26, 0xFF00FF2C, 0xFF00FF32, 0xFF00FF38, | |
0xFF00FF3E, 0xFF00FF44, 0xFF00FF4A, 0xFF00FF50, 0xFF00FF55, 0xFF00FF5B, 0xFF00FF61, 0xFF00FF67, 0xFF00FF6D, 0xFF00FF73, 0xFF00FF79, 0xFF00FF7F, 0xFF00FF85, 0xFF00FF8B, 0xFF00FF91, 0xFF00FF97, | |
0xFF00FF9D, 0xFF00FFA3, 0xFF00FFA9, 0xFF00FFAF, 0xFF00FFB5, 0xFF00FFBB, 0xFF00FFC1, 0xFF00FFC7, 0xFF00FFCD, 0xFF00FFD3, 0xFF00FFD9, 0xFF00FFDF, 0xFF00FFE5, 0xFF00FFEA, 0xFF00FFF0, 0xFF00FFF6, | |
0xFF00FFFC, 0xFF00FBFF, 0xFF00F5FF, 0xFF00EFFF, 0xFF00E9FF, 0xFF00E3FF, 0xFF00DDFF, 0xFF00D7FF, 0xFF00D1FF, 0xFF00CBFF, 0xFF00C5FF, 0xFF00BFFF, 0xFF00B9FF, 0xFF00B3FF, 0xFF00ADFF, 0xFF00A7FF, | |
0xFF00A1FF, 0xFF009BFF, 0xFF0095FF, 0xFF008FFF, 0xFF0089FF, 0xFF0083FF, 0xFF007EFF, 0xFF0078FF, 0xFF0072FF, 0xFF006CFF, 0xFF0066FF, 0xFF0060FF, 0xFF005AFF, 0xFF0054FF, 0xFF004EFF, 0xFF0048FF, | |
0xFF0042FF, 0xFF003CFF, 0xFF0036FF, 0xFF0030FF, 0xFF002AFF, 0xFF0024FF, 0xFF001EFF, 0xFF0018FF, 0xFF0012FF, 0xFF000CFF, 0xFF0006FF, 0xFF0000FF, 0xFF0500FF, 0xFF0B00FF, 0xFF1100FF, 0xFF1600FF, | |
0xFF1C00FF, 0xFF2200FF, 0xFF2800FF, 0xFF2E00FF, 0xFF3400FF, 0xFF3A00FF, 0xFF4000FF, 0xFF4600FF, 0xFF4C00FF, 0xFF5200FF, 0xFF5800FF, 0xFF5E00FF, 0xFF6400FF, 0xFF6A00FF, 0xFF7000FF, 0xFF7600FF, | |
0xFF7C00FF, 0xFF8200FF, 0xFF8800FF, 0xFF8E00FF, 0xFF9400FF, 0xFF9A00FF, 0xFFA000FF, 0xFFA600FF, 0xFFAB00FF, 0xFFB100FF, 0xFFB700FF, 0xFFBD00FF, 0xFFC300FF, 0xFFC900FF, 0xFFCF00FF, 0xFFD500FF, | |
0xFFDB00FF, 0xFFE100FF, 0xFFE700FF, 0xFFED00FF, 0xFFF300FF, 0xFFF900FF, 0xFFFF00FE, 0xFFFF00F8, 0xFFFF00F2, 0xFFFF00EC, 0xFFFF00E6, 0xFFFF00E0, 0xFFFF00DA, 0xFFFF00D4, 0xFFFF00CE, 0xFFFF00C8, | |
0xFFFF00C2, 0xFFFF00BD, 0xFFFF00B7, 0xFFFF00B1, 0xFFFF00AB, 0xFFFF00A5, 0xFFFF009F, 0xFFFF0099, 0xFFFF0093, 0xFFFF008D, 0xFFFF0087, 0xFFFF0081, 0xFFFF007B, 0xFFFF0075, 0xFFFF006F, 0xFFFF0069, | |
0xFFFF0063, 0xFFFF005D, 0xFFFF0057, 0xFFFF0051, 0xFFFF004B, 0xFFFF0045, 0xFFFF003F, 0xFFFF0039, 0xFFFF0033, 0xFFFF002D, 0xFFFF0028, 0xFFFF0022, 0xFFFF001C, 0xFFFF0016, 0xFFFF0010, 0xFFFF000A, | |
0xFFFF0000 | |
}; | |
// used to get the data from the lookup table in a fast way | |
struct CRGB32 { | |
uint8_t b; | |
uint8_t g; | |
uint8_t r; | |
uint8_t unusedByte; | |
}; | |
CRGB rgb; | |
void setup() { | |
Serial.begin(57600); | |
Serial.println(); | |
} | |
void loop() { | |
for (int i=0; i < 256; i++) { | |
uint16_t hue16bit = (i<<8) + 127; | |
rgb = RGBColorAtHSBWheel(hue16bit); | |
Serial.print(i); | |
Serial.print(" : "); | |
Serial.print(rgb.r); | |
Serial.print(", "); | |
Serial.print(rgb.g); | |
Serial.print(", "); | |
Serial.println(rgb.b); | |
} | |
Serial.println(F("===================")); | |
delay(5000); | |
} | |
CRGB RGBColorAtHSBWheel(const uint16_t& hue16) { | |
uint8_t index = hue16 >> 8; | |
uint8_t interpolation = hue16 & 0xFF; | |
CRGB rgb; | |
CRGB32 start = (CRGB32&) HSBLUT[index]; | |
CRGB32 end = (CRGB32&) HSBLUT[index + 1]; | |
rgb.r = lerp8by8(start.r, end.r, interpolation); | |
rgb.g = lerp8by8(start.g, end.g, interpolation); | |
rgb.b = lerp8by8(start.b, end.b, interpolation); | |
return rgb; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment