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

 

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.