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 y
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