Skip to content

Instantly share code, notes, and snippets.

@kasperkamperman
Last active November 28, 2015 09:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kasperkamperman/990cd7424e12af5318f3 to your computer and use it in GitHub Desktop.
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).
/*
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