P02 - Control por eventos y antirrebote de pulsadores
🔘 P02 - Control por eventos y antirrebote de pulsadores
ℹ️ Empieza aquí:
En la práctica anterior aprendiste a encender un LED directamente leyendo el estado de un pulsador.
En sistemas reales, la lectura directa puede producir errores debido a rebotes mecánicos del pulsador.
En esta práctica aprenderás a detectar una pulsación válida, eliminar el rebote y usar esa pulsación para cambiar el estado de un LED, introduciendo conceptos de programación más avanzados.
🚀 Objetivos
• Comprender qué es el rebote mecánico de un pulsador.
• Implementar antirrebote por software usando millis().
• Detectar cambios de estado (flancos) en una entrada digital.
• Controlar un LED mediante eventos de pulsación.
• Introducir el uso del Monitor Serie para depuración y visualización de eventos.
🧩 Contenidos trabajados
• Lectura avanzada de entradas digitales.
• Variables de estado y temporización con millis().
• Detección de flancos (LOW → HIGH, HIGH → LOW).
• Lógica de control basada en eventos en lugar de estado continuo.
• Uso básico del Monitor Serie (Serial.begin, Serial.println).
💻 Materiales y recursos
• Arduino UNO.
• Protoboard.
• 1 LED.
• 1 resistencia (220 Ω – 330 Ω).
• 1 pulsador.
• Cables Dupont macho-macho.
• Ordenador con Arduino IDE instalado.
ℹ️ Nota:
El montaje eléctrico es idéntico al de la práctica P01.
🔧 Montaje práctico
Conexión del LED
Qué se va a hacer:
Conectar el LED que se controlará mediante eventos.
Cómo hacerlo:
1. Coloca el LED en la protoboard.
2. Ánodo → resistencia → pin digital 8.
3. Cátodo → GND.
Conexión del pulsador
Qué se va a hacer:
Conectar el pulsador cuya pulsación se leerá correctamente.
Cómo hacerlo:
1. Coloca el pulsador en la protoboard.
2. Terminal → GND
3. Terminal opuesto → pin digital 2 (usando pull-up interno)
🧭 Desarrollo de la práctica
Paso 1: Crear el proyecto
Qué se va a hacer:
Crear un nuevo sketch para esta práctica.
Cómo hacerlo:
1. Abre el Arduino IDE.
2. Selecciona Archivo → Nuevo.
3. Guarda el archivo con el nombre:
P02_Antirrebote_Eventos_ApellidoNombre
Paso 2: Configurar los pines y la comunicación serie
Dentro de setup() escribe:
pinMode(8, OUTPUT);
pinMode(2, INPUT_PULLUP);
Serial.begin(9600);
Qué ocurre aquí:
- Pin 8 → salida para LED
- Pin 2 → entrada del pulsador
Serial.begin(9600)→ inicializa comunicación con el ordenador
Paso 3: Definir variables de estado
Antes de setup() declara:
int estadoPulsador;
int estadoAnterior = HIGH;
bool estadoLED = false;
unsigned long tiempoAnterior = 0;
const unsigned long debounceDelay = 50;
Qué significa:
estadoPulsador→ lectura actual del botónestadoAnterior→ lectura anteriorestadoLED→ estado del LEDtiempoAnterior→ momento del último cambio válidodebounceDelay→ tiempo mínimo para ignorar rebotes
Paso 4: Leer pulsaciones y aplicar antirrebote
Dentro de loop():
1. Leer el estado del pulsador:
estadoPulsador = digitalRead(2);
2. Verificar si ha cambiado respecto al estado anterior:
if (estadoPulsador != estadoAnterior) {
tiempoAnterior = millis(); // reinicia temporizador
}
3. Esperar tiempo de antirrebote:
if ((millis() - tiempoAnterior) > debounceDelay) {
if (estadoPulsador == LOW && estadoAnterior == HIGH) {
estadoLED = !estadoLED; // cambiar estado del LED
digitalWrite(8, estadoLED ? HIGH : LOW);
Serial.println(estadoLED ? "LED encendido" : "LED apagado");
}
}
4. Actualizar el estado anterior:
estadoAnterior = estadoPulsador;
🖥️ Uso del Monitor Serie
Qué se va a hacer:
Comprobar que cada pulsación válida genera un mensaje único.
Cómo hacerlo:
1. Abrir Monitor Serie en Arduino IDE.
2. Observar los mensajes:
LED encendido→ pulsación válidaLED apagado→ siguiente pulsación
💡 Nota: No deberían aparecer mensajes repetidos por rebote.
✅ Comprobación de funcionamiento
- Cada pulsación cambia el estado del LED.
- El LED permanece en su estado aunque se suelte el botón.
- No hay comportamiento errático por rebote.
📦 Entrega
• Archivo .ino comentado y funcional.
• Fotografía del montaje (puede ser la misma que P01).
• Captura del Monitor Serie mostrando mensajes correctos.
• Breve explicación del algoritmo de antirrebote y control por eventos.
📊 Rúbrica de evaluación
| Criterio | Excelente (9–10) | Adecuado (6–8) | Insuficiente (≤5) |
|---|---|---|---|
| Antirrebote | Correcto y estable | Funciona con fallos ocasionales | No implementado |
| Control por eventos | LED conmuta correctamente | Funciona parcialmente | Incorrecto |
| Código | Claro, modular y comentado | Funcional pero mejorable | Confuso |
| Uso del Monitor Serie | Mensajes claros y útiles | Mensajes básicos | No utilizado |
| Comprensión | Explica bien la lógica | Explicación parcial | No comprende |
🎯 Para pensar (opcional)
¿Por qué en sistemas reales es preferible trabajar con eventos en lugar de estados directos?