Saltar al contenido principal

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.

Captura del módulo GPIO de JARU para configurar pines digitales, entradas analógicas, PWM e interrupciones

Uso​

use GPIO

Funciones​

pinmode​

Configura el modo de operación de un pin GPIO.

GPIO.pinmode(pin, modo)

Parámetros:

ParámetroDescripción
pinNúmero del pin GPIO
modoModo de operación del pin

Modos disponibles:

ConstanteDescripción
GPIO.INPUTModo entrada
GPIO.OUTPUTModo salida
GPIO.PULLUPModo entrada con resistencia pull-up interna
GPIO.PULLDOWNModo entrada con resistencia pull-down interna
GPIO.OPEN_DRAINModo 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ámetroDescripción
pinNúmero del pin GPIO
valorValor 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ámetroDescripción
pinNú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ámetroDescripción
pinNú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)
Nota

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ámetroDescripción
pinNúmero del pin GPIO
valorValor 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)
Consejo

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.

nota

Si valor supera el máximo para la resolución configurada, se recorta automáticamente al máximo — no se lanza ningún error.


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ámetroDescripción
bitsResolución en bits (1-16)
pinNú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. La frecuencia por defecto para todos los canales es 2000 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ámetroDescripción
frecuenciaFrecuencia en Hz
pinNú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ámetroDescripción
pinNú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ámetroDescripción
pinNú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ámetroDescripción
pinNúmero del pin GPIO
modoTipo de evento que dispara la interrupción
callbackFunción a ejecutar cuando ocurre la interrupción: referencia directa (miFuncion), método de un objeto (objeto.metodo) o nombre en string ("miFuncion")

Modos de interrupción:

ConstanteDescripción
GPIO.RISINGFlanco de subida (LOW → HIGH)
GPIO.FALLINGFlanco de bajada (HIGH → LOW)
GPIO.CHANGECualquier cambio de estado
GPIO.ONLOWMientras el pin esté en nivel bajo
GPIO.ONHIGHMientras 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
Importante

La función callback recibe dos parámetros: el número de pin y el valor actual del pin (0 o 1). Si la firma no tiene exactamente 2 parámetros, el evento se descarta de forma silenciosa. El ESP32 soporta un máximo de 16 interrupciones GPIO simultáneas.

Ejemplo con un método de clase:

El callback también puede ser un método de una instancia; se ejecuta con su this y la interrupción mantiene viva la instancia mientras esté registrada:

use GPIO

class Boton
def init(pin)
this.pin = pin
this.pulsaciones = 0
GPIO.pinmode(pin, GPIO.PULLUP)
GPIO.onInterrupt(pin, GPIO.FALLING, this.onPulsar)
end

def onPulsar(pin, valor)
this.pulsaciones = this.pulsaciones + 1
end
end

var boton = Boton(15)

offInterrupt​

Desactiva la interrupción asociada a un pin GPIO.

GPIO.offInterrupt(pin)

Parámetros:

ParámetroDescripción
pinNú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​

ConstanteValorDescripción
GPIO.INPUT0x01Modo entrada
GPIO.OUTPUT0x02Modo salida
GPIO.PULLUP0x05Modo entrada con resistencia pull-up
GPIO.PULLDOWN0x09Modo entrada con resistencia pull-down
GPIO.OPEN_DRAIN0x12Modo salida open-drain

Modos de interrupción​

ConstanteValorDescripción
GPIO.RISING1Flanco de subida
GPIO.FALLING2Flanco de bajada
GPIO.CHANGE3Cualquier cambio
GPIO.ONLOW4Nivel bajo
GPIO.ONHIGH5Nivel 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