NodeMCU: AppInventor

Standard

Es típico que cuando hacemos un proyecto de Internet de las Cosas (IoT) queramos poder interactuar con él de forma remota y qué mejor que hacerlo a través de un dispositivo móvil como un smartphone o una tablet. Se puede, por supuesto, abrir la página en el navegador del dispositivo pero no hay nada como tener tu propia app que haga todo ese trabajo sucio y en la cual solamente tengas que dar tap a un botón.

En este tutorial crearemos una app usando AppInventor, un servicio en línea que se gestiona en el MIT (Instituto Tecnológico de Massachusetts) y que permite hacer aplicaciones para Android (así es, querido Apple fan, es hora de que aceptes la realidad) de una forma sencilla, rápida, pero con herramientas poderosas que te permiten crear aplicaciones con mucho potencial.

Esa app la comunicaremos con el NodeMCU para encender o apagar un LED desde Android y para recibir una alerta cuando se presione un push button conectado al NodeMCU.

El proceso se va a dividir en 4 partes.

  • Electrónica
  • Programación del NodeMCU
  • Creación de la App en AppInventor
  • Hacer pruebas en el dispositivo Android

Electrónica

  1. Haz el siguiente circuito simple:

 

NodeMCU

1. En primer lugar deberás de cargar los siguientes programas de Lua a la placa. Si no tienes ni idea de qué estoy hablando puedes checar los posts anteriores.

En un archivo nombrado init.lua copia y pega el siguiente texto:

dofile("android.lua")

En otro archivo que nombrarás android.lua copia y pega el siguiente texto (analiza qué es lo que se está haciendo en cada parte, los comentarios te ayudarán a entenderlo):

--me conecto a la red de la casa
wifi.setmode(wifi.STATION)
wifi.sta.config("Intelirobot","12345678")
print(wifi.sta.getip())
print(wifi.sta.getmac())


pinBoton = 3
PRESIONADO = gpio.HIGH
NO_ESTA_PRESIONADO = gpio.LOW
valorBoton = 0
tiempoRepeticion = 500

--modo de funcionamiento del pin del boton es de entrada
gpio.mode( pinBoton, gpio.INPUT, gpio.PULLUP )

--funcion para leer el boton
local function leerBoton() 
 valorBoton = gpio.read(pinBoton)
 print( valorBoton )
end

--Un servidor solo se debe de crear una vez, para evitar
--multiples servidores, la siguiente línea se asegura de que
--en caso de que exista ya un servidor abierto, lo cierra.
if srv ~= nil then
 srv:close()
end

--creo una variable llamada outpin (yo definí ese nombre) y 
--enciende el pin 4 
ledAzul = 4

--timer que cada 2 segundos manda llamar
--a la función leerBoton
tmr.alarm(1, tiempoRepeticion, 1, leerBoton)

--inicio el servidor en el puerto 150
srv=net.createServer(net.TCP) srv:listen(150,function(conn)
 --cuando alguien se conecta al servidor hago lo siguiente
 conn:on("receive",function(conn, payload)
 --payload es una variable de texto muuuy larga que 
 --contiene la información del cliente que se conecta
 --es decir, del usuario que abrio el link
 --en esta variable se encuentra la IP del usuario y 
 --las variables de los botones que presiona
 --print(payload)

--esta es una funcion que controla el encendido y apagado
 --de un led
 
 function condicionesDeMiPrograma()
 -- defino que el pin 4 va a ser de salida
 gpio.mode(ledAzul,gpio.OUTPUT)
 --cree una variable llamada valorLeido y me trae el valor
 --del INPUT de HTML, del boton.
 --obtengo el substring de payload desde donde --
 --encontro la variable (arregloConValores[2]+1) hasta el tamaño 
 -- de payload (#payload)
 valorLeido=string.sub(payload,arregloConValores[2]+1,#payload)
 --enciendo o apago el LED segun el boton presionado
 if valorLeido=="valor1" then gpio.write(ledAzul,gpio.HIGH)return end
 if valorLeido=="valor2" then gpio.write(ledAzul,gpio.LOW)return end
 end
 
 --de la cadena de payload, busco donde esta valor1 y lo almaceno
 -- en la variable arregloConValores
 arregloConValores={string.find(payload,"valor=")}
 
 --si encuenta pwmi lo almacena en la segunda posicion de
 --la variable, si contiene información, mando llamar a la funcion
 -- condicionesDeMiPrograma
 if arregloConValores[2]~=nil then 
 condicionesDeMiPrograma()
 end

--defino la pagina web
 header = "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"
 conn:send(header)
 conn:send(valorBoton)

--despues de que recibi una conexión, la cierro.
 conn:on("sent",function(conn) conn:close() end)
 end)
end)
-- termina la inicializacion del servidor en el puerto 150

Pon especial atención en la IP que te asigna el modem y que puedes visualizar en la ventana de la derecha, en este ejemplo es 192.168.1.111

Y también verifica muy bien en el código el puerto que tiene programado, en este ejemplo es el 150

 

AppInventor

Continuaremos con la creación de la app a través de App Inventor

1. Accede al sitio web de AppInventor http://appinventor.mit.edu/explore/ y da clic en el botón “Create apps!”

2. AppInventor te va a pedir acceso a tu cuenta de Google, en caso de que no tengas cuenta debes de crear una.

3. Ahora, desde la plataforma de AppInventor hay que crear un proyecto nuevo en la opción “Start new project”.

4. Se define el nombre del proyecto, que en este caso fue nombrado “NodeMCU”, deberá de aparecer una pantalla como la siguiente:

  • En el panel izquierdo aparecen los objetos que pueden ser utilizados para crear la app.
  • En el panel central aparece un emulador de la pantalla de un dispositivo Android.
  • El tercer panel es el encargado de mostrar los objetos que están siendo utilizados en el proyecto.
  • En el panel derecho aparecen las propiedades del objeto actualmente seleccionado.

5. Del panel izquierdo se deben de arrastar al centro de la pantalla dos botones (User Interface > Button), un objeto de sonido (Media > Play), un reloj (Sensors > Clock) y un servicio web (Conectivity > Web). Después de este paso deberían de tener una pantalla como la siguiente:

6. Para comenzar a programar los elementos que hasta ahora tenemos en el panel, es necesario dar clic al botón “Blocks” que se encuentra en la esquina superior derecha.

 

7. En esta sección se programa cada uno de los elementos seleccionados, por ahora el objetivo es llegar al siguiente programa pero deberás reemplazar la IP http://192.168.1.111:150 que tiene el programa de AppInventor por la IP y el puerto que habías definido anteriormente.

Pruebas en Android

Integraremos ambas partes, pero para ello necesitamos bajar e instalar una app en nuestro celular o tablet.

1. Desde tu dispositivo Android, accede a GooglePlay y descarga la app MIT AI2 Companion

2. Ábrela y asegúrate que aparezca una pantalla como la siguiente:

3. En la web de AppInventor da click en Connect > AI Companion y escanea el código QR que aparece en pantalla utilizando el botón “scan QR code” de la app. Tanto el dispositivo Android como la computadora deben estar conectadas en la misma red para que la conexión se logré. Si todo sale bien, la aplicación debería de mostrarse en la pantalla del dispositivo Android.

¡Y listo! ahora podrás controlar el encendido y apagado del LED azul de la placa utilizando los botones de la aplicación y cuando presiones el botón que conectaste al NodeMCU debería de vibrar el celular o tablet. A partir de este punto, se puede hacer lo que tu imaginación te permita, tal vez poner un sensor de movimiento que te mande una notificación cuando detecte un intruso o controlar un relevador pero ahora con una aplicación Android. ¿Qué se te ocurre?

Deja tus observaciones en los comentarios y no dudes en preguntar si tienes alguna duda.

Comments

comments

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *