Mostrando entradas con la etiqueta NodeMCU API. Mostrar todas las entradas
Mostrando entradas con la etiqueta NodeMCU API. Mostrar todas las entradas

lunes, 4 de enero de 2016

NodeMCU y App Inventor


En este artículo voy a tratar de controlar los puerto GPIO del ESP8266 a través de una aplicación desarrollada con App Inventor.



Nota: si quieres aprender más sobre APP Inventor puedes consultar mi blog AppInventor a muete.

El esquema es sencillo y básico ya que simplemente voy a encender y apagar un led conectado al pin 2 del ESP8266:


Untitled Sketch_bb.png

El código LUA completo es el siguiente:

wifi.setmode(wifi.STATION)

wifi.sta.config("SSID WiFi","password WiFi")
print(wifi.sta.getip()) -- Muestra la IP
tmr.delay(5000)
-- Inicializa el puerto al que está conectado el Led

gpio.mode(2, gpio.OUTPUT)

gpio.write(2, gpio.LOW);
-- Servicios WEB
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
    conn:on("receive", function(client,request)
       local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP")
       if(method == nil)then
            _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP")
        end
        local _GET = {}
        if (vars ~= nil)then
            for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
                _GET[k] = v
            end
        end
        if(_GET.pin == "ON")then
              gpio.write(2, gpio.HIGH)
        elseif(_GET.pin == "OFF")then
              gpio.write(2, gpio.LOW)
        end
        print(_GET.pin) -- Para DEBUG
        client:close()
        collectgarbage()
    end)
end)

El código del programa es una modificación del ejemplo webap_toggle_pin presente en los ejemplos de lua en GitHub

En este caso, no se trata de enviar ninguna página web a un cliente que se conecte. La parte principal del programa es “capturar” los valores de la variable pin que se reciben en las peticiones a través del formato de la url recibida.

Ahora vamos con la aplicación android realizada con App Inventor 2. En la siguiente imagen se muestra un pantallazo de la aplicación corriendo en un dispositivo.


Screenshot_2016-01-04-22-33-48.png


En cuanto al programa realizado en App Inventor 2, hay que introducir manualmente la dirección IP en TextBox1 asignado al módulo NodeMCU (se almacena en TinyDB1 con tag = espaddress) y luego enviar los comandos a dicha dirección para encender y apagar el Led (TextBox1 se muestra cuando se hace pulsa el botón SET).

Pantallazo01.png

La parte principal del programa es la siguiente:

Pantallazo02.png

En ella, se compone un mensaje formado por http://direcciónIP/?pin=ON para encender el Led y http://direcciónIP/?pin=OFF para apagar el Led.

Para pasar una variable a través de una url se utiliza el formato:
http://example.com/pagina2.html?variable=valor

Luego, el módulo ESP8266 se encarga de capturar el valor de dichas variables y actuar en consecuencia.

La petición recibida cuando se pulsa el botón ON en la aplicación:

GET /?pin=ON HTTP/1.1
Host: 192.168.1.43
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; Android 5.0.2; XT1068 Build/LXB22.99-16.3; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/46.0.2490.76 Mobile Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: es-ES,en-US;q=0.8
X-Requested-With: appinventor.ai_miguel_diazgomez.ESP8266_GPIO_Control

La petición recibida cuando se pulsa el botón OFF en la aplicación:

GET /?pin=OFF HTTP/1.1
Host: 192.168.1.43
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; Android 5.0.2; XT1068 Build/LXB22.99-16.3; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/46.0.2490.76 Mobile Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: es-ES,en-US;q=0.8
X-Requested-With: appinventor.ai_miguel_diazgomez.ESP8266_GPIO_Control


Pueden descargar el programa en este enlace y las fuentes en este otro.

Fuentes:
https://www.youtube.com/watch?v=qWKcOnoyBzE

 

viernes, 1 de enero de 2016

Modulo adc

adc.read()

Descripción

Lee el valor del conversor analógico digital de 10 bits del módilo ESP8266 (pin 0)
 
nodemcudevkit_v1-0_io.jpg
Sintaxis
adc.read(id)

Parámetros

id = 0

Devuelve

valor obtenido del conversor analógico digital


adc.readvdd33()

Descripción

Lee el voltaje en el pin vdd33

Sintaxis

adc.readvdd33()

Parámetros

sin parámetros

Devuelve

medición en mV

Ejemplo

print(adc.readvdd33())
resultado:
3345


v = adc.readvdd33() / 1000
print(v)
v=nil
resultado:
3.315

viernes, 18 de diciembre de 2015

Módulo file

file.remove()
Descripción
borra un archivo del sistema de ficheros.
Sintaxis
file.remove(filename)
Parámetros
filename: archivo a borrar
Devuelve
nada
Ejemplo
-- borra el archivo "foo.lua".
file.remove("foo.lua")
file.open()
Descripción
abre un archivo.
Sintaxis
file.open(filename, mode)
Parámetros
filename: archivo a abrir (no admite directorios)
mode:
  • "r": modo lectura (por defecto)
  • "w": modo escritura (sobreescribe el fichero existente)
  • "a": modo añadir (añade al texto existente)
  • "r+": modo actualizar (preserva los datos existentes)
  • "w+": modo actualizar (elimina los datos existentes)
  • "a+": modo añadir actualizado (preserva los datos existentes y añade al final del archivo)

 
Devuelve
nil: archivo no abierto o no existe. true: archivo abierto correctamente.
Ejemplo
-- abre el archivo 'init.lua', muestra la primera línea.
file.open("init.lua", "r")
print(file.readline())
file.close()
file.close()
Descripción
cierra un archivo.
Sintaxis
file.close()
Parámetros
ninguno
Devuelve
nada
Ejemplo
-- abre 'init.lua', muestra la primera línea.
file.open("init.lua", "r")
print(file.readline())
file.close()
file.readline()
Descripción
lee una línea de un archivo abierto previamente.
Sintaxis
file.readline()
Parámetros
ninguno
Devuelve
contenido del archivo en formato string, línea a línea, incluido EOL (End Of Line)('\n')
devuelve nil cuando se llega al final del archivo (EOF - End Of File).
Ejemplo
-- muestra la primera línea de 'init.lua'
file.open("init.lua", "r")
print(file.readline())
file.close()
file.writeline()
Descripción
escribe un string en el archivo incluyendo '\n' al final del string.
Sintaxis
file.writeline(string)
Parámetros
string: contenido que se escribirá en el archivo
Devuelve
true: escritura correcta. nil: error de escritura
Ejemplo
-- abre 'init.lua' en modo 'a+'
file.open("init.lua", "a+")
-- escribe 'foo bar' al final del archivo
file.writeline('foo bar')
file.close()
file.read()
Descripción
lee el contenido del archivo abierto previamente.
Sintaxis
file.read()
Parámetros
si no se incluye ninguno, lee todos los bytes del archivo.
si pasamos un número  n, lee n byte del archivo, o hasta que llegue al final del fichero (EOF)
si pasamos un string "q", entonces lle hasta  'q' o final del fichero (EOF).
Devuelve
el contenido del archivo en formato string
devuelve nil cuando EOF.
Ejemplo
-- muestra la primera línea de 'init.lua'
file.open("init.lua", "r")
print(file.read('\r'))
file.close()

-- muestra los primeros 5 byte de 'init.lua'
file.open("init.lua", "r")
print(file.read(5))
file.close()
file.write()
Descripción
escribe string en un archivo.
Sintaxis
file.write(string)
Parámetros
string: contenido que se escribirá en el archivo.
Devuelve
true: escritura correcta. nil: error de escritura
Ejemplo
-- abre 'init.lua' en modo 'a+’
file.open("init.lua", "a+")
-- escribe 'foo bar' al final del fichero
file.write('foo bar')
file.close()
file.flush()
Descripción
flush to file.
Sintaxis
file.flush()
Parámetros
ninguno
Devuelve
nada
Ejemplo
-- abren 'init.lua' en modo 'a+'
file.open("init.lua", "a+")
-- escribe 'foo bar' al final del archivo
file.write('foo bar')
file.flush()
file.close()
file.seek()
Descripción
Sets and gets the file position, measured from the beginning of the file, to the position given by offset plus a base specified by the string whence.
Se establece y obtiene la posición del fichero, medido desde su inicio a la posición especificada.
Sintaxis
file.seek(whence, offset)
Parámetros
whence:
  • "set": tomo como base la posición 0 (comienzo del archivo);
  • "cur": toma como base la posición actual (valor por defecto)
  • "end": toma como base el final del fichero;
offset: por defecto 0
Devuelve
sucede correctamente: devuelve la posición final del archivo
fallo: devuelve nil
Ejemplo
-- abre 'init.lua' en modo 'a+
file.open("init.lua", "a+")
-- escribe 'foo bar' al final del archivo
file.write('foo bar')
file.flush()
file.seek("set")
print(file.readline())
file.close()
file.list()
Descripción
lista todos los archivos.
Sintaxis
file.list()
Parámetros
ninguno
Devuelve
una tabla lua que contiene pares de {nombre archivo: tamaño archivo}
Ejemplo
l = file.list();
for k,v in pairs(l) do
   print("name:"..k..", size:"..v)
end
file.format()
Descripción
formatea el sistema de archivos.
Sintaxis
file.format()
Parámetros
ninguno
Devuelve
nada
Ejemplo
file.format()
file.rename()
Descripción
renombre un archivo. NOTA: el archivo actualmente abierto se cerrará
Sintaxis
file.rename(oldname, newname)
Parámetros
oldname: nombre viejo, directorios no soportados
newname: nuevo nombre, directorios no soportados
Devuelve
false: fallo en el renombre. true: renombrado ok.
Ejemplo
-- renombra el archivo 'temp.lua' a 'init.lua'.
file.rename("temp.lua","init.lua")
file.fsinfo()
Descripción
obtiene información del sistema de archivos
Sintaxis
file.fsinfo()
Parámetros
ninguno
Devuelve
restante (número)
usado (number)
total (number)
Ejemplo
-- obtiene información del sistema de archivos
remaining, used, total=file.fsinfo()
print("\nFile system info:\nTotal : "..total.." Bytes\nUsed : "..used.."
Bytes\nRemain: "..remaining.." Bytes\n")