Introducción:
El objetivo de esta práctica es crear un servidor
web con arduino a través de su placa complementaria de Ethernet (Ethernet
Shield), y visualizarlo desde fuera de una red local. Además en la página, debe
leerse un sensor, previamente colocado en arduino, de temperatura (LM35) y
visualizar la temperatura con un refresco de tiempo continuo.
Desarrollo:
Lo primero que hice fue desarrollar un programa de lectura
de temperatura, el LM35 es un chip que lee temperatura en y ofrece una salida de 10 mV por grado centígrado.
Por ello lo que haremos será colocar el chip LM35 a un pin analógico de
arduino, en mi caso al 4, y hacemos una conversión para que nos muestre el
valor directamente en grados centígrados. Si 10 mV
es un grado centígrado y el pin analógico abarca un rango de valores entre 0 y
1024, primero hay que convertir el valor leído por el pin a mili voltios, dado
que 5 v es la tensión máxima, 5000 mv corresponde a 1023 el valor máximo analógico,
si tenemos l valor analógico que lee el pin aplicando una regla de tres podemos
sacar el valor en mili voltios que corresponde al valor analógico en cada
momento:
Con el valor en mili voltios, tan lo hay
que dividirlo entre 10 para sacar el valor en grados centígrados ya que 1 grado
eran 10 mV para el sensor.
Programa temepratura:
…………………………………………………………………………………….
float tempC;
int tempPin =4; // Definimos la entrada
en pin A0
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run
repeatedly:
tempC =
analogRead(tempPin);
Serial.println(tempC);
// Convierte el valor a temperatura
tempC = (5* tempC * 100.0)/1023.0;
// Envia el dato al puerto serial
Serial.println(tempC);
Serial.println(" grados Celsius\n");
// Espera cinco segundo para repetir el loop
delay(3000);
}
…………………………………………………………………………………..
El programa principal es donde integraremos el servidor web,
para ello utilizaremos las librerías Ethernet y SPI la primera la utilizaremos
para configurar ll servidor web (IP,MAC…) la segunda es para comunicarnos por
el BUS SPI con la placa de Ethernet de Arduino.
Para poder realizar esta práctica con éxito debemos abrir un
puerto en nuestro router para permitir conectarse nuestro servidor ya que
alojaremos el servidor en mi red local y si quiero acceder desde la red pública
e de abrir un puerto.
Como se puede apreciar en la imagen superior, abrí el puerto
80 en mi router para una IP específica (192.168.1.30) que es la que por programación
le he dado a mi servidor web.
De este modo introduciendo esa IP como URL en un red pública,
el router lo detecta y lo renvía al puerto abierto para esa IP, el 80 en mi
caso.
A continuación muestro el programa final, con explicaciones básicas
de cada comando, excepto el código HTML que es el que he usado para formar la página,
ya que he usado un formato estándar de programación y no tengo conocimiento
suficiente para dar una explicación detallada.
Programa Principal:
…………………………………………………………………………………………….
/*
/////////////////////////////////////////////////////////////////////////////
// Autor: Guillermo Cayetano Espejo 23/11/2016//
/////////////////////////////////////////////////////////////////////////////
// Programa:Servidor Web con sensor de temoeratura Version: 1.0
// Dispositivo:Atmel 328
Compilador:AVR
// Entorno IDE: 1.6.12 Simulador:
Vitronic
// Tarjeta de aplicacion:
Arduino
Debugger:
////////////////////////////////////////////////////////////////////////////
//Consista en leer la entrada analogica de un sensor de
temperatura //
// analogica de un sensor de temperatura y subirla a un
servidor web. //
////////////////////////////////////////////////////////////////////////////
*/
/////////////////LIBRERIAS//////////////////////////////////////////////////
#include <SPI.h> //Definimos la libreria de la
comunicacion SPI (#include es una directiva que le dice al compilador que
busque
//la libreria escrita).
#include <Ethernet.h> // Definimos la libreria
Ethernet
byte mac[]={0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; //
Escribimos la MAC de nuestra shield de Ethernet ( suele venir escrita por
debajo).
IPAddress ip(192,168,1,30); // Asignamos la IP a Arduino (Va entre comas)
ponemos la //Privada que le queremos asignar , ya que lo usaremos como servidor
de la página web que //creemos debemos tener cuidado ya que nuestro router
puede tener el protocolo DCHP //activado y cambiar esta IP de vez en cuando, si
ocurre esto podemos desactivar el servicio //DHCP en el router o asignar un
dominio a la IP, aunque lo mejor es fijar una IP por dirección //MAC en el
router así para esa MAC siempre le da la misma IP Privada, también debemos //abrir
un puerto para que al entrar desde fuera de la red local nos re direccione a nuestra
IP. //En el router abro el puerto 80 y le asigno la IP local que he puesto.
EthernetServer server(80); //Creamos un servidor web en el puerto 80 que
es el puerto HTTP por defecto
/////////////////Variables
Globales/////////////////////////////////////////
float tempC;
int tempPin =4; // Definimos la entrada en pin A0
/////////////////Funciones//////////////////////////////////////////////////
/////////////////Configuración(SETUP)/////////////////////////////////////////
void setup()
{
// Abre puerto
serial y lo configura a 9600 bps (baudios por segundo)
Serial.begin(9600);
Ethernet.begin(mac,ip); // Comienza la connexion
server.begin();
}
/////////////////Principal (LOOP)///////////////////////////////////////////
void loop()
{
EthernetClient
client=server.available(); // Creamos el objeto cliente de la clase //EthernetClient
cuando se ejecute la función "available" del objeto server que creamos
para //la clase EthernetServer, la función se ejecutara ( y por tanto el objeto
client se creara) //cuando se detecte un
cliente a través de una petición HTTP.
if (client){
Serial.print(" Cliente Nuevo: ");
boolean
currentLineIsBlank=true; // Las peticiones HTTP acaban con una línea en blanco,
//así que creamos una variable booleana para esa línea.
while
(client.connected()){// Mientras el cliente este conectado....
if(client.available()){ // Si el cliente está disponible...
char
c=client.read(); // Leemos la petición HTTP carácter por carácter.
Serial.write(c); // Visualizamos la petición HTTP en el monitor serie.
if
(c == '\n' && currentLineIsBlank){
// Al recibir línea en blanco la petición HTTP ha //terminado, ahora
mandaremos la respuesta en HTML.
// Enviamos al cliente una respuesta HTTP
// Escribimos el código HTML
client.println("HTTP/1.1 200 OK");
client.println("Content-Type:
text/html");
client.println("Connection: close"); // La conexión se cerrara después de //completar
la respuesta
client.println("Refresh: 5");
// Refresca la página cada 5 segundos
client.println();
//Cabezera:
client.println("<!DOCTYPE html>"); // Envía la página Web
client.println("<html>");
client.println("<head>");
client.println("<title>Sensor
De Temperatura</title>");
client.println("</head>");
client.println("<body background=http://www.hdfondos.eu/pictures/2014/0412/1/outer-space-dark-stars-images-155548.jpg");
// Defines una imagen de fondo de pantalla
client.println("<B>");//Escritura en negrita a partir de
aquí
client.println("<FONT FACE=arial SIZE=5 COLOR=YELLOW
>"); // Define el tipo de //letra el tamaño y el color
client.println("<h1>LM35</h1>");
client.println("<p>Sensor
de temperatura por Guillermo Cayetano.</p>");
client.println("<form
method=\"get\">");
//Se muestra el
valor de la entrada analógica:
tempC = analogRead(tempPin);
// Convierte el valor a temperatura
tempC = ((5* tempC * 100.0)/1023.0)-8; //LM35 indica mide en mv/C (mili
voltios //entre Grados Centígrados) por eso debemos multiplicar por 100.
client.print("La temperatura en mi
casa es: ");
client.print(tempC);
client.print(" grados centígrados
<br>");
client.println("</B>");//Cerramos escritura en negrita
client.println("</FONT>");//Cerramos
el formato de escritura abierto antes
client.print("<IMG
SRC=http://4.bp.blogspot.com/-mIRoj-lZlZY/UJzqh4UfshI/AAAAAAAAJgw/kJZ1Z2kisoE/s1600/b2bdeca50ad5715437373cd170ffaa4d_article.png>");
//Establece una imagen
client.println("</form>");
client.println("</body>");
client.println("</html>");
break;
}
if (c== '\n'){
currentLineIsBlank=true;
}
else if (c !='\r'){
currentLineIsBlank=false;
}
}
}
delay(100);
client.stop();// Cierra la conexión con cliente.
}
boolean
lineaenblanco=true; // Las peticiones HTTP acaban con una línea en blanco, así
que //creamos una variable booleana para esa línea.
// Lee el valor
desde el sensor
tempC =
analogRead(tempPin);
Serial.println(tempC);
// Convierte el
valor a temperatura
tempC = ((5* tempC
* 100.0)/1023.0)-8;
// Envía el dato
al puerto serial
Serial.println(tempC);
Serial.println(" grados Celsius\n");
// Espera cinco
segundo para repetir el loop
delay(3000);
}
………………………………………………………………………………….
Compilamos y subimos el programa a Arduino, y lo conectamos
al router además de alimentarlo. Hay que tener en cuenta que el servidor se
encuentra en el mismo Arduino, por lo tanto este debe estar alimentado y conectado
a la Red para poder visualizar la página Web.
Archivos fuente en el siguiente enlace:
Ethernet
Archivos fuente en el siguiente enlace:
Ethernet