miércoles, 17 de febrero de 2016

Nodemcu escapar de un Bucle.

Ponte que un día estas probando nuevas ideas con Nodemcu y creas un while do en apariencia inofensivo,

local a = 3
local i = 0

while a < i do
i = i+1
end

Y para rematar lo guardamos y compilamos en el Nodemcu,.. Ya es tarde para resolver la que acabas de liar.

El nodemcu ha quedado "brikeado" ya que al llamar el init.lua ejecuta un while del que jamas saldras, aunque escribas la flash el maldito init.lua continua en la flash.

Solución:

Usando el flashseador del chip tenemos que rescribir las siguientes posiciones de memoria  0x7E000 y 0x7C000. Usando el nodemcu-flasher nos dirigimos a la segunda pestaña y añadimos las lineas

  • INTERNAL://BLANK | 0x7E000
  • INTERNAL://DEFAULT | 0x7C000
Tras flashear estas 2 direcciones el archivo init.lua queda sobrescrito y podemos volver a utilizar nuestra placa.

miércoles, 10 de febrero de 2016

Monitorizar temperatura con Nodemcu + lm35

Hace poco empece a trabajar con Nodemcu por que la relación calidad/precio puede adaptarse mejor a algunos proyectos que Arduino.

Vamos a empezar explicando un proyecto simple sobre Nodemcu: Capturar la temperatura y enviarla a thingspeak.com que podemos adaptar sin problemas a nuestras necesidades

¿Por que thingspeak.com y que es?


thingspeak.com es básicamente en recolector de datos para los IoT con un API accesible y que nos ayuda a ver como realizar acciones mas complejas, El api soporta GET y POST, en este ejemplo nos vamos a realizar las peticiones en POST. Así que para continuar vamos a realizar los siguientes pasos.


  • Registrare en thingspeak.com.
  • Crea un Canal en Channels -> New Channel.
  • En el Field 1 le asignamos un nombre cualquiera.
  • Una vez generado todo entramos al canal y nos dirigimos a API Key -> Write API Key y la copiamos.
Ya tenemos generado nuestro canal que almacenara la información recibida por el sensor, nos podemos centrar en muestro código.

Yo suelo utilizar Atom como IDE ESPlorer para cargarlo al Nodemcu. Recordar que para que el Nodemcu "lea" el archivo al iniciar este tiene que llamarse init.lua


Esquema Fisico


Misterio 0, el lm35 va directo al A0 y alimentado al 3V


Funciones paso a paso


Lo primero es declarar las "variables globales" para que sean fácilmente localizables.Es importante comentar que vamos a describirlas como objetos diferentes ya que cada una se ejecutara como una funcion,Las funciones no te permiten usar libremente variables declaradas aquí o allá, pero sirve para organizar e independizar el código 

Conexión


Vamos a realizar la conexión a la wifi y seria la espina dorsal de nuestro scritp ya que resolución condiciona a el resto.
 function conectar(SSID, PASSWORD, HOST)  
     wifi.setmode(wifi.STATION)  
     wifi.sta.config(SSID, PASSWORD)  
     if wifi.sta.status() == 5 then  
       print("Conectado IP: " .. wifi.sta.getip())  
       tmr.alarm(0, 600000, 1, function()  
         socket = net.createConnection(net.TCP,0)  
         socket:connect(80,HOST)  
         socket:on("connection",function(sck)  
         local post_request = generar_datos(HOST)  
         sck:send(post_request)  
         end)  
       end)  
     else  
       print("Error de Conexion")  
       tmr.alarm(0, 60000, 1, function() conectar(SSID, PASSWORD, HOST) end)  
     end  
 end  

La función conectar trae del gobal el nombre del ssid, la contraseña y el host a que enviaremos el Post.

Una vez iniciado seleccionamos el modo STATION y le pasamos la configuracion de acceso a la red Wifi, Una vez realizado, comprobamos el estado de la conexión.

Si genera algún error, esperamos 1 minutos y volvemos a probar.
En caso de conectar mostramos por el serial la IP asignada y le damos 5 minutos para lanzar el post.

Bien una vez listo abrimos un Socket a la IP de thingspeak al puerto 80, una vez el Socket esta "conectado" llamamos a la cabecera HTML con los datos del POST (mas abaja la explicamos) y lo enviamos por el socket y listo.

Esto lo realizamos para no "bombardear" el servidor con datos ya que el Nodemcu por defecto ejecutara un LOOP de todo el código.

Temperatura


La temperatura temperatura (en celsius) es una formula sobre los registros del puerto (A0)

 function Temperatura()  
   local r = adc.read(0)  
    local c = r * 285 / 1024  
   return c  
 end  

Leemos el Analógico 0, la formula de conversión y devolvemos el resultado, así de simple


Generar POST



Aquí tenemos que preparar la cabecera HTML y preparar la llamada POST

 function generar_datos(HOST)  
   API_KEY = "api_key"  
   temperatura = Temperatura()  
   YO = wifi.sta.getip()  
   print("Temperatura"..temperatura.."C\n")  
 -- Preparamos el POST  
   data_post = "api_key="..API_KEY.."&field1="..temperatura  
 -- Lanzamos el POST  
   cabecera_post = "POST https://"..HOST.."/update HTTP/1.1\r\n"..  
    "Host: "..YO.."\r\n"..  
    "Connection: close\r\n"..  
    "Content-Type: application/x-www-form-urlencoded\r\n"..  
    "Content-Length: "..string.len(data_post).."\r\n"..  
    "\r\n"..data_post  
    return cabecera_post  
 end  

Paso por Paso, declaramos nuestra API KEY creada en thingspeak.

  • Almacenamos temperatura (calculada en su función)
  • Almacenamos nuestra IP para la cabecera HTML
  • Formateamos los datos POST, en este caso enviamos la llave y el campo uno, si por ejemplo fueran 2 campos añadiríamos &field2=DATO
  • Creamos la cabecera HTML lo mas importante a comentar es el Content-Length que lo calculamos con el string.len (por ello formateamos y almacenamos el POST anteriormente)
  • Listo devolvemos la petición ya formateada.

LISTO, con esto ya estamos comunicando los datos correctamente y el servidor realizara la recolección y muestra.

El ejemplo completo lo puedes encontrar Aqui