Buscar este blog

Información semanal de las clases de electrónica y las sucesivas prácticas realizadas por Guillermo Cayetano Espejo alumno del Ciclo de Grado Superior de Manteniemintos Electronicos de 2º Curso del CIFPN1 (Peñacastillo,Santander) Dpto:Electricidad y Electrónica

jueves, 8 de diciembre de 2016

Practica 3 Arduino Ethernet

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 

No hay comentarios:

Publicar un comentario