Un GPIO (General Purpose Input/Output) es un pin que podemos usar como interfaz con el mundo exterior.
Podemos usar un pin GPIO como entrada (input) al presionar un botón o como salida (output) para iluminar un led.
El módulo GPIO contiene las instrucciones para el uso de los pines de entrada y salida.
gpio.mode()
Descripción
Establece el modo en que se comportará un puerto GPIO, indicando si va a ser de entrada o salida. Esta instrucción es la primera que necesitamos especificar cuando queremos usar un pin GPIO
Sintaxis
gpio.mode(pin, mode, pullup)
Parámetros
pin: 0~12
mode: gpio.OUTPUT (salida), gpio.INPUT (entrada) o gpio.INT (modo interrupción que se ejecutará cada vez que cambia el valor del pin)
pullup: gpio.PULLUP or gpio.FLOAT, por defecto: gpio.FLOAT.
Devuelve
nil
Ejemplo
-- establece gpio 0 como salida.
gpio.mode(0, gpio.OUTPUT)
Nota
gpio.mode(0, gpio.OUTPUT)
Nota
No existe una relación directa entre el número de pin (Dx) y el GPIO en la placa. En el siguiente esquema se puede apreciar esta relación.
Por ejemplo el pin D0 corresponde al GPIO16.
gpio.read()
Descripción
Lee el valor de un pin.
Sintaxis
gpio.read(pin)
Parámetros
pin: 0~12
Devuelve
número: 0 - nivel bajo, 1 - nivel alto
Ejemplo
-- Lee el valor de GPIO 0
gpio.read(0)
gpio.read(0)
gpio.write()
Descripción
Establece el valor de un pin
Sintaxis
gpio.write(pin,level)
Parámetros
pin: 0~12
level: gpio.HIGH o gpio.LOW
Devuelve
nil
Ejemplo
-- set pin index 1 to GPIO mode, and set the pin to high.
pin=1
gpio.mode(pin, gpio.OUTPUT)
gpio.write(pin, gpio.HIGH)
pin=1
gpio.mode(pin, gpio.OUTPUT)
gpio.write(pin, gpio.HIGH)
gpio.trig()
Descripción
Establece la función que se ejecutará cuando se produce una interrupción, o sea, un cambio del valor de un pin.
Sintaxis
gpio.trig(pin, type, function(level))
Parámetros
pin: 1~12 (el pin D0 no soporta interrupciones)
type: "up", "down", "both", "low", "high". Esto indica cuando se produce la señal si durante la bajada o subida de la señal o cuando adquiere un valor determinado. Si se utiliza este último parámetro la interrupción se producirá repetidamente mientras se encuentre en el nivel configurado.
function(level): función que será llamada cuando se produzca la interrupción. Level es el parámetro
Devuelve
nil
Ejemplo
-- usamos el pin 0 como entrada para un contador de pulsos
pulse1 = 0
du = 0
gpio.mode(1,gpio.INT)
function pin1cb(level)
du = tmr.now() – pulse1
print(du)
pulse1 = tmr.now()
if level == 1 then gpio.trig(1, "down") else gpio.trig(1, "up")
pulse1 = 0
du = 0
gpio.mode(1,gpio.INT)
function pin1cb(level)
du = tmr.now() – pulse1
print(du)
pulse1 = tmr.now()
if level == 1 then gpio.trig(1, "down") else gpio.trig(1, "up")
end
end
gpio.trig(1, "down",pin1cb)
Nota:
end
gpio.trig(1, "down",pin1cb)
Nota:
Supresión de rebotes
Si conecta simplemente un pulsador a la entrada para generar una interrupción, es posible que se produzcan efectos indeseados debido a que al pulsar un botón no se produce una señal “limpia” y eso podría ocasionar efectos no deseados.
Este efecto se puede mitigar de dos formas: por hardware y por software.
Por hardware utilizando un circuito antirebote como el indicado en el siguiente esquema:
Por software la forma más sencilla para mitigar este rebote es ignorar eventos para un corto período de tiempo después de producirse un cambio en el estado. A continuación se muestra un ejemplo:
local pin = 4 --> GPIO2
function debounce (func)
local last = 0
local delay = 200000
return function (...)
local now = tmr.now()
if now - last < delay then return
end
last = now return func(...)
end
end
function onChange ()
print('The pin value has changed to '..gpio.read(pin))
end
gpio.mode(pin, gpio.INT)
gpio.trig(pin, 'both', debounce(onChange))
La función debounce() toma una función como argumento y lo envuelve en otro. Cuando la función externa se llama, a continuación llama a la función interna, pero sólo si no se ha llamado en los últimos 5000us (5ms).
Fuentes:
- NodeMCU API - gipo.mode()
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.