viernes, 18 de diciembre de 2015

Creando un servidor WEB


Aprovechando el circuito utilizado en el artículo “Practicando con el sensor DHT11” vamos a activar un servidor web para que muestre la información de temperatura y humedad a cualquier navegador que se conecte a nuestro NodeMCU a través de Wifi.

El código completo es el siguiente:

--Nos conectamos a la red Wifi

wifi.setmode(wifi.STATION)
wifi.sta.config("WLAN_E17C","ced0ccb58c84e525e35f")
print(wifi.sta.getip())

tmr.delay(5000)

-- Declaración de variables
pin = 5
humi=0
temp=0
--Función leer sensor DH11
function LeerDHT11()
status,temp,humi = dht.read11(pin)
if( status == dht.OK ) then
 print("DHT Temperatura: "..temp.."ºC - Humedad: "..humi.." %")
 elseif( status == dht.ERROR_CHECKSUM ) then
 print( "DHT Checksum error." );
 elseif( status == dht.ERROR_TIMEOUT ) then
 print( "DHT Time out." );
 end
end
-- Ejecuta la lectura por primera vez
LeerDHT11()
-- Timer que lee periódicamente la temperatura y la humedad
tmr.alarm(1,5000, 1, function() LeerDHT11() end)
-- Activamos el servidor WEB
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
 conn:on("receive",function(conn,payload)
 -- Enviamos la página web
 conn:send("HTTP/1.1 200 OK\n\n")
 conn:send("<!DOCTYPE HTML>")
 conn:send("<html><head><meta http-equiv=\"refresh\" content=\"5\"></head><body>")
 conn:send("<h2>Estación Meteorológica con sensor DHT11</h2>")
 conn:send("Temperatura: "..temp.." ºC<br>")
 conn:send("Humedad : "..humi.." %<br>")
 conn:send("</body></html>")
 conn:on("sent",function(conn) conn:close() end)
 end)
end)


Lo primero que hacemos es conectar el módulo a nuestra red wifi (para más información consultar la API módulo wifi):
--Nos conectamos a la red wifi
wifi.setmode(wifi.STATION) -- Modo Station
wifi.sta.config("SSID","password") -- Nos conectamos al AP
print(wifi.sta.getip()) -- Mostramos la IP por el puerto serie
tmr.delay(5000) -- pausa durante 5 segundos

A continuación declaramos las variables que vamos a utilizar:
pin = 5 -- Puerto de Datos de nuestro sensor DHT11
humi=0 -- Variable Humedad
temp=0 -- Variable Temperatura

Definimos la función que lee el sensor DHT11:
--Función leer sensor DH11
function LeerDHT11()
status,temp,humi = dht.read11(pin) -- Lee los datos del sensor
if( status == dht.OK ) then -- ¿Lectura correcta?
 -- Muestra por el puerto serie la temperatura y la humedad
 print("DHT Temperatura: "..temp.."ºC - Humedad: "..humi.." %")
 elseif( status == dht.ERROR_CHECKSUM ) then -- Lectura errónea
 -- Muestra por el puerto serie los códigos de error
 print( "DHT Checksum error." );
 elseif( status == dht.ERROR_TIMEOUT ) then
 print( "DHT Time out." );
 end
end
LeerDHT11() -- Primera lectura de la temperatura y humedad

A continuación configuramos el timer 1 la alarma para que cada 5 segundos haga una lectura de la temperatura y la humedad:
-- Timer que lee periódicamente la temperatura y la humedad
tmr.alarm(1,5000, 1, function() LeerDHT11() end)

Por último, creamos un servidor web que nos mostrará en la pantalla de nuestro navegador la temperatura y la humedad (para más información consultar la API Módulo net).
-- Activamos el servidor WEB
srv=net.createServer(net.TCP) --Creamos el servidor
srv:listen(80,function(conn) -- Escuchamos el puerto 80 (Http)
 conn:on("receive",function(conn,payload)
 -- Enviamos la página web
 conn:send("HTTP/1.1 200 OK\n\n")
 conn:send("<!DOCTYPE HTML>")
 conn:send("<html><head><meta http-equiv=\"refresh\" content=\"5\"></head><body>")
 conn:send("<h2>Estación Meteorológica con sensor DHT11</h2>")
 conn:send("Temperatura: "..temp.." ºC<br>")
 conn:send("Humedad : "..humi.." %<br>")
 conn:send("</body></html>")
 conn:on("sent",function(conn) conn:close() end)
 end)
end)

En nuestro navegador, si indicamos la url http://direcciónIP nos mostrará una pantalla como esta:

Captura.PNG


Explicación del código HTML:

HTTP/1.1 200 OK\n\n
Código de estado HTTP: Respuesta estándar para peticiones correctas
<meta http-equiv=\"refresh\" content=\"5\">
Hace que la página se refresque cada 5 segundos en nuestro navegador (o sea, cada 5 segundos nuestro navegador hará una petición http a la dirección IP de nuestro módulo) - Ver http://aprende-web.net/html/html8_2.php

\”
conn:send() envía todo lo que está entre los paréntesis. Si hay un string, tenemos que indicarlo entre comillas. Si en el código HTML hay unas comillas, para enviar correctamente el código de la página, hay que anteponer \

..
En código HTML eso es concatenar, es decir unir dos string.


Nota:
Existe otra forma de mostrar una página web y es separando el código init.lua del código correspondiente al servidor. De esta forma, podemos variar el código de la página web sin tener que modificar el fichero init.lua.

Para ello, creamos un fichero denominado server.lua con el siguiente código:
-- Activamos el servidor WEB
srv=net.createServer(net.TCP) --Creamos el servidor
srv:listen(80,function(conn) -- Escuchamos el puerto 80 (Http)
 conn:on("receive",function(conn,payload)
 -- Enviamos la página web
 conn:send("HTTP/1.1 200 OK\n\n")
 conn:send("<!DOCTYPE HTML>")
 conn:send("<html><head><meta http-equiv=\"refresh\" content=\"5\"></head><body>")
 conn:send("<h2>Estación Meteorológica con sensor DHT11</h2>")
 conn:send("Temperatura: "..temp.." ºC<br>")
 conn:send("Humedad : "..humi.." %<br>")
 conn:send("</body></html>")
 conn:on("sent",function(conn) conn:close() end)
 end)
end)

Este código es sustituido en el programa init.lua por:
dofile("server.lua")

dofile() abre el fichero con el nombre dado y ejecuta su contenido.


Fuentes:

 
 


No hay comentarios:

Publicar un comentario

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