Last active
June 22, 2019 21:57
-
-
Save atuline/b4d31590cd51337d2102a467477d991d to your computer and use it in GitHub Desktop.
gamma_correction
This file contains hidden or 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
/* gamma_correction | |
* | |
* By: Andrew Tuline | |
* | |
* Date: January, 2019 | |
* | |
* Testing gamma correction to change LED brightness so that it appears to change evenly for the viewer. The problem is that changes above | |
* 50 are much less noticeable for the viewer, so the LED gets bright quickly and then stays bright for way too long before dimming again. | |
* | |
* There's a few ways to adjust LED output. The table method was proposed on Adafruit.com. Here's a couple of other methods for demonstration. | |
* | |
* Display the result on the Arduino IDE's serial plotter. | |
* | |
* | |
* Resources: | |
* | |
* Gamma correction: https://learn.adafruit.com/led-tricks-gamma-correction/the-issue | |
* | |
* fscale.h: http://playground.arduino.cc/main/fscale | |
* | |
*/ | |
#include "FastLED.h" // This is required for some of the math routines. | |
const uint8_t PROGMEM gamma8[] = { | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, | |
2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, | |
5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, | |
10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, | |
17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25, | |
25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, | |
37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, | |
51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68, | |
69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89, | |
90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114, | |
115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142, | |
144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175, | |
177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213, | |
215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 }; | |
void setup() { | |
Serial.begin(57600); | |
} // setup() | |
void loop() { | |
for (int i = 0; i<512; i++) { | |
Serial.print(0); Serial.print(" "); Serial.print(255); Serial.print(" "); // Use this to fix the scaling. | |
uint8_t inputval = sin8(i); // Good enough for graphing. | |
Serial.print(inputval); | |
uint8_t results = pgm_read_byte(&gamma8[inputval]); // That sinewave is now corrected via the lookup table, which is quick, but consumes flash. | |
Serial.print(" "); Serial.print(results); | |
uint8_t dimraw = dim8_raw(inputval); // The FastLED dim8_raw routine doesn't work as well as the table. | |
Serial.print(" "); Serial.print(dimraw); | |
uint8_t newval = inputval*inputval/255; // A non-floating point exponential multiplier is close to the table, but a bit slow. | |
newval = newval*inputval/255; | |
Serial.print(" "); Serial.print(newval); | |
float num = pow((inputval/255.0), 3.0); // The floating point exponential multiplier is adjustable, but slow. | |
int n = num * 255; | |
Serial.print(" "); Serial.print(n); | |
Serial.println(" "); | |
} | |
while(1); // We're going to stop right here! | |
} // loop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment