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:
const int pinLED = 8;
const int pinPulsador = 2;
pinMode(pinLED, OUTPUT);
pinMode(pinPulsador, INPUT_PULLUP);
Serial.begin(9600);
Qué ocurre aquí:
- pinLED → salida para LED
- pinPulsador → entrada del pulsador
Serial.begin(9600)→ inicializa comunicación con el ordenador
Paso 3: Definir variables de estado
Antes de setup() declara:
int lecturaPulsador;
int ultimaLectura = HIGH;
int estadoEstable = HIGH;
bool estadoLED = false;
unsigned long tiempoAnterior = 0;
const unsigned long debounceDelay = 50;
Qué significa:
lecturaPulsador→ lectura actual del botónultimaLectura→ última lectura detectadaestadoEstable→ estado confirmado tras el antireboteestadoLED→ estado actual del LEDtiempoAnterior→ instante del último cambio detectadodebounceDelay→ tiempo mínimo para validar el cambio
Paso 4: Leer pulsaciones y aplicar antirrebote
Dentro de loop():
1. Leer el estado actual del pulsador:
lecturaPulsador = digitalRead(pinPulsador);
2. Si la lectura cambia, reiniciar el temporizador:
if (lecturaPulsador != ultimaLectura) {
tiempoAnterior = millis();
}
3. Comprobar si el estado se mantiene estable el tiempo suficiente:
if ((millis() - tiempoAnterior) > debounceDelay) {
if (lecturaPulsador != estadoEstable) {
estadoEstable = lecturaPulsador;
if (estadoEstable == LOW) {
estadoLED = !estadoLED;
digitalWrite(pinLED, estadoLED ? HIGH : LOW);
Serial.println(estadoLED ? "LED encendido" : "LED apagado");
}
}
}
4. Guardar la lectura para la siguiente iteración:
ultimaLectura = lecturaPulsador;
🖥️ 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 una sola vez
- El LED conserva su estado al soltar el botón
- El rebote mecánico queda correctamente filtrado
- El código es seguro, legible y escalable
📦 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?