🔘 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)

Montaje de la práctica P02


🧭 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ón
  • ultimaLectura → última lectura detectada
  • estadoEstable → estado confirmado tras el antirebote
  • estadoLED → estado actual del LED
  • tiempoAnterior → instante del último cambio detectado
  • debounceDelay → 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álida
  • LED 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?

Updated: