L8: El pulsador (2)

Conexión de un pulsador a la placa de desarrollo. Obtención de su estado mediante interrupciones.

El pulsador (2)

Qué vas a aprender en esta lección

En esta lección trabajaremos:

  • Qué es una interrupción.
  • Diferencia entre preguntar dentro del bucle principal y reaccionar a un evento.
  • Cómo hacer que un pulsador ejecute bloques cuando cambia de estado.
  • Uso de interrupciones sencillas para controlar un LED.
  • Uso opcional de variables para contar pulsaciones.

Requisitos previos

Para poder seguir esta lección debes haber completado la Lección 1: Mi primer proyecto, la Lección 2: El diodo LED, la Lección 3: El diodo LED (2) y la Lección 7: El pulsador.

Si quieres realizar la parte opcional del contador, también te ayudará haber trabajado la Lección 6: El puerto serie.

Explicación teórica

En la lección anterior leíamos el pulsador dentro del bucle principal. El programa repetía una pregunta muchas veces:

  • ¿Está pulsado el botón?
  • ¿Está pulsado ahora?
  • ¿Y ahora?

Esa forma de trabajar se llama polling. Funciona bien y es fácil de entender, pero tiene un inconveniente: el programa tiene que estar preguntando continuamente.

En esta lección usaremos otra idea: una interrupción. En lugar de preguntar todo el rato, le diremos a la placa:

Cuando el pulsador cambie a ON, ejecuta estos bloques.

¡Quiero saber más!

¿Qué es una interrupción?

Una interrupción es una forma de reaccionar a un evento. Un evento es algo que ocurre en un momento concreto:

  • Pulsar un botón.
  • Soltar un botón.
  • Recibir un mensaje.
  • Llegar a un tiempo determinado.

Podemos imaginar una interrupción como el timbre de una casa. No miramos la puerta cada segundo para comprobar si hay alguien. Cuando alguien pulsa el timbre, nos avisa.

Con el pulsador ocurre algo parecido:

  • Con polling, el programa pregunta muchas veces si el botón está pulsado.
  • Con interrupción, el programa prepara una respuesta para cuando el botón cambie.

ON y OFF en un pulsador

El bloque de alto nivel del pulsador nos permite trabajar con valores sencillos:

  • ON: el pulsador está presionado.
  • OFF: el pulsador no está presionado.

En esta lección usaremos dos eventos:

  • cuando MiBoton cambie a ON: ocurre al presionar el pulsador.
  • cuando MiBoton cambie a OFF: ocurre al soltar el pulsador.

Programas que hacen dos cosas

Las interrupciones son útiles porque permiten separar tareas. Por ejemplo:

  • El bucle principal puede seguir haciendo una secuencia de luces.
  • El pulsador puede cambiar una variable o encender un LED justo cuando se pulsa.

Esto no significa que las interrupciones sean siempre mejores. Son una herramienta más. Para programas sencillos, preguntar en el bucle principal puede ser suficiente. Para eventos rápidos o acciones puntuales, una interrupción puede ser más cómoda.

Parte Práctica

Necesitas los siguientes materiales:

  • Placa de desarrollo ESP32.
  • Placa de expansión BatSTEM.
  • Cable de conexion USB.
  • Placa de prototipos.
  • Pulsador.
  • LED rojo.
  • Resistencia de 100 Ohm.
  • Cables de conexión.

Esquema electrónico

Usaremos el mismo circuito de la lección anterior: un pulsador conectado al pin GPIO4 y un LED conectado al pin GPIO2 con su resistencia de protección.

Diagrama de conexión

Si ya tienes montado el circuito de la Lección 7, puedes reutilizarlo. Si no lo tienes, monta el pulsador y el LED siguiendo este diagrama.


Conexión de los componentes en la placa de prototipos

Paso a paso
  1. Conecta GND de la placa de expansión a la línea azul de la placa de prototipos.
  2. Coloca el pulsador cruzando el canal central de la placa de prototipos.
  3. Conecta un terminal del pulsador al pin GPIO4.
  4. Conecta el otro terminal del pulsador a GND.
  5. Conecta el LED al pin GPIO2 usando una resistencia de 100 Ohm en serie.
  6. Conecta el cátodo del LED a GND.
  7. Conecta la placa al ordenador con el cable USB.

Código

Encender el LED con eventos del pulsador

Construye y ejecuta el siguiente sketch:

Paso a paso
  1. En el bloque configuración, añade un bloque “LED con nombre”.
  2. Escribe MiLED como nombre y selecciona el pin GPIO2.
  3. Añade un bloque “Botón/interruptor con nombre”.
  4. Escribe MiBoton como nombre y selecciona el pin GPIO4.
  5. Arrastra un bloque “cuando MiBoton cambie a ON”.
  6. Dentro de ese bloque, añade “poner LED MiLED a 100”.
  7. Arrastra otro bloque “cuando MiBoton cambie a OFF”.
  8. Dentro de ese bloque, añade “poner LED MiLED a 0”.
  9. Ejecuta el sketch y prueba el pulsador.

Cuando presiones el botón, se ejecutará la interrupción de ON. Cuando lo sueltes, se ejecutará la interrupción de OFF.

Contar pulsaciones

Ahora vamos a usar una variable para recordar cuántas veces se ha pulsado el botón. Esta parte es un poco más avanzada porque combina interrupciones, variables y puerto COM.

Paso a paso
  1. En configuración, configura el puerto COM a 115200 bps. El monitor COM funciona siempre a esa velocidad.
  2. Añade el pulsador MiBoton conectado al pin GPIO4.
  3. Crea una variable llamada Pulsaciones con valor inicial 0.
  4. Añade un bloque “cuando MiBoton cambie a ON”.
  5. Dentro de ese evento, cambia Pulsaciones en 1.
  6. Después escribe Pulsaciones en el puerto COM.
  7. Ejecuta el sketch, abre el monitor COM y pulsa el botón varias veces.

Cada pulsación debería aumentar el número mostrado en el monitor COM.

¡Quiero saber más!

¿Por qué contamos solo al cambiar a ON?

Un pulsador tiene dos cambios importantes:

  • De OFF a ON, cuando lo presionamos.
  • De ON a OFF, cuando lo soltamos.

Si contamos en los dos cambios, una sola pulsación podría sumar dos veces. Por eso usamos solo el evento ON para contar.

Rebotes y pulsaciones reales

Los pulsadores mecánicos pueden producir rebotes. El bloque de alto nivel ayuda a trabajar con el pulsador de forma más cómoda, pero si alguna vez ves que una pulsación cuenta más de una vez, no significa necesariamente que hayas escrito mal toda la lógica. Puede ser un efecto físico del botón o una señal de que necesitas mejorar el antirrebote.

Ejercicios adicionales o retos

  1. Cambia el primer sketch para que el LED se encienda al soltar el botón y se apague al presionarlo.
  2. Añade un segundo LED. Haz que uno se encienda con el evento ON y el otro con el evento OFF.
  3. Modifica el contador para que escriba un mensaje antes del número, por ejemplo “Pulsaciones:”.
  4. Crea una variable llamada Estado. Cuando pulses el botón, ponla a “activo” y escríbela en el monitor COM.
Pistas para los retos
  • Para invertir el comportamiento del LED, intercambia los valores 100 y 0.
  • Para usar dos LEDs, crea dos bloques “LED con nombre” en configuración.
  • Para escribir texto fijo en el monitor COM, usa un bloque de texto dentro de “escribir en el puerto COM”.
  • Para trabajar con variables de texto, crea una variable y usa el bloque “poner variable a” con un bloque de texto.

Resumen de lo aprendido

  • Hemos aprendido que una interrupción permite reaccionar a un evento.
  • Hemos comparado polling e interrupciones.
  • Hemos usado el bloque “cuando MiBoton cambie a ON”.
  • Hemos usado el bloque “cuando MiBoton cambie a OFF”.
  • Hemos creado un contador de pulsaciones usando una variable.
  • Hemos enviado información al monitor COM para observar lo que ocurre.

Próximos pasos

  • Aprende a ejecutar acciones periódicas con un temporizador en la Lección 9.

Soluciones a ejercicios adicionales

Mostrar

LED encendido al soltar el botón

Para invertir el comportamiento, cambia las acciones de cada evento:

  1. En “cuando MiBoton cambie a ON”, pon MiLED a 0.
  2. En “cuando MiBoton cambie a OFF”, pon MiLED a 100.

Así, el LED estará apagado mientras mantienes pulsado el botón y encendido cuando lo sueltes.