Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

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

Descripción del Proyecto

Este tutorial muestra cómo realizar fundidos (fade) de LEDs con Arduino en tres niveles progresivos:

  1. Fundido automático continuo
  2. Fundido activado por pulsador
  3. 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

Control de Brillo LED con PWM mediante Pulsador en Arduino Mega

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

Control de Brillo LED con PWM mediante Pulsador en Arduino Mega

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

Control de Brillo LED con PWM mediante Pulsador en Arduino Mega

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

Control de Brillo LED con PWM mediante Pulsador en Arduino Mega
Control de Brillo LED con PWM mediante Pulsador en Arduino Mega

Proceso de manufactura

  1. Construye un Juego Giroscópico en Tiempo Real con Arduino Nano y Sensor MPU-6050
  2. Sistema de Asistencia RFID Fiable con Arduino y Python
  3. Proyecto Sensor DHT11 Temperatura y Humedad con Indicadores LED y Altavoz Piezo
  4. Construye un Dispositivo de Levitación Ultrasónica con Arduino – Guía Paso a Paso
  5. Unopad: Controlador MIDI Arduino para Ableton Live sin complicaciones
  6. Sistema automático de riego para plantas con Arduino
  7. Sensor de obstáculos IR casero con Arduino – Tutorial fácil con LED IR y fotodiodo
  8. Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
  9. Mide la masa de la Tierra con Arduino: Guía paso a paso DIY
  10. Medición de Distancia en Tiempo Real con Sonar Arduino y Visualización en Processing
  11. Control de Ventilador PWM de 4 Pines a 25 kHz con Arduino Uno – Montaje, Código y Pruebas