Control de Brillo LED con PWM mediante Pulsador en Arduino Mega
Componentes y Suministros
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino Mega 2560 | 1 | |
| Protoboard (genérica) | 1 | |
| Cables jumper (genéricos) | 11 | Según método de conexión |
| LED (genéricos) | 3 | Recomendados 3 colores distintos |
| Pulsador 12mm (SparkFun) | 1 | |
| Resistencia 330 Ω | 4 |
Aplicaciones y Servicios Online
- Arduino IDE
Descripción del Proyecto
Este tutorial muestra cómo realizar fundidos (fade) de LEDs con Arduino en tres niveles progresivos:
- Fundido automático continuo
- Fundido activado por pulsador
- Fundido con control de pulsador en tiempo real (mejora del delay)
1. Fundido Automático de LEDs
Al final, los LEDs brillarán y atenuarán en secuencia semáforo (rojo → amarillo → verde → amarillo).
Esquemático
LEDs en pines PWM 3, 6 y 9 (cualquier pin PWM sirve, pero debe coincidir con el código). Cada LED con su resistencia 330Ω a GND.
Código
int ledRed = 9;
int ledYellow = 6;
int ledGreen = 3;
const int fade = 10; // Variable para ajustar velocidad fácilmente
void setup() {
pinMode(ledRed, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledGreen, OUTPUT);
}
void loop() {
// Rojo
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
// Amarillo
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
// Verde
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
// Amarillo (vuelta)
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
}
Explicación: analogWrite(pin, 0-255) genera PWM. Los bucles for incrementan/decrementan el valor de 0 a 255 (encendido) y 255 a 0 (apagado). delay(fade) controla la velocidad; usando variable fade se cambia en un solo lugar.
2. Fundido con Pulsador
Los LEDs cambian solo al presionar el botón. Al soltarlo, vuelve al estado inicial (verde encendido).
Esquemático
Se añade pulsador en pin 7 (entrada pull-down o pull-up según montaje).
Código
int ledRed = 9, ledYellow = 6, ledGreen = 3;
int button = 7;
const int fade = 10;
void setup() {
pinMode(ledRed, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(button, INPUT);
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, HIGH); // Estado inicial: verde encendido
}
void loop() {
if (digitalRead(button) == HIGH) {
delay(15); // Anti-rebote software
if (digitalRead(button) == HIGH) fadeLights();
} else {
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, HIGH);
}
}
void fadeLights() {
// Verde: fundido salida (estaba encendido)
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
// Amarillo: entrada y salida
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
// Rojo: entrada y salida
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
// Amarillo: entrada y salida
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
// Verde: entrada
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
}
En loop() se detecta pulsación (con anti-rebote simple) y llama a fadeLights(). Si no hay pulsación, mantiene verde encendido. Limitación: una vez iniciado fadeLights(), no se verifica el botón hasta terminar toda la secuencia.
3. Fundido con Control en Tiempo Real (Mejora del Delay)
Ahora el fundido se detiene inmediatamente al soltar el botón, volviendo al estado por defecto (verde ON).
Esquemático
Mismo hardware que versión anterior.
Código Mejorado
int ledRed = 9, ledYellow = 6, ledGreen = 3;
int button = 7;
// const int fade = 10; // YA NO SE USA
void setup() {
pinMode(ledRed, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(button, INPUT);
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, HIGH);
}
void loop() {
if (digitalRead(button) == HIGH) {
delay(15);
if (digitalRead(button) == HIGH) fadeLights();
} else {
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, HIGH);
}
}
void fadeLights() {
// Verde: fundido salida
for (int i = 255; i >= 0; i--) {
analogWrite(ledGreen, i);
for (int y = 0; y < 1000; y++) { if (digitalRead(button) == LOW) return; }
}
// Amarillo: entrada
for (int i = 0; i <= 255; i++) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) { if (digitalRead(button) == LOW) return; }
}
// Amarillo: salida
for (int i = 255; i >= 0; i--) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) { if (digitalRead(button) == LOW) return; }
}
// Rojo: entrada
for (int i = 0; i <= 255; i++) {
analogWrite(ledRed, i);
for (int y = 0; y < 1000; y++) { if (digitalRead(button) == LOW) return; }
}
// Rojo: salida
for (int i = 255; i >= 0; i--) {
analogWrite(ledRed, i);
for (int y = 0; y < 1000; y++) { if (digitalRead(button) == LOW) return; }
}
// Amarillo: entrada
for (int i = 0; i <= 255; i++) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) { if (digitalRead(button) == LOW) return; }
}
// Amarillo: salida
for (int i = 255; i >= 0; i--) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) { if (digitalRead(button) == LOW) return; }
}
// Verde: entrada
for (int i = 0; i <= 255; i++) {
analogWrite(ledGreen, i);
for (int y = 0; y < 1000; y++) { if (digitalRead(button) == LOW) return; }
}
}
Clave de la mejora: se reemplaza delay(fade) por bucles vacíos for(int y=0; y<N; y++) que verifican el botón en cada iteración. Si se suelta (LOW), return sale inmediatamente de fadeLights() y el loop() retoma el estado por defecto. Los valores de N (1000, 400) ajustan la velocidad aproximada del fundido.
Códigos Completos
Versión 1: Fundido Automático
int ledRed = 9; int ledYellow = 6; int ledGreen = 3; const int fade = 10;
void setup() { pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT); }
void loop() {
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
}
Versión 2: Con Pulsador
int ledRed = 9; int ledYellow = 6; int ledGreen = 3; int button = 7; const int fade = 10;
void setup() { pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT); pinMode(button, INPUT); digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH); }
void loop() { if (digitalRead(button) == HIGH) { delay(15); if (digitalRead(button) == HIGH) fadeLights(); } else { digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH); } }
void fadeLights() { for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); } for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); } for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); } for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); } for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); } for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); } for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); } for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); } }
Versión 3: Control en Tiempo Real
int ledRed = 9; int ledYellow = 6; int ledGreen = 3; int button = 7; const int fade = 10;
void setup() { pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT); pinMode(button, INPUT); digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH); }
void loop() { if(digitalRead(button) == HIGH) { delay(15); if(digitalRead(button) == HIGH){ fadeLights(); } } else { digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH); } }
void fadeLights(){ for( int i=255; i>=0; i--) { analogWrite(ledGreen, i); for( int y = 0; y < 1000; y++){ if (digitalRead(button) == LOW) { return; } } } for( int i=0; i<=255; i++) { analogWrite(ledYellow, i); for( int y = 0; y < 400; y++){ if (digitalRead(button) == LOW) { return; } } } for( int i=255; i>=0; i--) { analogWrite(ledYellow, i); for( int y = 0; y < 400; y++){ if (digitalRead(button) == LOW) { return; } } } for( int i=0; i<=255; i++) { analogWrite(ledRed, i); for( int y = 0; y < 1000; y++){ if (digitalRead(button) == LOW) { return; } } } for( int i=255; i>=0; i--) { analogWrite(ledRed, i); for( int y = 0; y < 1000; y++){ if (digitalRead(button) == LOW) { return; } } } for( int i=0; i<=255; i++) { analogWrite(ledYellow, i); for( int y = 0; y < 400; y++){ if (digitalRead(button) == LOW) { return; } } } for( int i=255; i>=0; i--) { analogWrite(ledYellow, i); for( int y = 0; y < 400; y++){ if (digitalRead(button) == LOW) { return; } } } for( int i=0; i<=255; i++) { analogWrite(ledGreen, i); for( int y = 0; y < 1000; y++){ if (digitalRead(button) == LOW) { return; } } } }
Esquemáticos
Proceso de manufactura
- Construye un Juego Giroscópico en Tiempo Real con Arduino Nano y Sensor MPU-6050
- Sistema de Asistencia RFID Fiable con Arduino y Python
- Proyecto Sensor DHT11 Temperatura y Humedad con Indicadores LED y Altavoz Piezo
- Construye un Dispositivo de Levitación Ultrasónica con Arduino – Guía Paso a Paso
- Unopad: Controlador MIDI Arduino para Ableton Live sin complicaciones
- Sistema automático de riego para plantas con Arduino
- Sensor de obstáculos IR casero con Arduino – Tutorial fácil con LED IR y fotodiodo
- Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
- Mide la masa de la Tierra con Arduino: Guía paso a paso DIY
- Medición de Distancia en Tiempo Real con Sonar Arduino y Visualización en Processing
- Control de Ventilador PWM de 4 Pines a 25 kHz con Arduino Uno – Montaje, Código y Pruebas