/* TITULO: Control de un LED desde un servidor WEB con el Ethernet Shield W5100.
AUTOR:
MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA
- FACEBOOK: https://www.facebook.com/mariano.delcampogarcia
- TWITTER: https://twitter.com/MarianoCampoGa
- CORREO: [email protected]
DESCRIPCIÓN DEL PROGRAMA
Con este programa vamos a controlar el encendido y apagado de un LED a través de internet, mediante
el Servidor WEB creado con el Ethernet Shield que conectamos a Arduino, que tenemos comunicado con
nuestro router WIFI.
ESQUEMA DE CONEXION
+-----+
+----[PWR]-------------------| USB |--+
| +-----+ |
| GND/RST2 [ ][ ] |
| MOSI2/SCK2 [ ][ ] A5/SCL[ ] |
| 5V/MISO2 [ ][ ] A4/SDA[ ] |
| AREF[ ] |
| GND[ ] |
| [ ]N/C SCK/13[ ] |
| [ ]IOREF MISO/12[ ] |
| [ ]RST MOSI/11[ ]~|
| [ ]3V3 +---+ 10[ ]~|
| [ ]5v -| A |- 9[ ]~|
| [ ]GND -| R |- 8[ ] | LED(+)
| [ ]GND -| D |- |
| [ ]Vin -| U |- 7[ ] |
| -| I |- 6[ ]~|
| [ ]A0 -| N |- 5[ ]~|
| [ ]A1 -| O |- 4[ ] |
| [ ]A2 +---+ INT1/3[ ]~|
| [ ]A3 INT0/2[ ] |
| [ ]A4/SDA RST SCK MISO TX>1[ ] |
| [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] |
| [ ] [ ] [ ] |
| UNO_R3 GND MOSI 5V ____________/
\_______________________/
NOTAS:
- Cátodo(-) del LED (pata más corta) a GND a través de una R=220 omhs.
- Ethernet Shield colocada sobre Arduino UNO (Los pines coinciden al 100%).
- Ethernet Shield conectada al router WIFI mediante cable Ethernet standard (conector RJ45)
- Arduino UNO alimentado a través de una batería externa de Litio-ion de 12V/3000mAh (DC 12300)
*/
// Librerías
#include <SPI.h>
#include <Ethernet.h>
// Declaración de la direcciones MAC,IP,GATEWAY y SUBNET.
byte mac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED};
// Dentro del cdm de Windows ponemos ipconfig y buscamos en adaptador de LAN inalámbrica
IPAddress ip(192,168,1,14); // 192.168.1.XX donde XX es una dirección que no esté utilizada
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
// Creamos un servidor Web con el puerto 80 que es el puerto HTTP por defecto
EthernetServer server(80);
int LED = 8; // Pin digital para el LED
String estado = "OFF"; // Estado del LED inicialmente "OFF"
void setup()
{
Serial.begin(9600); // Comienzo de la comunicación serie
// Inicializamos la comunicación Ethernet y el servidor
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
Serial.print("La IP del servidor local es: ");
Serial.println(Ethernet.localIP()); // Nos devuelve la IP del Ethernet Shield
pinMode(LED,OUTPUT); // Pin digital 8 como salida
}
void loop()
{
EthernetClient client = server.available(); // Creamos un cliente Web
// Cuando detecte un cliente a través de una petición HTTP
if (client)
{
Serial.println(); // Salto de línea
Serial.println("Nuevo cliente");
Serial.println();
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
cadena.concat(c);// Unimos 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("LED="); // Guardamos la posición de la instancia "LED=" a la variable 'posicion'
if(cadena.substring(posicion)=="LED=ON") // Si en la posición 'posicion' hay "LED=ON"
{
digitalWrite(LED,HIGH);
estado="ON";
}
if(cadena.substring(posicion)=="LED=OFF") // Si en la posición 'posicion' hay "LED=OFF"
{
digitalWrite(LED,LOW);
estado="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>");
client.println("</head>");
client.println("<body style='background-color: #40E0D0;'>");
client.println("<br/><br/>");
client.println("<h1 align='center'>LED controlado por Servidor Web con Arduino</h1>");
// Creamos los botones.
// Para enviar parámetros a través de HTML se utiliza el método URL encode.
// Los parámetros se envían a través del símbolo '?'
client.println("<div style='text-align:center;'>");
client.println("<button onClick=location.href='./?LED=ON\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:85px;'>");
client.println("ON");
client.println("</button>");
client.println("<button onClick=location.href='./?LED=OFF\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:85px;'>");
client.println("OFF");
client.println("</button>");
client.println("<br/><br/>");
client.println("<b>ESTADO DEL LED = ");
client.print(estado);
client.println("</b><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
}
}