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.

JARU GPIO Module

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.


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.

// 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

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). 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á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