/*
Los LEDs reales tienen correccion gamma, lo que significa que incluso una
pequeña corriente generara luz visible. El simulador hace esto
La corrección gamma se usa para ajustar la respuesta de brillo de un LED
para que sea más lineal o visualmente agradable para el ojo humano
Usaremos una matriz para la correccion gamma
*/
#define PIN_POTENCIOMETRO 4
#define PIN_LED 25
volatile int valorPotenciometro;
volatile int valorLed;
// Gamma table from https://learn.adafruit.com/led-tricks-gamma-correction/the-quick-fix
// La siguiente instruccion (PROGMEM) indica que la tabla gamma8 se almacena
// en la memoria Flash del microcontrolador, no en la memoria RAM
// No se guarda en la RAM porque no tenemos mucho espacio en la RAM
// La buena práctica es guardar los datos constantes en la memoria Flash
// Además, la Flash es no volátil
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(9600);
pinMode(PIN_POTENCIOMETRO, INPUT);
pinMode(PIN_LED, OUTPUT);
// La resolucion va a ser de 2^8=256 valores posibles
analogReadResolution(8);
}
void loop() {
// Leemos el valor del potenciometro (0 - 255)
valorPotenciometro = analogRead(PIN_POTENCIOMETRO);
// pgm_read_byte() es una función específica para leer datos de la memoria Flash
valorLed = pgm_read_byte(&gamma8[valorPotenciometro]);
analogWrite(PIN_LED, valorLed);
Serial.print(valorPotenciometro);
Serial.print(" ");
Serial.println(valorLed);
delay(100);
}