Módulo GPIO
El módulo GPIO (General Purpose Input/Output) permite controlar los pines de entrada y salida del ESP32, incluyendo lectura y escritura digital, PWM (modulación por ancho de pulso) y manejo de interrupciones por hardware.

Uso
use GPIO
Funciones
pinmode
Configura el modo de operación de un pin GPIO.
GPIO.pinmode(pin, modo)
Parámetros:
| Parámetro | Descripción |
|---|---|
pin | Número del pin GPIO |
modo | Modo de operación del pin |
Modos disponibles:
| Constante | Descripción |
|---|---|
GPIO.INPUT | Modo entrada |
GPIO.OUTPUT | Modo salida |
GPIO.PULLUP | Modo entrada con resistencia pull-up interna |
GPIO.PULLDOWN | Modo entrada con resistencia pull-down interna |
GPIO.OPEN_DRAIN | Modo salida open-drain |
Ejemplo:
use GPIO
// Configurar pin 2 como salida (LED integrado)
GPIO.pinmode(2, GPIO.OUTPUT)
// Configurar pin 15 como entrada con pull-up
GPIO.pinmode(15, GPIO.PULLUP)
write
Escribe un valor digital (HIGH o LOW) en un pin configurado como salida.
GPIO.write(pin, valor)
Parámetros:
| Parámetro | Descripción |
|---|---|
pin | Número del pin GPIO |
valor | Valor a escribir: 1 / true (HIGH) o 0 / false (LOW) |
Ejemplo:
use GPIO
GPIO.pinmode(2, GPIO.OUTPUT)
// Encender LED
GPIO.write(2, 1)
pause(1000)
// Apagar LED
GPIO.write(2, 0)
read
Lee el estado digital de un pin configurado como entrada.
var valor = GPIO.read(pin)
Parámetros:
| Parámetro | Descripción |
|---|---|
pin | Número del pin GPIO |
Retorna: 0 (LOW) o 1 (HIGH).
Ejemplo:
use GPIO
GPIO.pinmode(15, GPIO.INPUT)
var estado = GPIO.read(15)
if (estado == 1) then
println("Pin 15: HIGH")
else
println("Pin 15: LOW")
end
aread
Lee el valor analógico de un pin utilizando el conversor analógico-digital (ADC).
var valor = GPIO.aread(pin)
Parámetros:
| Parámetro | Descripción |
|---|---|
pin | Número del pin GPIO con capacidad ADC |
Retorna: Valor entero entre 0 y 4095 (resolución de 12 bits por defecto).
Ejemplo:
use GPIO
// Leer valor analógico del pin 34
var valor = GPIO.aread(34)
println("Valor analógico: ", valor)
Solo ciertos pines del ESP32 tienen capacidad ADC. Consulta la documentación de tu placa para conocer los pines disponibles.
awrite
Escribe un valor analógico (PWM) en un pin. El ESP32 gestiona automáticamente la asignación de canales PWM.
GPIO.awrite(pin, valor)
Parámetros:
| Parámetro | Descripción |
|---|---|
pin | Número del pin GPIO |
valor | Valor del ciclo de trabajo (0 al máximo según resolución) |
Ejemplo:
use GPIO
// LED con brillo al 50% (valor 512 con resolución de 10 bits)
GPIO.awrite(2, 512)
El valor máximo depende de la resolución configurada. Con 10 bits (por defecto), el rango es 0-1023. Con 8 bits sería 0-255.
resolution
Establece la resolución del PWM en bits (1-16).
// Establecer resolución global para todos los canales
GPIO.resolution(bits)
// Establecer resolución para un pin específico
GPIO.resolution(pin, bits)
Parámetros:
| Parámetro | Descripción |
|---|---|
bits | Resolución en bits (1-16) |
pin | Número del pin GPIO (opcional) |
Ejemplo:
use GPIO
// Establecer resolución de 8 bits (valores 0-255)
GPIO.resolution(8)
// O establecer resolución solo para el pin 2
GPIO.resolution(2, 12) // 12 bits = valores 0-4095
frequency
Establece la frecuencia del PWM en Hz.
// Establecer frecuencia global para todos los canales
GPIO.frequency(frecuencia)
// Establecer frecuencia para un pin específico
GPIO.frequency(pin, frecuencia)
Parámetros:
| Parámetro | Descripción |
|---|---|
frecuencia | Frecuencia en Hz |
pin | Número del pin GPIO (opcional) |
Ejemplo:
use GPIO
// Establecer frecuencia de 5000 Hz para todos los canales
GPIO.frequency(5000)
// O establecer frecuencia solo para el pin 2
GPIO.frequency(2, 1000) // 1 kHz
getduty
Obtiene el valor actual del ciclo de trabajo (duty cycle) de un pin PWM.
var duty = GPIO.getduty(pin)
Parámetros:
| Parámetro | Descripción |
|---|---|
pin | Número del pin GPIO |
Retorna: Valor actual del ciclo de trabajo.
Ejemplo:
use GPIO
GPIO.awrite(2, 512)
var duty = GPIO.getduty(2)
println("Duty cycle actual: ", duty)
detach
Desasocia un pin de su canal PWM, liberando el canal para otros usos.
GPIO.detach(pin)
Parámetros:
| Parámetro | Descripción |
|---|---|
pin | Número del pin GPIO |
Ejemplo:
use GPIO
GPIO.awrite(2, 512)
// ... usar PWM ...
GPIO.detach(2) // Liberar el canal PWM
onInterrupt
Configura una interrupción por hardware en un pin GPIO. Cuando ocurre el evento especificado, se ejecuta la función callback.
GPIO.onInterrupt(pin, modo, callback)
Parámetros:
| Parámetro | Descripción |
|---|---|
pin | Número del pin GPIO |
modo | Tipo de evento que dispara la interrupción |
callback | Función a ejecutar cuando ocurre la interrupción |
Modos de interrupción:
| Constante | Descripción |
|---|---|
GPIO.RISING | Flanco de subida (LOW → HIGH) |
GPIO.FALLING | Flanco de bajada (HIGH → LOW) |
GPIO.CHANGE | Cualquier cambio de estado |
GPIO.ONLOW | Mientras el pin esté en nivel bajo |
GPIO.ONHIGH | Mientras el pin esté en nivel alto |
Ejemplo:
use GPIO
var contador = 0
func botonPresionado(pin, valor)
contador = contador + 1
println("Botón presionado! Contador: ", contador)
end
GPIO.pinmode(15, GPIO.PULLUP)
GPIO.onInterrupt(15, GPIO.FALLING, botonPresionado)
// El programa continúa ejecutándose
while (true)
pause(1000)
end
La función callback recibe dos parámetros: el número de pin y el valor actual del pin (0 o 1). El ESP32 soporta un máximo de 16 interrupciones GPIO simultáneas.
offInterrupt
Desactiva la interrupción asociada a un pin GPIO.
GPIO.offInterrupt(pin)
Parámetros:
| Parámetro | Descripción |
|---|---|
pin | Número del pin GPIO |
Ejemplo:
use GPIO
// Configurar interrupción
GPIO.onInterrupt(15, GPIO.FALLING, miCallback)
// ... más tarde, desactivar la interrupción
GPIO.offInterrupt(15)
Constantes
Modos de pin
| Constante | Valor | Descripción |
|---|---|---|
GPIO.INPUT | 0x01 | Modo entrada |
GPIO.OUTPUT | 0x02 | Modo salida |
GPIO.PULLUP | 0x05 | Modo entrada con resistencia pull-up |
GPIO.PULLDOWN | 0x09 | Modo entrada con resistencia pull-down |
GPIO.OPEN_DRAIN | 0x12 | Modo salida open-drain |
Modos de interrupción
| Constante | Valor | Descripción |
|---|---|---|
GPIO.RISING | 1 | Flanco de subida |
GPIO.FALLING | 2 | Flanco de bajada |
GPIO.CHANGE | 3 | Cualquier cambio |
GPIO.ONLOW | 4 | Nivel bajo |
GPIO.ONHIGH | 5 | Nivel alto |
Ejemplos
Parpadeo de LED
use GPIO
GPIO.pinmode(2, GPIO.OUTPUT)
while (true)
GPIO.write(2, 1)
pause(500)
GPIO.write(2, 0)
pause(500)
end
Control de brillo con PWM
use GPIO
GPIO.pinmode(2, GPIO.OUTPUT)
GPIO.resolution(2, 8) // 8 bits: 0-255
GPIO.frequency(2, 5000)
// Efecto de respiración
while (true)
// Aumentar brillo
for (var i = 0; i < 256; i = i + 5)
GPIO.awrite(2, i)
pause(20)
end
// Disminuir brillo
for (var i = 255; i >= 0; i = i - 5)
GPIO.awrite(2, i)
pause(20)
end
end
Lectura de botón con interrupción
use GPIO
var ledEncendido = false
func toggleLED(pin, valor)
ledEncendido = !ledEncendido
GPIO.write(2, ledEncendido)
end
// LED como salida
GPIO.pinmode(2, GPIO.OUTPUT)
// Botón con pull-up (activo en bajo)
GPIO.pinmode(15, GPIO.PULLUP)
GPIO.onInterrupt(15, GPIO.FALLING, toggleLED)
// Bucle principal
while (true)
pause(100)
end
Lectura analógica de sensor
use GPIO
while (true)
var valor = GPIO.aread(34)
var voltaje = valor * 3.3 / 4095
println("ADC: ", valor, " - Voltaje: ", voltaje, "V")
pause(500)
end