Tutorial Lectura de entradas digitales (Pulsador)
Después de hacer parpadear un LED, el siguiente paso natural es leer el mundo exterior. En este tutorial aprenderás a conectar un pulsador, leer su estado con GPIO.read y, finalmente, reaccionar a las pulsaciones con interrupciones — todo probado primero en el simulador de Windows y después en tu ESP32.
Lo que necesitas
- JARU IDE instalado en tu PC — puedes completar todo el tutorial solo con esto.
- (Opcional) Una placa ESP32, un pulsador, un LED, resistencias y un cable USB.
Paso 1: El código — Lectura por sondeo (polling)
La forma más directa de leer un pulsador es preguntar constantemente por su estado dentro del bucle principal. Abre JARU IDE, crea un nuevo archivo llamado button.aru y escribe el siguiente código:
// Importamos el módulo GPIO para controlar los pines
use GPIO
println("Iniciando lectura de pulsador...");
// 1. Configuración de pines
// Pin 4: pulsador con resistencia pull-up interna (lee HIGH cuando no se pulsa)
GPIO.pinmode(4, GPIO.PULLUP);
// Pin 2: LED integrado como salida
GPIO.pinmode(2, GPIO.OUTPUT);
println("Hardware configurado. Esperando pulsaciones...");
// 2. Bucle principal — sondeo (polling)
while (true)
var state = GPIO.read(4);
if (state == LOW) then
// El pulsador está presionado (conecta a GND → lee LOW)
GPIO.write(2, HIGH);
println("Pulsador presionado → LED encendido");
else
GPIO.write(2, LOW);
end
pause(50); // Pequeña pausa anti-rebote
end
Al configurar un pin con GPIO.PULLUP, el ESP32 activa una resistencia interna que mantiene el pin en nivel HIGH cuando no hay nada conectado. Cuando el pulsador se presiona y conecta el pin a GND, el nivel cae a LOW. Así no necesitas una resistencia externa.
Qué hace cada parte
GPIO.pinmode(4, GPIO.PULLUP) configura el pin 4 como entrada digital con resistencia pull-up interna. El pin lee HIGH en reposo y LOW cuando el pulsador conecta a GND.
GPIO.read(4) devuelve el estado digital actual del pin: HIGH (1) o LOW (0).
state == LOW detecta que el pulsador está presionado. Con pull-up, la lógica es invertida: pulsar = LOW.
pause(50) introduce una espera de 50 ms que actúa como filtro anti-rebote básico, evitando lecturas erráticas por el rebote mecánico del pulsador.
Paso 2: Simulación en Windows
- Abre el Simulador GPIO desde el menú Build → GPIO Sim del IDE.
- Añade el pin 4 manualmente con el botón New GPIO y asocia una tarjeta PushButton.
- Añade el pin 2 y asocia una tarjeta LED.
- Haz clic en Run para ejecutar el programa en la VM.
- En la consola de salida verás los mensajes de arranque.
- Pulsa el botón en la tarjeta PushButton del simulador y observa cómo la tarjeta LED se enciende mientras mantienes pulsado. Al soltar, se apaga.

- Consola de salida
- Simulador GPIO
Iniciando lectura de pulsador...
Hardware configurado. Esperando pulsaciones...
Pulsador presionado → LED encendido
Pulsador presionado → LED encendido
El pin 4 aparecerá en la tabla con dirección Input y tipo Digital. La tarjeta PushButton te permite simular la pulsación con un clic. El pin 2 mostrará la tarjeta LED que se enciende mientras el botón esté presionado.
Paso 3: Mejora — Uso de interrupciones
El sondeo funciona, pero obliga al procesador a estar preguntando constantemente. Las interrupciones son más eficientes: el hardware avisa automáticamente cuando el pin cambia de estado. Crea un nuevo archivo button_int.aru:
// Importamos el módulo GPIO
use GPIO
println("Iniciando lectura con interrupciones...");
// 1. Configuración de pines
GPIO.pinmode(4, GPIO.PULLUP);
GPIO.pinmode(2, GPIO.OUTPUT);
// 2. Variable de estado
var ledOn = false;
// 3. Función callback — se ejecuta cuando el pin cambia
func onButtonPress(pin, val)
ledOn = !ledOn; // Invertimos el estado
if (ledOn) then
GPIO.write(2, HIGH);
println("LED encendido (toggle)");
else
GPIO.write(2, LOW);
println("LED apagado (toggle)");
end
end
// 4. Registramos la interrupción en flanco de bajada (HIGH → LOW = pulsación)
GPIO.onInterrupt(4, GPIO.FALLING, onButtonPress);
println("Interrupción registrada. Pulsa el botón...");
// 5. Bucle principal libre para otras tareas
while (true)
pause(100);
end
Fíjate en la diferencia: el primer ejemplo enciende el LED mientras mantienes el pulsador. Este segundo ejemplo alterna el estado con cada pulsación — pulsa una vez para encender, pulsa otra para apagar.
Qué hace cada parte nueva
func onButtonPress() define la función callback que se ejecutará automáticamente cada vez que se detecte una interrupción en el pin.
GPIO.onInterrupt(4, GPIO.FALLING, onButtonPress) asocia la función onButtonPress al pin 4. El modo GPIO.FALLING dispara la interrupción en el flanco de bajada (cuando el pin pasa de HIGH a LOW), es decir, justo cuando presionas el pulsador.
while (true) pause(100); end mantiene el programa vivo. El bucle principal queda libre porque toda la lógica del pulsador la gestiona la interrupción.
Modos de interrupción disponibles
| Constante | Se dispara cuando... |
|---|---|
GPIO.RISING | El pin pasa de LOW a HIGH (flanco de subida) |
GPIO.FALLING | El pin pasa de HIGH a LOW (flanco de bajada) |
GPIO.CHANGE | El pin cambia de estado en cualquier dirección |
GPIO.ONLOW | El pin se mantiene en nivel LOW |
GPIO.ONHIGH | El pin se mantiene en nivel HIGH |
Paso 4: Simulación de la versión con interrupciones
- Repite la configuración del simulador: pin 4 con PushButton y pin 2 con LED.
- Ejecuta
button_int.arucon Run. - Haz clic en el pulsador del simulador. Cada clic alternará el LED entre encendido y apagado.

- Observa la consola: cada pulsación imprime el nuevo estado.
- Consola de salida
- Simulador GPIO
Iniciando lectura con interrupciones...
Interrupción registrada. Pulsa el botón...
LED encendido (toggle)
LED apagado (toggle)
LED encendido (toggle)
El comportamiento es distinto al primer ejemplo: ahora cada clic en el PushButton cambia el estado del LED. No necesitas mantener el botón presionado.
Paso 5: Despliegue en el ESP32
Una vez verificada la lógica en el simulador, el despliegue al hardware es idéntico al tutorial anterior. No necesitas cambiar ni una sola línea de código.
- Conecta tu ESP32 al puerto USB del PC.
- Conecta el pulsador entre el GPIO 4 y GND. No necesitas resistencia externa gracias al
GPIO.PULLUP. - En JARU IDE, selecciona el puerto COM de tu placa desde el menú desplegable.
- Haz clic en el botón Upload Program.
- Espera a que el flasheo termine y pulsa el botón físico. El LED del ESP32 responderá exactamente igual que en el simulador.
La filosofía de JARU sigue funcionando: el mismo button_int.aru que probaste en Windows se ejecuta sin cambios en el ESP32 real.
Desafío extra
Combina lo que has aprendido en este tutorial y en el anterior. Intenta crear un programa que haga lo siguiente:
- Al pulsar el botón, el LED empieza a parpadear automáticamente.
- Al pulsar otra vez, el LED se detiene y se apaga.
Pista: usa una variable booleana que se alterne en la interrupción y compruébala dentro del bucle principal para decidir si ejecutas la secuencia de parpadeo.
¿Quieres un reto mayor? Añade un segundo pulsador en otro pin que controle la velocidad del parpadeo: cada pulsación reduce el intervalo a la mitad (500 → 250 → 125 ms) y vuelve a empezar.
Resumen
En este tutorial has aprendido a configurar un pin como entrada digital con GPIO.pinmode y el modo GPIO.PULLUP, leer el estado de un pulsador con GPIO.read, reaccionar a pulsaciones con GPIO.onInterrupt y el modo GPIO.FALLING, distinguir entre lectura por sondeo (polling) y lectura por interrupciones, y probar ambos enfoques en la VM de Windows antes de desplegar al ESP32 sin modificar el código.
El siguiente tutorial introduce la lectura y escritura analógica con PWM y sensores.
