Ethernet Arduino Servidor Html

18
Ethernet Arduino Servidor Html Vamos a controlar el encendido y apagado de leds conectados a una placa arduino y ethernet. Para empezar vamos a necesitar 1. Montaje de arduino, ethernet y leds. 2. Programar el arduino para conectarse a la web. 3. Configurar el Router para acceder al control del circuito desde la red. 4. Como probarlo. 1.- Montaje La placa arduino uno o duecimila está debajo de la Shield Ethenet, por lo que no se ve en esta imagen. Las patillas con que se conecta la Ethernet al Arduino son las 10, 11, 12 y 13, por lo que no estarán disponibles para otros usos. Materiales: Arduino Uno o Duecimila Shield Ethernet Placa protoboard 8 diodos leds rojos pequeños 8 resistencias de 10K Nota: Las resistencias han de ser las adecuadas a vuestro tipo de leds. Según su valor se iluminarán más o menos, o se detruirán.

Transcript of Ethernet Arduino Servidor Html

Ethernet Arduino Servidor HtmlVamos a controlar el encendido y apagado de leds conectados a una placa

arduino y ethernet.

Para empezar vamos a necesitar

1. Montaje de arduino, ethernet y leds.2. Programar el arduino para conectarse a la web.3. Configurar el Router para acceder al control del circuito desde la red.4. Como probarlo.

1.- MontajeLa placa arduino uno o duecimila está debajo de la Shield Ethenet, por lo que

no se ve en esta imagen. Las patillas con que se conecta la Ethernet al Arduinoson las 10, 11, 12 y 13, por lo que no estarán disponibles para otros usos.

Materiales:

Arduino Uno o Duecimila Shield Ethernet Placa protoboard 8 diodos leds rojos pequeños 8 resistencias de 10K

Nota: Las resistencias han de ser las adecuadas a vuestro tipo de leds. Segúnsu valor se iluminarán más o menos, o se detruirán.

2.- ProgramaDescargar Código .ino

Descargar Código .pde

Abrir el programa en vuestro ide del arduino.

3.- Configuracion del routerEn internet buscar la configuración de vuestro router para poder entrar en él

y cambiar la configuración. Tenemos que abrir el puerto para nuestro servidor(montaje Ethernet en modo Servidor), de esta forma será accesible desde cualquiersitio de la red y de internet.

En el código anterior, mi red está configurada con una gateway de192.168.10.1. A nuestro montaje hay que darle una ip fija dentro de nuestra redlocal, en mi caso he puesto 192.168.10.15. También hay que indicarle el puertopor el que vamos a acceder. En mi caso he abierto el puerto 88. Normalmente seríael 80, pero ese lo he reservado para un servidor debian

A continuación añado las imágenes de configuración de mi router, en este casoes un Comtrend

Observa que para entrar deberías poner en el navegador 192.168.10.1, pero enmi caso he puesto unicarlos.dyndns.org, que sirve para conseguirt que desde fuerami ip dinámica se vea como si fuera una ip fija. Visita la web http://dyn.com/ ybusca en internet como conseguir una ip fija con dyndns.

En vuestro router buscar NAT, Virtual Servers o algo similar donde se abrenlos puertos de emule, web, etc

Si has activado tu ip fija en dns deberás configurarlo en tu router, si te lopermite. En esta imagen se muestra la ruta para poder configurarlo y mi datodyndns.

4.- PruebasDesde la red interna

En el navegador tenemos que poner: 192.168.10.15:88

Nos saldrá un imagen como está

Aquí podréis comprobar como al pulsar los botones se enciende o apaga el ledelegido, o apagar todos, o encender todos. Espero que os funcione correctamente,si no es así, repasar todos los pasos, montaje, código, etc.

Desde la red externa (internet)

Para funcionar en este caso deberías tener una dirección ip fija, que ennuestro caso viene dada por unicarlos.dyndns.org. Si no la tienes puedescomprobar tu ip de tu router en "http://www.vermiip.es/" apuntarla, no reiniciar

el router, y desde un ordenador conecado a una red externa a tu red localescribe:

En mi caso: unicarlos.dyndns.org:88

En tu caso: tuip:88 (ejemplo: 172.172.92.12:88)

Os saldrá una pantalla como la anterior.

Nota: probar en vuestro movil conectado tanto a vuestra red wifi, otra wifi oa vuestro servicio de WAP (red de datos de vuestra compañia). Recuerda que conesta última opción tendrás consumo de datos gprs de pago.

ConclusionesTras haber realizado distintas pruebas de ensayo, como introducir tablas y más

códigos html, para dejarlo más presentable, comprobé que a nivel de red local sime funcionaba, pero a nivel de red externa no cargaba todos los datos.

Por ello, creo que los datos que manda la Ethernet a nivel externo debe teneruna limitación de datos.

En próximas pruebas deberemos crear un web externa que reciba los datos de laEthernet, los interprete y al activar un botón mande al arduino una orden deencender, apagar o cambiar cualquier valor que creamos conveniente. Cuando lotenga hecho lo publicaré.

En un próximo artículo os haré lo explicado antes pero usando action script(flash).

Inicialmente declaramos dos variables una que contendrá el dato introducido por teclado y otra para guardar el número de pin al que hemos conectado nuestro led. Posteriormente en el Setup hemosagregado la  instrucción: 

Serial.begin(9600); 

Dicha instrucción solo requiere un parámetro y es la tasa de baudios a la cual se estará llevando a cabo la comunicación, este valor varía dependiendo del dispositivo aunque comúnmente es 9600 como es nuestro caso con la pc. Luego hemos usado la instrucción: 

Serial.available() 

La cual devuelve el número de bytes disponibles para ser leídos por el puerto serie, razón por la que la hemos usado dentro de un if para que cuando haya algún dato disponible guardarlo en la variable “input” mediante la función: 

Serial.read() 

Esta función simplemente lee los datos provenientes del puerto serie. Una vez obtenido el dato preguntamos con otro if si el dato introducido es igual a “1″, si lo es, procedemos a encender el led como ya hemos visto antes, con un digitalWrite() y el estado de HIGH además de mostrar un mensaje en el monitor serial “Led Encendido” con la función Serial.println() y en caso contrario apagamos el led también con la instrucción digitalWrite() pero ahora con un estado de LOW y mostramos como mensaje “Led Apagado”,cabe destacar que para imprimir una cadena de caracteres debemos escribir dicha cadena dentro de la función Serial.println() dentro de comillas dobles sino lo imprimirá con el formato ASCII. 

Mandar del circuito al arduino

// unicarlos.dyndns.org:88 (ip de mi router que se actualiza automaticamente)

// y funciona con la configuracion del router de abrir puerto e ip // y se puedan encender y apagar leds (Pines digitales del 2 al 9).// Pines 10,11,12 y 13 los usa para comunicarse con la ethernet

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

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFF, 0xEE}; // direccion MAC de tuEthernetbyte ip[] = {192, 168, 10, 15}; // ip que le pones dentro de tu red comofija y configurada en tu routerEthernetServer server(88); // 88 puerto por el accedemos al servidor. Normalmente seria la 80

int dig[] = {2,3,4,5,6,7,8,9}; // pines digitales a usar. No uso 0 y 1 que son de transmisin serie // Tampoco uso el 10,11,12 y 13 ya que los uso para la ethernetint digTotal = 8; // Numero de pines a usarint vdig[] = {0,0,0,0,0,0,0,0}; // valores iniciales (Tantos como pines usemos)int pin;int nivel;String cad = String(100);

void setup(){ Ethernet.begin(mac, ip); // inicio la Ethernet server.begin(); // inicio el servidor Serial.begin(9600); // inicio el serial monitor for (int i=0; i < digTotal; i++) { pinMode(dig[i], OUTPUT); // inicializo los pines digitales como salida digitalWrite(dig[i],vdig[i]); // los pongo a nivel bajo LOW=0 }}

void loop(){ cad = ""; // inicializo la cad donde almaceno los datos recibidos EthernetClient cliente = server.available(); if (cliente) { while(cliente.connected()) {

if(cliente.available()) { char c = cliente.read(); cad = cad + c; Serial.print(c);

if(c == '\n') { if (cad.lastIndexOf("dig") > -1) // si la variable cad contiene'dig' hacer ... { pin = pinElegido(cad); int posicionPin; for (int i=0; i <digTotal; i++) { if (dig[i] == pin) { posicionPin = i; break; } } nivel = nivelElegido(cad); vdig[posicionPin] = nivel; Serial.print(pin); // comprobamos que el pin elegido es el correcto Serial.println(" pin. -- "); Serial.print(nivel); // comprobamos su nivel 0=LOW y 1=HIGH Serial.println(" nivel "); digitalWrite(pin, nivel); // activamos o desactivamos el pinelegido } // ... hasta aqui 'dig' if (cad.lastIndexOf("apaga") > -1) // si la variable cad contiene 'apaga' ejecuta { // la funcion apagaTodos() apagaTodos(); } if (cad.lastIndexOf("encender") > -1) // si cad contiene 'encender' ejecuta { // la funcion enciendeTodos() enciendeTodos(); }

// Comienza la transmision de datos desde el servidor al cliente cliente.println("HTTP/1.1 200 OK"); cliente.println("Content-Type: text/html"); cliente.println();

for (int i=0; i < digTotal; i++) { cliente.print("Digital "); cliente.print(dig[i]); cliente.print(" "); if (vdig[i]==1) { cliente.println("<font color='green'>ON</font>"); cliente.print("<form method=get><input type=hidden name=dig"); cliente.print(dig[i]); cliente.print(" value=0><input type=submit value=OFF></form>"); } if (vdig[i]==0) { cliente.println("<font color='grey'>OFF</font>"); // cliente.println("<td>"); cliente.print("<form method=get>"); cliente.print("<input type=hidden name=dig"); cliente.print(dig[i]); cliente.print(" value=1>"); cliente.print("<input type=submit value=ON>"); cliente.print("</form>"); } } cliente.print("<form method=get><input type=hidden name=apaga"); cliente.println(" value=1><input type=submit value=APAGA_TODOS></form>"); cliente.println("<form method=get><input type=hidden name=encender"); cliente.println(" value=1><input type=submit value=ENCENDER_TODOS></form>"); cliente.stop(); } } }

}}

////////////// FUNCIONES /////////////////7// Funcion: Extrae el pin del array cad (contiene la lectura de lo que elcliente devuelve)int pinElegido(String cad){

int pos_dig = cad.lastIndexOf("dig"); int pos_igual = cad.lastIndexOf("="); char vpin1 = cad.charAt(pos_dig+3); char vpin2 = cad.charAt(pos_dig+4); if (vpin2 != '=') { vpin1 += vpin2; } int pinElegido = vpin1 - 48; //.toInt(); return pinElegido;}// Funcion: Extrae en nivel de la cadena cadint nivelElegido(String cad){ int pos_igual = cad.lastIndexOf("="); char v = cad.charAt(pos_igual+1) - 48; if (v == 0) return 0; if (v == 1) return 1;}// Funcion para apagar todos los leds al tiempovoid apagaTodos(){ for (int i=0; i < digTotal; i ++) { vdig[i] = 0; digitalWrite(dig[i], vdig[i]); }}// Funcion para encender todos los leds al tiempovoid enciendeTodos(){ for (int i=0; i < digTotal; i ++) { vdig[i] = 1; digitalWrite(dig[i], vdig[i]);

}}

// unicarlos.dyndns.org:88 (ip de mi router que se actualiza automaticamente)// y funciona con la configuracion del router de abrir puerto e ip // y se puedan encender y apagar leds (Pines digitales del 2 al 9).// Pines 10,11,12 y 13 los usa para comunicarse con la ethernet

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

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFF, 0xEE}; // direccion MAC de tuEthernetbyte ip[] = {192, 168, 10, 15}; // ip que le pones dentro de tu red comofija y configurada en tu routerServer server(88); // 88 puerto por el accedemos al servidor. Normalmente seria la 80

int dig[] = {2,3,4,5,6,7,8,9}; // pines digitales a usar. No uso 0 y 1 que son de transmisin serie // Tampoco uso el 10,11,12 y 13 ya que los uso para la ethernetint digTotal = 8; // Numero de pines a usarint vdig[] = {0,0,0,0,0,0,0,0}; // valores iniciales (Tantos como pines usemos)int pin;int nivel;

String cad = String(100);

void setup(){ Ethernet.begin(mac, ip); // inicio la Ethernet server.begin(); // inicio el servidor Serial.begin(9600); // inicio el serial monitor for (int i=0; i < digTotal; i++) { pinMode(dig[i], OUTPUT); // inicializo los pines digitales como salida digitalWrite(dig[i],vdig[i]); // los pongo a nivel bajo LOW=0 }}

void loop(){ cad = ""; // inicializo la cad donde almaceno los datos recibidos Client cliente = server.available(); if (cliente) { while(cliente.connected()) { if(cliente.available()) { char c = cliente.read(); cad = cad + c; Serial.print(c);

if(c == '\n') { if (cad.lastIndexOf("dig") > -1) // si la variable cad contiene'dig' hacer ... { pin = pinElegido(cad); int posicionPin; for (int i=0; i <digTotal; i++) { if (dig[i] == pin) { posicionPin = i; break; } } nivel = nivelElegido(cad); vdig[posicionPin] = nivel;

Serial.print(pin); // comprobamos que el pin elegido es el correcto Serial.println(" pin. -- "); Serial.print(nivel); // comprobamos su nivel 0=LOW y 1=HIGH Serial.println(" nivel "); digitalWrite(pin, nivel); // activamos o desactivamos el pinelegido } // ... hasta aqui 'dig' if (cad.lastIndexOf("apaga") > -1) // si la variable cad contiene 'apaga' ejecuta { // la funcion apagaTodos() apagaTodos(); } if (cad.lastIndexOf("encender") > -1) // si cad contiene 'encender' ejecuta { // la funcion enciendeTodos() enciendeTodos(); } // Comienza la transmision de datos desde el servidor al cliente cliente.println("HTTP/1.1 200 OK"); cliente.println("Content-Type: text/html"); cliente.println();

for (int i=0; i < digTotal; i++) { cliente.print("Digital "); cliente.print(dig[i]); cliente.print(" "); if (vdig[i]==1) { cliente.println("<font color='green'>ON</font>"); cliente.print("<form method=get><input type=hidden name=dig"); cliente.print(dig[i]); cliente.print(" value=0><input type=submit value=OFF></form>"); } if (vdig[i]==0) { cliente.println("<font color='grey'>OFF</font>");

// cliente.println("<td>"); cliente.print("<form method=get>"); cliente.print("<input type=hidden name=dig"); cliente.print(dig[i]); cliente.print(" value=1>"); cliente.print("<input type=submit value=ON>"); cliente.print("</form>"); } } cliente.print("<form method=get><input type=hidden name=apaga"); cliente.println(" value=1><input type=submit value=APAGA_TODOS></form>"); cliente.println("<form method=get><input type=hidden name=encender"); cliente.println(" value=1><input type=submit value=ENCENDER_TODOS></form>"); cliente.stop(); } } } }}

////////////// FUNCIONES /////////////////7// Funcion: Extrae el pin del array cad (contiene la lectura de lo que elcliente devuelve)int pinElegido(String cad){

int pos_dig = cad.lastIndexOf("dig"); int pos_igual = cad.lastIndexOf("="); String vpin1 = cad.charAt(pos_dig+3); String vpin2 = cad.charAt(pos_dig+4); if (vpin2 != '=') { vpin1 += vpin2; } int pinElegido = vpin1.toInt(); return pinElegido;}// Funcion: Extrae en nivel de la cadena cad

int nivelElegido(String cad){ int pos_igual = cad.lastIndexOf("="); String v = cad.charAt(pos_igual+1); if (v == 0) return 0; if (v == 1) return 1;}// Funcion para apagar todos los leds al tiempovoid apagaTodos(){ for (int i=0; i < digTotal; i ++) { vdig[i] = 0; digitalWrite(dig[i], vdig[i]); }}// Funcion para encender todos los leds al tiempovoid enciendeTodos(){ for (int i=0; i < digTotal; i ++) { vdig[i] = 1; digitalWrite(dig[i], vdig[i]); }}

const int buttonPin = 2; // número del pin para el botón const int ledPin =  13;  // número del pin del LED

int buttonState = 0;  // estado del botón (0 ó LOW es apagado y 1 ó HIGH es encendido)

void setup() { // Se identifica el pin 13 como salida pinMode(ledPin, OUTPUT);       // Se identifica el pin 2 como entrada pinMode(buttonPin, INPUT);     }

void loop(){ // Leemos si el botón en pin2 está abierto o cerrado buttonState = digitalRead(buttonPin);

 // Si está siendo pulsado es HIGH if (buttonState == HIGH) {        // Y el LED se enciende       digitalWrite(ledPin, HIGH);  

 }  else {   // Si no es asi, se apaga   digitalWrite(ledPin, LOW);  }}