Saltar al contenido

Arduino Webserver Control.

Proyecto

En este tutorial voy a explicar como obtener datos con arduino de pines digitales y analogico, y controlar pines digitales desde el navegador web. Utilizaremos el módulo W5100 Ethernet y HTML.

Materiales:

  • Arduino UNO.
  • Módulo Ethernet W5100.
  • 2 Potenciómetros (Resistencias variables) de 1Kohm.
  • Cables varios.
  • Buzzer.
  • Led Rojo.
  • Resistencia de 330 ohms.
  • Cable USB.
  • Pulsador con retención.
  • Módulo relé.
  • Cable USB (de un mouse viejo que no funcione, lo cortaremos).
  • Cable con toma macho de 220VCA tambien funciona para conexiones de 110VCA.
  • Toma de pared o de tablero.
  • Un sensor mágnetico de puerta/ventana (los que se utilizan en alarmas).

Esquema de conexiones:

El módulo W5100 es un Shield de arduino. Lo que significa que este se coloca sobre el arduino UNO y replica todos sus pines en su superficie, por lo que es igual el funcionamiento de cada uno de los pines digitales y analogicos.

shield-ethernet
Arduino y Ethernet Shield

En la primer imagen observamos el módulo Ethernet Shield W5100 y en la segunda imagen lo obsrvamos colocado en el arduino UNO.

Entradas Analógicas:

Conectamos los dos potenciómetros a los pines analógico 0 y 1 respectivamente, al cual llamaremos Temperatura (0) y Humedad (1). Obviamente estas son entradas las cuales veremos en el navegador como valores entre 0 y 1023 de acuerdo a la posición del potenciómetro.
Aclaración: El nombre temperatura y humedad se dá como ejemplo de lo que podría representar en una casa o proyecto de adquisición de datos. Con el sensor adecuado tener en cuenta la conversión y utilización de los mismos.

Entradas Digitales:

El pin digital 4 lo conectamos al botón con retención.
El pin digital 5 lo conectamos al sensor magnético de puerta.

Salidas Digitales:

El pin digital 2 lo conectamos al módulo relé.
El pin digital 3 lo conectamos al buzzer y al led con la resistencia.

1. Código para el Arduino:

Este código hace que el Arduino envíe y reciba los datos al navegador por HTML.

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };//Ponemos la dirección MAC de la Ethernet Shield
IPAddress ip(192,168,0,177); //Asignamos  la IP al Arduino
EthernetServer server(80); //Creamos un servidor Web con el puerto 80 que es el puerto HTTP por defecto
 
int LED1=2; //Pin del LED 1
int LED2=3; //Pin del LED 2
String estado1="OFF"; //Estado del Led 1 inicialmente "OFF"
String estado2="OFF"; //Estado del Led 2 inicialmente "OFF" 

void setup()
{
  Serial.begin(9600);
 
  // Inicializamos la comunicación Ethernet y el servidor
  Ethernet.begin(mac, ip);
  server.begin();
  
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  pinMode(4,INPUT);
  pinMode(5,INPUT);
  digitalWrite(LED1,HIGH);
  digitalWrite(LED2,HIGH);
}
 
void loop()
{
  EthernetClient client = server.available(); //Creamos un cliente Web
  //Verificamos si se detecte un cliente a través de una petición HTTP
  if (client) {
    Serial.println("new client");
    boolean currentLineIsBlank = true; //Una petición HTTP acaba con una línea en blanco
    String cadena=""; //Creamos una cadena de caracteres vacía
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();//Leemos la petición HTTP carácter por carácter
        Serial.write(c);//Visualizamos la petición HTTP por el Monitor Serial
        if(cadena.length()<50)
        {
                    cadena.concat(c);//concatenmos el String 'cadena' con la petición HTTP (c). De esta manera convertimos la petición HTTP a un String
           
                   //Ya que hemos convertido la petición HTTP a una cadena de caracteres, ahora podremos buscar partes del texto.
                   int posicion=cadena.indexOf("Data="); //Guardamos la posición de la Palabra "Data=" a la variable 'posicion'
           
                    if(cadena.substring(posicion)=="Data=1")//Si en la posición hay "Data=1"
                    {
                      digitalWrite(LED1,LOW);
                      estado1="ON";
                    }
                    else if(cadena.substring(posicion)=="Data=2")//Si en posición hay "Data=2"
                    {
                      digitalWrite(LED1,HIGH);
                      estado1="OFF";
                    }
                    else if(cadena.substring(posicion)=="Data=3")//Si en la posición hay "Data=3"
                    {
                      digitalWrite(LED2,LOW);
                      estado2="ON";
                    }
                    else if(cadena.substring(posicion)=="Data=4")//Si en la posición hay "Data=4"
                    {
                      digitalWrite(LED2,HIGH);
                      estado2="OFF";
                    } 
                          
        }
        //Cuando reciba una línea en blanco, quiere decir que la petición HTTP ha acabado y el servidor Web está listo para enviar una respuesta
        if (c == 'n' && currentLineIsBlank) {
 
            // Enviamos al cliente una respuesta HTTP
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println();
 
            //Página web en formato HTML
            client.println("<html>");                 
            client.println("<head><title>Arduino Webserver Control</title>");
            client.println("</head>");
            client.println("<body>");
            client.println("<div style='text-align:center;'>");
            client.println("<h1>Arduino Webserver Control</h1>");
            client.println("<h2>Entradas Analogicas</h2>");
            client.print("Temperatura="); client.println(analogRead(0));
            client.print("<br />Humedad=");client.println(analogRead(1)); 
            client.println("<h2>Entradas Digitales</h2>");
            client.print("Boton Emergencia=");client.println(digitalRead(4));
            client.println("<br />Puerta=");client.print(digitalRead(5));
            client.println("<br /><br />");
            client.println("<a href='http://192.168.0.177'>Actualizar entradas</a>");
            client.println("<h2>Salidas Digitales </h2>");        
            client.println("Estado del Luz = ");client.print(estado1);            
            client.println("<br />");            
            client.print("<button onClick=location.href='./?Data=1'>ON</button>");           
            client.print("<button onClick=location.href='./?Data=2'>OFF</button>");
            client.println("<br /><br />");
            client.println("Estado del Alarma = ");client.print(estado2);            
            client.println("<br />");            
            client.print("<button onClick=location.href='./?Data=3'>ON</button>");           
            client.print("<button onClick=location.href='./?Data=4'>OFF</button>");
            client.println("<br /><br />");
            client.println("<a href='https://elprofealegria.com/'>elprofealegria.com</a>");
            client.println("<br /><br />");             
            client.println("</b></body>");
            client.println("</html>");
            break;
        }
        if (c == 'n') {
          currentLineIsBlank = true;
        }
        else if (c != 'r') {
          currentLineIsBlank = false;
        }
      }
    }
    //Dar tiempo al navegador para recibir los datos
    delay(1);
    client.stop();// Cierra la conexión
  }
  
}
Código HTML

Este código se leerá en el navegador web pulsando generalmente F12 se abre el visor de código..

2. Prueba del sistema:

En el navegador escribimos la direccion IP que tiene establecida el código de arduino. En nuestro caso 192.168.0.177.

Y ya tendremos acceso al servidor web de arduino y poder realizar las pruebas.

Vista en Navegador

Notas adicionales:

Este es un ejemplo el cual puede variar y modificarse de acuerdo a tus necesidades o proyecto que quieras realizar.

Espero te sirva de guía para realizar tu proyecto.

No te olvides de compartir en...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *