Cómo controlar el Brillo de un LED

Objetivo

En este tutorial aprenderás cómo ajustar el brillo de un LED utilizando modulación por ancho de pulso, también conocida como PWM. Verás por qué modificar la tensión directamente no es una solución fiable, cómo funciona la técnica de encendido y apagado rápido, y cómo usar potenciómetros, rampas y corrección gamma para lograr transiciones suaves. Al final, te proponemos dos ejercicios prácticos: uno con LED automático y potenciómetro, y otro con un efecto ola animado con varios LEDs.

¿Quieres practicar? Utiliza estos componentes recomendados

1 x Placa Arduino UNO R4 Wifi Ver en Amazon

1 x Pack de resistencias surtidas 1/4 W Ver en Amazon

1 x Pack de diodos LED Ver en Amazon

1 x Pack de potenciómetros de 100Ω - 2MΩ Ver en Amazon

1 x Protoboard y cables de conexión Ver en Amazon

Función Gamma

La función gamma permite ajustar el valor de salida PWM de forma que el ojo humano perciba el cambio de brillo de manera lineal. Sin esta corrección, el cambio puede parecer brusco o poco natural.

Curva de corrección gamma
uint8_t gammaCorrect(uint8_t value) {
  // Definimos el valor de gamma. Un valor típico es 2.2
  float gamma = 2.2;

  // Normalizamos el valor de entrada (de 0 a 255) al rango 0.0–1.0
  float normalized = value / 255.0;

  // Aplicamos la corrección gamma: elevamos a la potencia de gamma
  float corrected = pow(normalized, gamma);

  // Reescalamos el valor corregido de vuelta a 0–255 y lo devolvemos como entero
  return uint8_t(corrected * 255);
}

Ejercicio 1: Rampa de brillo con LED

En este primer ejercicio te proponemos crear una animación suave que simule una respiración luminosa. Conectarás un LED a una salida PWM y utilizarás una rampa de subida, un mantenimiento de brillo máximo, una rampa de bajada y un periodo de apagado.

Esquema de rampa de brillo
const int ledPWM = 5;  // Pin PWM al que está conectado el LED

void setup() {
  pinMode(ledPWM, OUTPUT);  // Configuramos el pin como salida
}

void loop() {
  // Subida de brillo (2 segundos)
  for (int i = 0; i <= 255; i++) {
    int pwmValue = gammaCorrect(i);   // Aplicamos la corrección gamma
    analogWrite(ledPWM, pwmValue);    // Enviamos señal PWM al LED
    delay(8);                          // 8 ms * 256 = ~2 segundos
  }

  // Mantener encendido (1 segundo)
  analogWrite(ledPWM, 255);
  delay(1000);

  // Bajada de brillo (2 segundos)
  for (int i = 255; i >= 0; i--) {
    int pwmValue = gammaCorrect(i);
    analogWrite(ledPWM, pwmValue);
    delay(8);
  }

  // Apagado (1 segundo)
  analogWrite(ledPWM, 0);
  delay(1000);
}

// Función para aplicar corrección gamma
uint8_t gammaCorrect(uint8_t value) {
  float gamma = 2.2;
  float normalized = value / 255.0;
  float corrected = pow(normalized, gamma);
  return uint8_t(corrected * 255);
}

Ejercicio 2: Efecto ola con múltiples LEDs

En este segundo ejercicio te proponemos crear un efecto ola con seis LEDs conectados a salidas PWM. Cada LED debe encenderse secuencialmente y seguir una rampa de brillo tipo sierra. También usarás un potenciómetro para ajustar la velocidad de la ola.

Efecto ola con LEDsEfecto ola con LEDs

Solución Ejercicio 2