Arduino
por Juan Antonio Villalpando

____________________________________________________________________

-- Tutorial de iniciación --
- Volver al índice del tutorial.
____________________________________

26.- Arduino Ethernet Internet

Tutoriales. Arduino Ethernet Internet

Presentación


Arduino UNO, sobre él pincharemos el módulo Shield de Ethernet.

Bien. Ahora vamos a tratar de gobernar un dispositivo a distancia mediante Ethernet/Internet. Apagar/encender una lámpara, controlar el microcontrolador Arduino,... tanto desde el ordenador como desde un Android. Esto podría ser una pequeña introducción a la domótica.

Para que el Arduino funcione con Internet tenemos varias opciones, una de ellas es comprar un
1.- Arduino con "Internet incorporado": http://www.bricogeek.com/shop/arduino/392-arduino-ethernet.html viene a costar unos 50 €.

Este es la módulo Arduino con Ethernet. El módulo en sí, tiene un conector RJ45 y otro para recibir la alimentación,

No tiene conector USB, por lo cual para programarlo es necesario añadirle otro modulito (USB2Serial) para poder conectarlo al USB del ordenador y cargarle el programa. Complicado.

 

Otras opciones es agregarle a nuestro Arduino un Shield Ethernet, voy a comentar tres de ellos:
(Shield son placas que se insertan en la placa del Arduino)

2.- Ethernet Shield V1.1 for Arduino with MicroChip ENC28J60 para conectarlo al Arduino.
http://www.dealextreme.com/p/ethernet-shield-v1-1-for-arduino-66908?item=2 por 18 €. Este módulo no tiene conector para tarjetas de memorias SD, con estas tarjetas podríamos hacer programas de mayor tamaño, presentar dibujos, almacenar datos,... Uno de los problemillas que tiene este Shield es que está basado en el circuito integrado ENC28J60 (que por cierto se calienta muchísimo (very hot) ) y necesita una librería (driver) que no es la "oficial" de Arduino, esta librería la puedes encontrar más adelante en este tutorial. Funciona. Veremos varios ejemplos con esta placa. Este shield es complicado de programar, es mejor el que veremos a continuación.


Shield Ethernet con el chip ENC28J60

3.- (Esta es la mejor opción) Ethernet Shield with Wiznet W5100 Ethernet Chip / TF Slot para conectarlo al Arduino
http://www.dealextreme.com/p/ethernet-shield-with-wiznet-w5100-ethernet-chip-tf-slot-118061 por 16 €. Este módulo es más barato y con mejores prestaciones que el anterior. Tiene conector para tarjetas de memorias microSD. Está basado en el chip W5100. (también se calienta bastante). Utiliza las librerías "oficiales" de Arduino. También veremos varios ejemplos con esta placa. Los servidores con este shield "caen" menos que con el shield anterior, además parece ser más rápido. Es el aconsejable.


Shield Ethernet con el chip W5100

4.- Arduino Etherner Shield - SD, es el mismo que el anterior, solo que lo puedes comprar en España, en este caso por unos 38 € más el transporte http://www.bricogeek.com/shop/17-arduino-ethernet-shield.html

 

Librerías

Las librerías o drivers son una serie de archivos que el Arduino necesita para que funcionen algunos módulos.

Las librerías se encuentran en la carpeta libraries. Según el chip se utiliza una librería u otra.

Los módulos basados en el chip W5100, utilizan la librería "oficial" del IDE del Arduino. Está en la carpeta Ethernet.
#include <Ethernet.h>

Los módulos basados en el chip ENC28J60, utilizan las librerías etherShield y ETHER_28J60
#include "etherShield.h"
#include "ETHER_28J60.h"

Esta librería la puedes bajar de etherShield-v1.1-for-Arduino-v1.0.rar y guardar en la carpeta libraries. De Andy.

 

Otra librería que se utiliza para el chip ENC28J60, es la EtherCard para el chip ENC28J60. De Jean-Claude Wippler
#include <EtherCard.h>
Migrando de Ethershield a EtherCard
- http://jeelabs.org/intro/

No estaría mal instalar todas las librerías: ETHER_28J60, EtherCard, Ethernet y etherShield.

- Otra cosa importante es instalar el IDE del Arduino 1.0, si tienes instalado el 0022, 0023,... puede que algún código no funcione. En efecto, en internet muchos autores no indican en qué condiciones funcionan sus proyecto. Tal vez el autor ha construido su proyecto con el IDE 21 y sus archivos son pde y le funcionan completamente y nosotros instalamos el IDE 1.0 donde los archivos son ino y pueden que no funcionen los anteriores. El IDE Arduino 1.0 salió por mayo del 2012.

- Las páginas web realizadas con estos shield deben ser de pequeño tamaño ya que su buffer no admite mucho contenido.

__________________________________

En esta página vamos a ver proyectos de gobernar al Arduino desde internet con botones en una página web y hacer que al pulsar un botón en la placa del Arduino, se muestre en una página web.

Lo vamos a realizar con los dos Shields:


1.- Ethernet Shield V1.1 basado en el ENC28J60
(+ librería ethershield).

2.- Ethernet Shield with Wiznet W5100 Ethernet Chip W5100
(+ librería oficial del Arduino Ethernet).

Vamos a ver estos proyectos con cada uno de los dos Shields.

- Al pulsar botones de una página web se encienden diodos LED del Arduino.
- Al pulsar botones de una página web se enciende o apaga poco a poco un diodo LED conectado a la salida 9 del Arduino
.
- Ahora vamos a realizarlo al revés, es decir al pulsar un botón del Arduino, cambia la información de una página web
- Proyecto completo.
- Al pulsar un botón del Arduino, se envía un email a mi cuenta de correo.


__________________________________

Comenzamos con el
1.- Ethernet Shield V1.1 for Arduino Chip ENC28J60

NOTA: Veremos a lo largo del tutorial que hay algo importante que debemos tener en cuenta. Este Shield está basado en el chip ENC28J60 y utiliza la librería (driver):
#include "etherShield.h"

0.- Utilizo el Arduino UNO, el IDE 0022 (también funciona con el IDE 1.0, sería recomendable utilizar este IDE en todos estos proyectos) y el shield de Dealextreme basado en el chip ENC28J60. Además bajo y cargo la librería: etherShield-v1.1-for-Arduino-v1.0.rar (todo esto se va comentando a lo largo de este tutorial).

NOTA: En internet existen más códigos de funcionamiento que se basan en el IDE del Arduino 1.0. Tanto el Arduino, el Shield Ethernet, el IDE y las librerías son críticas, lo que funcionan con uno, no funciona con otro.
(Nota: si utilizas el IDE 0022, 0023... los archivos son .pde, si utilizas el IDE 1.0 son .ino)

Cambio en el IDE de Arduino:

http://blog.makezine.com/2011/12/01/arduino-1-0-is-out-heres-what-you-need-to-know/

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 102 }; // La IP que le pones a tu Arduino
byte server[] = { 192, 168, 1, 3 }; // IP de un servidor web

// Client client(server, 80); // Con el IDE 22
EthernetClient client; // Con el IDE 1.0

// if (client.connect()) { // Con el IDE 22
if(client.connect(server, 80)>0) { // Con el IDE 1.0

SERVIDOR
// Server server(80); // Con el IDE 22
EthernetServer server(80); // Con el IDE 1.0

 

 

1.- Compro el http://www.dealextreme.com/p/ethernet-shield-v1-1-for-arduino-66908?item=2 por 18 €. Tarda 20 días en llegar.
Es un Shield, es decir una placa que se inserta sobre el Arduino.


Shield Ethernet con el chip ENC28J60

 

2.- Lo inserto en el Arduino Uno, conecto el cable USB del Arduino y un cable RJ45 del Router al módulo de Ethernet... y al cabo del tiempo observo que el circuito integrado ENC28J60 (abajo-izquierda en la foto), se calienta muchísimo. Estoy apunto de devolverlo a DealExtreme mediante su web de Returning a Merchandise, pero antes me doy una vuelta por Internet y encuentro varias web que comentan este problema: http://www.microchip.com/forums/m585672.aspx . Este integrado puede soportar temperaturas de 70 - 80 C, así que parece que no habrá problemas.

3.- Entro en varias web para aprender a utilizarlo, en la mayoría utilizan la librería:

#include <Ethernet.h>

pero esta librería no funciona con este Shield.

Ya nos lo advertían en la web de DealExtreme:

Pros :

Easy to use and works fine.
Got it working in a few clicks.
Keep in mind that the driver mentioned by marcelocamposs are for the use of Arduino v0.23 compiler. I posted a new version of this driver which is compatible with the Arduino v1.0 compiler.
Please download the driver from the elektor site:
http://www.elektor.nl/forum/forum/algemene-forums/microcontrollers/arduino-v1-0-met-ethershield-v1-1.2029859.lynkx
or download right away:
http://www.elektor.nl/StreamFile.lynkx?path=Uploads/Forum/Posts/etherShield-v1.1-for-Arduino-v1.0.rar

Cons :

Does not work with the Arduino supplied Ethernet Shield Driver. Manually action needed to download additional driver and put the driver in please.
But this not a hard thing to do...

Así que bajo y descomprimo el archivo etherShield-v1.1-for-Arduino-v1.0.rar. Y lo añado a la carpeta libraries de mi Arduino
(este archivo comprimido contiene las librerías etherShield y ETHER_28J60, que necesitan esta placa)

4.- Vamos a realizar la primera prueba, entramos desde el IDE el Arduino en la carpeta ../libraries/etherShiedl/examples/etherShield_webserver y cargamos en el Arduino el programa: ethershield_webserver.pde

Leemos un poco el programa: ethershield_webserver.pde y entre otras cosas observamos que al principo carga la librería

#include "etherShield.h"

También establece una MAC y una IP

static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
static uint8_t myip[4] = {192,168,1,15};
static char baseurl[]="http://192.168.1.15/";

Al final del archivo crea la página web que quiere mostrar...

uint16_t print_webpage(uint8_t *buf)
{
uint16_t plen;
plen=es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"));
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<center><p><h1>Welcome to Arduino Ethernet Shield V1.1 </h1></p> "));
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<hr><br> <h2><font color=\"blue\">-- Put your ARDUINO online -- "));
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<br> Control digital outputs "));
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<br> Read digital analog inputs HERE "));
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR(" <br></font></h2> ") );
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</center><hr> V1.0 <a href=\"http://www.nuelectronics.com\">www.nuelectronics.com<a>"));
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</center><hr> V1.1 Modified for Arduino V1.0 by Ben Schueler"));

return(plen);
}

 

5.- Ahora vamos a un navegador web y escribimos la dirección: 192.168.1.15

El Shield Ethernet del Arduino nos ha suministrado esa información web. En realidad hasta ahora no hace nada, solo presentar esa página web.

6.- Podemos comprobar mediante un ping, que tenemos conexión con el servidor Ethernet Arduino.

*****************************************************************************************

Todo parece ir bien, pero intento cargar otros proyectos de ./libraries/etherShiedl/examples/ y no me funcionan ninguno.

NOTA:
Una vez que programa está cargado en el Arduino, ya no es necesario que el Arduino esté conectado al ordenador por el cable USB (a menos que quiera alimentarlo con la tensión proveniente del ordenador).
Puedes alimentar al Arduino con una batería de 9 V. Ver foto de otro montaje de Arduino alimentado con pilas.
Sí debe estar conectado al router mediante el cable RJ45.

NOTA:
En todos estos procesos que estamos viendo, a veces el Arduino se quedara "colgado", en este caso pulsamos el botón de RESET que tiene la placa del Ethernet Shield, esto reiniciará el programa.

__________________________________

Al pulsar botones de una página web se encienden diodos LED del Arduino

Busco un poco por internet y encuentro este envío en los foros de Arduino:
http://www.nuelectronics.com/download/projects/etherShield_web_switch.pde
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1268951517/15

Bajo y cargo este código: ethershield_webserver.zip y parece funcionar. (Está probado con el Arduino UNO y el IDE 0022, también funciona con el IDE 1.0) (Bajada directa del código: etherShield_webserver.pde)

No olvidemos que para que el programa funcione, previamente hemos instalado la librería etherShield-v1.1-for-Arduino-v1.0.rar en la carpeta libraries de Arduino.

El Arduino y su Shield funcionan como servidor web.
En un navegador web escribimos la IP establecida en el código, en mi caso 192.168.1.205
Y me sale la siguiente página web.
Placa del Arduino (circuito): En el Arduino+Shield situo 6 diodos LED (concretamente en las salidas 2, 3, 4, 5, 6 y 7)
Cuando pulsamos un botón de la página web, el LED correspondiente se encenderá/apagará.


__________________________________

Al pulsar botones de una página web se enciende o apaga poco a poco un diodo LED conectado a la salida 9 del Arduino

Voy a modificar un poco el código anterior para que al pulsar contínuamente el botón Out 1, se vaya encendiendo poco a poco un diodo LED conectado a la salida ~9 del Arduino. Y al pulsar contínuamente el botón Out 2, se vaya apagando poco a poco el diodo LED conectado a la salida ~9 del Arduino.

Conectamos un diodo LED a la salida ~9 del Arduino, ya que esta es una salida de tipo ~PWM.

El código se podría haber abreviado, pero he querido mantenerlo como estaba.

Aquí tenemos el código: etherShield_webserver_Analogico.pde
(Nota: si utilizas el IDE 0022, 0023... los archivos son .pde, si utilizas el IDE 1.0 son .ino)

El código se puede mejorar quitando botones, eliminando líneas, poniendo un delay para que no se pueda pulsar rápidamente, evitando que suba de 255 y baje de 0,...

Si abrimos el Serial Monitor en el Arduino podemos ver cómo evoluciona el valor recibido.

__________________________________

Ahora vamos a realizarlo al revés, es decir al pulsar un botón del Arduino, cambia la información de una página web

 

Para que funcione utilizamos el IDE del Arduino 1.0 y la Librería etherShield-v1.1-for-Arduino-v1.0.rar

Realizamos el siguiente montaje: un pulsador y una resistencia de unos 10K. El cable intermedio va a la entrada 2.

 


Pegamos este código en el IDE 1.0 de Arduino (en el IDE 022 no me funcionó). Lo he llamado etherShield_Boton.pde

etherShield_Boton.pde

// Juan Antonio Villalpando
// juana1991@yahoo.com

#include "etherShield.h"
#include "ETHER_28J60.h"

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24}; // this just needs to be unique for your network,
// so unless you have more than one of these boards
// connected, you should be fine with this value.

static uint8_t ip[4] = {192, 168, 1, 15}; // the IP address for your board.

static uint16_t port = 80; // Use port 80 - the standard for HTTP

ETHER_28J60 e;
const int boton2 = 2;
int buttonState = 0;

void setup()
{
e.setup(mac, ip, port);
pinMode(boton2, INPUT);
}

void loop()
{
buttonState = digitalRead(boton2);

if (e.serviceRequest())
{

e.print("<META HTTP-EQUIV='REFRESH' CONTENT='1'>");
e.print("<H1>Estado del interruptor de entrada 2</H1><br/>");

if (buttonState == HIGH) {
e.print("Alto");
delay(20); // Ajustar este tiempo de retardo
}
else {
e.print("Bajo");
}
e.respond();
}
delay(10);
}

 

Vamos a un navegador web y escribimos la IP 192.168.1.15
Según el botón esté pulsado nos saldrá la palabra Alto o Bajo.

Para que funcione, debemos refrescar la página web.

Para que la página se refresque automáticamente he puesto en el código:
<META HTTP-EQUIV='REFRESH' CONTENT='1'>

Esto hará que la página se refresque automáticamente cada segundo. El único inconveniente es que contínuamente está utilizando ancho de banda, sin embargo el tráfico es muy reducido ya que la página web lleva poca información.

 

__________________________________

Proyecto completo

Bajar el Proyecto_completo.ino

(Nota los .ino son programas para la versión del IDE 1.0 del Arduino, ya no son .pde)

Ahora se trata de unir todos los proyectos anteriores, es decir voy a realizar un proyecto donde:

- En un página web aparezcan dos botones, uno encenderá/apagará un LED conectado a la salida 2, otro encenderá/apagará un LED conectado a la salida 3.
- En la misma página web, aparecerán otros dos botones, uno incrementará el brillo de un LED conectado a la salida ~6 y el otro botón disminuirá el brillo del LED de la salida ~6 (PWM)

- En el circuito de prueba existirá (además de los 3 LED anteriores) un pulsador, conectado al terminal 9. De manera que cuando esté "pulsado/no pulsado", aparecerá en la página web un texto indicando "Pulsador 9 Activado" o "Pulsador 9 Desactivado"

- En el circuito de prueba también tendremos una LDR. conectada a la entrada ANALOG IN 3, que enviará el valor de iluminación a la página web.

Voy a utilizar el IDE 1.0 del Arduino, el Arduino UNO, el Shield Ethernet basado en el chip ENC28J60 y la librería etherShield.

NOTAS:

- He utilizado el puerto 234 en vez del puerto 80 que es el típico de la web. Así que para ver la página debo escribir
http://192.168.1.15:234
- He quitado tildes para abreviar el código.

- Si pulsamos el botón Incrementa o el Decrementa, y luego lo dejamos de pulsar, seguirá avanzando el incremento o decremento aunque no esté pulsado (se puede ver mediante el Serial Monitor). Para evitarlo he puesto otro botón llamado "Parar incrementa/decrementa" que al pulsarlo para el incremento/decremento.

- He añadido la línea:
plen=es.ES_fill_tcp_data_p(buf,0,PSTR("<head><META HTTP-EQUIV=\"REFRESH\" CONTENT=\"1\"</head>"));
para que se produzca un refresco automático de la página cada segundo.

- También se puede refrescar la página mediante un botón:
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<hr><FORM><INPUT TYPE=\"button\" onClick=\"history.go(0)\" VALUE=\"Refrescar pagina\"></FORM>"));

- Se puede eliminar la linea de REFRESH y dejar el botón de "Refrescar pagina".
- El Refresco automático solo tiene sentido para el pulsador del Arduino (boton9) y la lectura en tiempo real de la LDR.

- El refresco automático de la página consume más ancho de banda que el refresco manual.

- El tamaño del buffer que envía la información es limitado:
#define BUFFER_SIZE 1500
por lo cual no es posible crear una página web con mucho contenido.

- Si se llama a la vez desde distintos navegadores a la página web, probablemente se va a bloquear (sobre todo si le hemos puesto refresco automático).

- La línea: ValorLDR = map(ValorLDR, 4, 520, 0, 100) ; // mapear el valor del LED
convierte el rango de valores obtenidos en la LDR, en este caso desde 4 hasta 520, en un rango entre 0 y 100.

 

NOTAS:
Para que pueda actuar con la IP pública de Internet, hacemos los siguientes cambios:

static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
static uint8_t myip[4] = {192,168,1,15}; // Esta es la IP privada que he puesto en mi Arduino
static char baseurl[]="http://217.127.191.134:234/"; // Aqui establezco mi IP pública y el puerto
static uint16_t mywwwport =234; // He cambiado el puerto, en vez del 80 he puesto el 234

- Debo actuar en el Firewall de Windows, para hacer pruebas incluso lo puedo deshabilitar momentáneamente.
- Debo ir a la configuración del Router y abrir el puerto 234 a la IP 192.168.1.15

En este caso para entrar desde cualquier lugar a mi web del Arduino escribiríamos: 217.127.191.134:234

__________________________________

Al pulsar un botón del Arduino, se envía un email a mi cuenta de correo.


Bajar el Proyecto_completo.ino

 

Pues eso. Pulsamos un botón en el circuito del Arduino y se envía un email a nuestra cuenta de correo.

Esto es algo complicado de hacer directamente con la librería etherShield, asi que voy a utilizar un truquito. Para ello necesito un servidor web que tenga php. Es decir un servidor "normal", un hosting externo con php.
Si tenemos un hosting de pago, muy probablemente dispondrá de php. De todos modos hay hosting gratuitos que disponen de php. Este es un hosting gratuito con php (aunque no he probado si funciona el correo): http://byethost.com/index.php/free-hosting

- Una característica, en este caso negativa, de este proyecto es que para que funcione, debe estar visualizándose previamente la página web, en mi caso: 192.168.1.15:234

Subimos a nuestro servidor web (hosting) el siguiente archivo: correo.php
(Lo subimos a la raíz de nuestro sitio web)

Subo a mi hosting este archivo: correo.php

// Juan Antonio Villalpando
// juana1991@yahoo.com

<HTML><HEAD></HEAD><BODY>

<?php
$para = "juana1991@yahoo.com";
$asunto = "Tu casa está ardiendo";
$mensaje = "Hola Juan,\n\nel Arduino ha detectado que tu casa está ardiento. Ven pronto.";
$nombre = "Arduino";
$decorreo = "arduino@juana1991.com";

if (mail($para, $asunto, $mensaje,"From: $nombre <$decorreo>"))
{
echo ("Mensaje enviado");
}
else
{
echo ("Error en el envio!...");
}
?>

</BODY></HTML>

Estoy utilizando: Arduino UNO, Ethernet Shield con el ENC28J60, la librería etherShield y el IDE 1.0 de Arduino.
Ahora cargamos en nuesto Arduino este archivo:

El casi el mismo del Proyecto_completo.ino visto anteriormente, no he querido cambiarlo para que resulte familiar.

Por supuesto que tiene muchas mejoras, por ejemplo si dejas pulsado el botón enviará varios correos. Así que debemos poner en el código un algoritmo para que solo se envíe una vez.

En fin, se puede corregir todo lo que quieras, esto es un programa de aprendizaje, no pretendo hacer un programa depurado.

Total que he añadido solamente estas líneas rojas:

switch (on_off6) {
case 1:
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<font color=\"#00FF00\">Pulsador 9 Activado</font><br><hr>"));

plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<iframe src=\"http://www.iesromerovargas.com\\correo.php\" frameborder=\"0\" >"));
return(plen);


break;
case 0:
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<font color=\"#CC0000\">Pulsador 9 Desactivado</font><br><hr>"));
break;
}


- No voy a subir el archivo del código, es el mismo visto anteriormente
Bajar el Proyecto_completo.ino, solo añade las líneas rojas anteriores en el switch(on_off6)

- Llamo al archivo correo.php mediante un iframe, se me ha ocurrido que puede ser la manera más sencilla.
El archivo correo.php lo he puesto en la raíz del sitio web.

- Cuando pulso el botón (más bien es un pulsador), sale el mensaje de Pulsador 9 Activado y se envía un correo mediante el correo.php

Voy a mi cuenta de correo y observo los mensajes que me ha enviado el Arduino.

NOTA: Si en un navegador web escribimos la dirección donde se encuentra correo.php, también recibiremos el correo, en mi caso:
http://iesromerovargas.com/correo.php

¿Por qué algunas comillas " y la barra \ lleva delante una barra?

Resulta que las comillas y la barra el código del Arduino (en lenguaje C) se utiliza para una cosa y en el código HTML se utiliza para otra.

plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<iframe src=\"http://www.iesromerovargas.com\\correo.php\" frameborder=\"0\" >"));

Las comillas que he puesto en verde pertenecen el código del Arduino (lenguaje C)
Las comillas y la barra en azul, llevan delante una barra para indicar que no pertenecen al código Arduino, que pertenece al código HTML.

Bueno, espero que te haya gustado todo lo que hemos visto, te agradecería que me enviaras un correo de opiniones y sugerencias a juana1991@yahoo.com

__________________________________
__________________________________
__________________________________
__________________________________ __________________________________
__________________________________
__________________________________
__________________________________

Ahora vamos a realizar montajes parecidos pero con el...
2.- Ethernet Shield with Wiznet W5100 Ethernet Chip W5100

1.- Compro el http://www.dealextreme.com/p/ethernet-shield-with-wiznet-w5100-ethernet-chip-tf-slot-118061 por 16 € a Dealextreme, tardó unos 20 días en llegar. Este módulo es más barato y con mejores prestaciones que el anterior. Tiene conector para tarjetas de memorias SD. Está basado en el chip W5100 (también se calienta mucho cuando está funcionando). Utiliza las librerías "oficiales" de Arduino. Vamos a ver varios ejemplos con esta placa.


Shield Ethernet con el chip W5100

 

2.- Lo inserto en el Arduino Uno (tiene los pines de inserción muy largos pero entran bien), conecto el cable USB del Arduino y un cable RJ45 del Router al módulo de Ethernet...

3.- Para realizar estos programas utilizo el Arduino UNO, el Shield Ethernet W510, el IDE 1.0 y la librería oficial del Arduino Ethernet.

Miramos el tutorial de la web del Arduino
http://arduino.cc/en/Tutorial/WebClient
y observamos este dibujo...

Para las salidas de datos están disponibles:
D0, D1, D2, D3, D5, D6, D7, D8 y D9
así que debemos tener cuidado con esta infomación.

No es conveniente utilizar los pines:
D4, D10, D11, D12 y D13.

 

Debido a que el W5100 y la memoria SD comparten el mismo bus SPI, solo uno de ellos se puede activar al mismo tiempo. Si estás utilizando los dos periféricos en tu programa, debes tener cuidado con sus librerías. Si no estás utilizando uno de los periféricos en tu programa, necesitarás deseleccionarlo.

D4 es el CS del SD
D10 es el CS del Ethernet

Para hacerlo con la memoria SD, establece el pin 4 como output y escribe high.
Para deshabilitar la SD
pinMode(4, OUTPUT );
digitalWrite(4, HIGH );
Para el W5100, establece el pin 10 como output y lo escribe high.
Para deshabilitar el W5100
pinMode(10, OUTPUT );
digitalWrite(10, HIGH );

the description is technically confusing but basically what it means is - you have to interleave SD card access and ethernet access. it just means its not super fast, not that you can't essentially do both at the same time

note that there is no precise example code to do what you want (yet)

The Ethernet Shield comes with an SD card slot onboard. The shield fits on top of your Arduino. Because the Ethernet module uses pin 10, the CS pin for the SD card has been moved to pin 4. Make sure you use SD.begin(4) to use the SD card functionality.

LEDs del Shield: 

  • PWR: indica que el shield tiene alimentación.
  • LINK: indica la presencia de enlace a la red y cuando se reciben o envian datos da intermitencias.
  • FULLD: indica que la red funciona en full duplex.
  • 100M: indica la presencia de red a 100 Mb/s (en vez de 10 Mb/s)
  • RX: Intermitente cuando se reciben datos.
  • TX: Intermitente cuando se envían datos.
  • COLL: intermitente cuando hay colisiones de red.

Leer

NOTA: en Internet puedes encontrar programas para el Arduino, pero asegúrate si son para la versión IDE 0022 (.pde) o para IDE 1.0 (.ino), porque muchas veces son incompatibles.

Al pulsar botones de una página web se encienden diodos LED del Arduino

 

Vamos a volver a realizar el programa visto al inicio de esta página. Podemos pulsar seis botones en una página web y dependiendo del botón pulsado se encenderá o apagará un LED.

No olvidemos que el Shield Ethernet basado en el chip W5100 funciona con la libretía Ethernet, que es la oficial del Arduino y ya viene en la carpeta libraries.

El Arduino y su Shield funcionan como servidor web.
En un navegador web escribimos la IP establecida en el código, en mi caso 192.168.1.205
Y me sale la siguiente página web.
Placa del Arduino (circuito): En el Arduino+Shield situo 6 diodos LED (concretamente en las salidas 1,2, 3, 5, 6 y 7)
Cuando pulsamos un botón de la página web, el LED correspondiente se encenderá/apagará.

Aquí está el código, lo he adaptado para que se parezca al que vimos al inicio. Como puedes observar es más sencillo que el que utilizamos con el Shield Ethernet ENC28J60 y su correspondiente librería.

Varios_Botones.pde

// Juan Antonio Villalpando
// juana1991@yahoo.com

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,205);
byte on_off1;
byte on_off2;
byte on_off3;
byte on_off4;
byte on_off5;
byte on_off6;

#define SW1 1
#define SW2 2
#define SW3 3
#define SW4 5
#define SW5 6
#define SW6 7

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
String readString = String(300);

void setup()
{
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
pinMode(SW1, OUTPUT);
digitalWrite(SW1, LOW); // switch off LED
pinMode(SW2, OUTPUT);
digitalWrite(SW2, LOW); // switch off LED
pinMode(SW3, OUTPUT);
digitalWrite(SW3, LOW); // switch off LED
pinMode(SW4, OUTPUT);
digitalWrite(SW4, LOW); // switch off LED
pinMode(SW5, OUTPUT);
digitalWrite(SW5, LOW); // switch off LED
pinMode(SW6, OUTPUT);
digitalWrite(SW6, LOW); // switch off LED
}

void loop()
{
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (readString.length()<1500)
{
readString += c;
}
if (c=='\n')
{

if(readString.indexOf("cmd=A")>0){
on_off1=1;
digitalWrite(SW1, HIGH); // switch on LED1
}
if(readString.indexOf("cmd=B")>0){
on_off1=0;
digitalWrite(SW1, LOW); // switch off LED1
}
if(readString.indexOf("cmd=C")>0){
on_off2=1;
digitalWrite(SW2, HIGH); // switch on LED2
}
if(readString.indexOf("cmd=D")>0){
on_off2=0;
digitalWrite(SW2, LOW); // switch off LED2
}
if(readString.indexOf("cmd=E")>0){
on_off3=1;
digitalWrite(SW3, HIGH); // switch on LED3
}
if(readString.indexOf("cmd=F")>0){
on_off3=0;
digitalWrite(SW3, LOW); // switch off LED3
}
if(readString.indexOf("cmd=G")>0){
on_off4=1;
digitalWrite(SW4, HIGH); // switch on LED4
}
if(readString.indexOf("cmd=H")>0){
on_off4=0;
digitalWrite(SW4, LOW); // switch off LED4
}
if(readString.indexOf("cmd=I")>0){
on_off5=1;
digitalWrite(SW5, HIGH); // switch on LED5
}
if(readString.indexOf("cmd=J")>0){
on_off5=0;
digitalWrite(SW5, LOW); // switch off LED5
}
if(readString.indexOf("cmd=K")>0){
on_off6=1;
digitalWrite(SW6, HIGH); // switch on LED6
}
if(readString.indexOf("cmd=L")>0){
on_off6=0;
digitalWrite(SW6, LOW); // switch off LED6
}


readString="";
// Comienzo de pagina

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();

client.println("<html>");
client.println("<head>");
client.println("<title>SERVIDOR DOMÓTICO</title>");
client.println("</head>");
client.println("<body> <center>");
client.println("<FONT FACE=\"arial\"><center><p><A HREF=\"/\"><b>SERVIDOR DOMOTICO</b></A></p>");
client.println("<hr><br>");



client.println("<table bgcolor=\"#f7f7f7\"><tr><td align=center>");
switch (on_off1) {
case 1:
client.println("Out 1: <font color=\"#00FF00\">On</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=B>");
client.println("<input type=submit value=\"Switch off\"></form>");
break;
case 0:
client.println("Out 1: <font color=\"#CC0000\">Off</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=A>");
client.println("<input type=submit value=\"Switch on\"></form>");
break;
}
client.println("</td><td align=center>");
switch (on_off2) {
case 1:
client.println("Out 2: <font color=\"#00FF00\">On</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=D>");
client.println("<input type=submit value=\"Switch off\"></form>");
break;
case 0:
client.println("Out 2: <font color=\"#CC0000\">Off</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=C>");
client.println("<input type=submit value=\"Switch on\"></form>");
break;
}
client.println("</td></tr><tr><td align=center>");
switch (on_off3) {
case 1:
client.println("Out 3: <font color=\"#00FF00\">On</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=F>");
client.println("<input type=submit value=\"Switch off\"></form>");
break;
case 0:
client.println("Out 3: <font color=\"#CC0000\">Off</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=E>");
client.println("<input type=submit value=\"Switch on\"></form>");
break;
}
client.println("</td><td align=center>");
switch (on_off4) {
case 1:
client.println("Out 4: <font color=\"#00FF00\">On</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=H>");
client.println("<input type=submit value=\"Switch off\"></form>");
break;
case 0:
client.println("Out 4: <font color=\"#CC0000\">Off</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=G>");
client.println("<input type=submit value=\"Switch on\"></form>");
break;
}
client.println("</td></tr><tr><td align=center>");
switch (on_off5) {
case 1:
client.println("Out 5: <font color=\"#00FF00\">On</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=J>");
client.println("<input type=submit value=\"Switch off\"></form>");
break;
case 0:
client.println("Out 5: <font color=\"#CC0000\">Off</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=I>");
client.println("<input type=submit value=\"Switch on\"></form>");
break;
}
client.println("</td><td align=center>");
switch (on_off6) {
case 1:
client.println("Out 6: <font color=\"#00FF00\">On</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=L>");
client.println("<input type=submit value=\"Switch off\"></form>");
break;
case 0:
client.println("Out 6: <font color=\"#CC0000\">Off</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=K>");
client.println("<input type=submit value=\"Switch on\"></form>");
break;
}
client.println("</td></tr></table></center><hr></center>Ethernet Shield Arduino 1.0");
client.println("</body>");
client.println("</html>");

client.stop();

}
}
}
}
}

 

__________________________________

Al pulsar botones de una página web se enciende o apaga poco a poco un diodo LED conectado a la salida 9 del Arduino

Voy a modificar un poco el código anterior para que al pulsar contínuamente el botón Out 1, se vaya encendiendo poco a poco un diodo LED conectado a la salida ~9 del Arduino. Y al pulsar contínuamente el botón Out 2, se vaya apagando poco a poco el diodo LED conectado a la salida ~9 del Arduino.

Conectamos un diodo LED a la salida ~9 del Arduino, ya que esta es una salida de tipo ~PWM.

El código se podría haber abreviado, pero he querido mantenerlo como estaba.

Aquí tenemos el código: webserver_Analogico_W5100.ino
(Nota: si utilizas el IDE 0022, 0023... los archivos son .pde, si utilizas el IDE 1.0 son .ino)

El código se puede mejorar quitando botones, eliminando líneas, poniendo un delay para que no se pueda pulsar rápidamente, evitando que suba de 255 y baje de 0,...

Si abrimos el Serial Monitor en el Arduino podemos ver cómo evoluciona el valor recibido.

__________________________________

Ahora vamos a realizarlo al revés, es decir al pulsar un botón del Arduino, cambia la información de una página web

Para que funcione utilizamos el IDE del Arduino 1.0 y la Librería oficial Ethernet de Arduino

Realizamos el siguiente montaje: un pulsador y una resistencia de unos 10K. El cable intermedio va a la entrada 2.

 


Pegamos este código en el IDE 1.0 de Arduino. Lo he llamado etherShield_Boton_W5100

He adaptado ligeramente este tutorial:

http://www.instructables.com/id/Arduino-Ethernet-Shield-Tutorial/step3/Get-started/

etherShield_Boton_W5100

// Juan Antonio Villalpando
// juana1991@yahoo.com


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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };
IPAddress ip(192,168,1,15); //<<< ENTER YOUR IP ADDRESS HERE!!!

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

int buttonPress = 1;

void setup()
{
pinMode(2, INPUT);

// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
}

void loop()
{
buttonPress = digitalRead(2);
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();

client.println("<META HTTP-EQUIV='REFRESH' CONTENT='1'>");
client.println("<H1>Estado del interruptor de entrada 2</H1><br/>");

//serves a different version of a website depending on whether or not the button
//connected to pin 2 is pressed.
if (buttonPress == 1) {
client.println("<html><body>Alto</body></html>");
}
else if (buttonPress == 0){
client.println("<html><body>Bajo</body></html>");
}

break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}
}

Vamos a un navegador web y escribimos la IP 192.168.1.15
Según el botón esté pulsado nos saldrá la palabra Alto o Bajo.

Para que funcione, debemos refrescar la página web.

Para que la página se refresque automáticamente he puesto en el código:
<META HTTP-EQUIV='REFRESH' CONTENT='1'>

Esto hará que la página se refresque automáticamente cada segundo. El único inconveniente es que contínuamente está utilizando ancho de banda, sin embargo el tráfico es muy reducido ya que la página web lleva poca información.

__________________________________

Proyecto completo

Bajar el Proyecto_completo_W5100.ino

(Nota los .ino son programas para la versión del IDE 1.0 del Arduino, ya no son .pde)

Ahora se trata de unir todos los proyectos anteriores, es decir voy a realizar un proyecto donde:

- En un página web aparezcan dos botones, uno encenderá/apagará un LED conectado a la salida 2, otro encenderá/apagará un LED conectado a la salida 3.
- En la misma página web, aparecerán otros dos botones, uno incrementará el brillo de un LED conectado a la salida ~6 y el otro botón disminuirá el brillo del LED de la salida ~6 (PWM)

- En el circuito de prueba existirá (además de los 3 LED anteriores) un pulsador, conectado al terminal 9. De manera que cuando esté "pulsado/no pulsado", aparecerá en la página web un texto indicando "Pulsador 9 Activado" o "Pulsador 9 Desactivado"

- En el circuito de prueba también tendremos una LDR. conectada a la entrada ANALOG IN 3, que enviará el valor de iluminación a la página web.

Voy a utilizar el IDE 1.0 del Arduino, el Arduino UNO, el Shield Ethernet basado en el chip W5100 y la librería Ethernet.

NOTAS:

- He utilizado el puerto 234 en vez del puerto 80 que es el típico de la web. Así que para ver la página debo escribir
http://192.168.1.15:234
- He quitado tildes para abreviar el código.

- Si pulsamos el botón Incrementa o el Decrementa, y luego lo dejamos de pulsar, seguirá avanzando el incremento o decremento aunque no esté pulsado (se puede ver mediante el Serial Monitor). Para evitarlo he puesto otro botón llamado "Parar incrementa/decrementa" que al pulsarlo para el incremento/decremento.

- He añadido la línea:
client.println("<head><META HTTP-EQUIV=\"REFRESH\" CONTENT=\"1\"</head>");
para que se produzca un refresco automático de la página cada segundo.

- También se puede refrescar la página mediante un botón:
client.println("<hr><FORM><INPUT TYPE=\"button\" onClick=\"history.go(0)\" VALUE=\"Refrescar pagina\"></FORM>");

- Se puede eliminar la linea de REFRESH y dejar el botón de "Refrescar pagina".
- El Refresco automático solo tiene sentido para el pulsador del Arduino (boton9) y la lectura en tiempo real de la LDR.

- El refresco automático de la página consume más ancho de banda que el refresco manual.

- El tamaño del buffer que envía la información es limitado:
#define BUFFER_SIZE 1500
por lo cual no es posible crear una página web con mucho contenido.

- Si se llama a la vez desde distintos navegadores a la página web, probablemente se va a bloquear (sobre todo si le hemos puesto refresco automático).

- La línea: ValorLDR = map(ValorLDR, 4, 520, 0, 100) ; // mapear el valor del LED
convierte el rango de valores obtenidos en la LDR, en este caso desde 4 hasta 520, en un rango entre 0 y 100.

 

NOTAS:
Para que pueda actuar con la IP pública de Internet, hacemos los siguientes cambios:

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,15);
EthernetServer server(234); // He puesto el puerto 234, se debe entrar en la pagina 192.168.1.15:234

- Debo actuar en el Firewall de Windows, para hacer pruebas incluso lo puedo deshabilitar momentáneamente.
- Debo ir a la configuración del Router y abrir el puerto 234 a la IP 192.168.1.15

En este caso para entrar desde cualquier lugar a mi web del Arduino escribiríamos: 217.127.191.134:234

 

Proyecto_completo_W5100

// Juan Antonio Villalpando
// juana1991@yahoo.com

// Recursos utilizados: Arduino UNO, Shield Ethernet W5100, Libreria Ethernet, IDE Arduino 1.0
// Agosto 16 de 2012

/*
- En un pagina web aparezcan dos botones, uno encendera/apagara un LED conectado a la salida 2, otro encenderá/apagará un LED conectado a la salida 3
- En la misma pagina web, aparecerán otros dos botones, uno incrementara el brillo de un LED conectado a la salida ~6 y el otro botón disminuirá el brillo del LED de la salida ~6 (PWM)

- En el circuito de prueba existira (ademas de los 3 LED anteriores) un pulsador, conectado al terminal 9. De manera que cuando esé "pulsado/no pulsado", aparecerá en la página web un texto indicando "Pulsador 9 Activado" o "Pulsador 9 Desactivado"

- En el circuito de prueba también tendremos una LDR. conectada a la entrada ANALOG IN 3, que enviará el valor de iluminación a la pÃágina web.
*/

/*
El tamaño del buffer es critico en este caso:
#define BUFFER_SIZE 1500
Esto hace que este limitado el tamaño de la pagina web.

He puesto una actualizacion automatica de la pagina mediante:
client.println("<head><META HTTP-EQUIV=\"REFRESH\" CONTENT=\"1\"</head>");

Tambien he puesto al final del codigo un boton de refresco de pagina, por si no queremos la actualizacion automatica anterior
client.println("<hr><FORM><INPUT TYPE=\"button\" onClick=\"history.go(0)\" VALUE=\"Refrescar pagina\"></FORM>");

Hay que tener en cuenta que si la página se refresca automaticamente y hemos pulsado el boton de incremento o decremento, este continuará
aunque dejemos de pulsarlo. Para evitarlo he añadido otro boton de Parar_Incremento_Decremento
*/

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,15);
EthernetServer server(234); // He puesto el puerto 234, se debe entrar en la pagina 192.168.1.15:234
byte on_off1;
byte on_off2;
byte on_off3;
byte on_off4;
byte on_off5;
byte on_off6;

char valorc[]="1234"; ///////////////////>>>>>>>>>>>>> char Valor del brillo inicial del LED 6
int valor=100; //////////////////////////>>>>>>>>>>>>> int Valor del brillo inicial del LED 6
char LDR[]="12345"; ////////////////////>>>>>>>>>>>>>> char LDR
int ValorLDR; /////////////////////////>>>>>>>>>>>>>>> int LDR

// Un LED en terminal 2 y otro en terminal 3
#define SW1 2
#define SW2 3

const int boton9 = 9; //////////////>>>>>>>>>>>>>>>> Pulsador en entrada 9
int buttonState = 0; //////////////>>>>>>>>>>>>>>>> Estado del pulsador 9

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):

String readString = String(30); / /string recoger los datos de la direccion

void setup()
{
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();

// Init outputs
pinMode(SW1, OUTPUT);
digitalWrite(SW1, LOW); // switch off LED2
pinMode(SW2, OUTPUT);
digitalWrite(SW2, LOW); // switch off LED3

pinMode(boton9, INPUT); ///////////////>>>>>>>>>>>> Pulsador en entrada 9
}

void loop()
{
ValorLDR = analogRead(A3); /////////////>>>>>>>>>>>> Lectura del valor de tension en la LDR

// listen for incoming clients
EthernetClient client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (readString.length()<30)
{
readString += c;
}
if (c=='\n')
{

if(readString.indexOf("cmd=A")>0){
on_off1=1;
digitalWrite(SW1, HIGH); // LED 2 Encendido
}
if(readString.indexOf("cmd=B")>0){
on_off1=0;
digitalWrite(SW1, LOW); // LED 2 Apagado
}
if(readString.indexOf("cmd=C")>0){
on_off2=1;
digitalWrite(SW2, HIGH); // LED 3 Encendido
}
if(readString.indexOf("cmd=D")>0){
on_off2=0;
digitalWrite(SW2, LOW); // LED 3 Apagado
}
if(readString.indexOf("cmd=E")>0){
/////////////////////////>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> AUMENTA EL BRILLO DEL LED 6
valor=valor+1; // Juan A.
// Serial.println(valor); // Juan A.
analogWrite(6, valor); // Juan A.
}
if(readString.indexOf("cmd=F")>0){
////////////////////////>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DISMINUYE EL BRILLO DEL LED 6
valor=valor-1; // Juan A.
// Serial.println(valor); // Juan A.
analogWrite(6, valor); // Juan A.
}



readString="";
// Comienzo de pagina

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();

client.println("<html>");
client.println("<head>");
client.println("<head><META HTTP-EQUIV=\"REFRESH\" CONTENT=\"1\"</head>");
client.println("</head>");
client.println("<body> <center>");
client.println("<h1><center><b>Arduino en Internet - Juan A. Villalpando</b></center></h1>");
client.println("<hr><br>");


client.println("<center><table bgcolor=\"#f7f7f7\"><tr><td align=center>");
switch (on_off1) {
case 1:
client.println("LED 2: <font color=\"#00FF00\">On</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=B>");
client.println("<input type=submit value=\" Apagalo \"></form>");
break;
case 0:
client.println("LED 2: <font color=\"#CC0000\">Off</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=A>");
client.println("<input type=submit value=\"Enciendelo\"></form>");
break;
}
client.println("</td><td align=center>");
switch (on_off2) {
case 1:
client.println("LED 3: <font color=\"#00FF00\">On</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=D>");
client.println("<input type=submit value=\" Apagalo \"></form>");
break;
case 0:
client.println("LED 3: <font color=\"#CC0000\">Off</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=C>");
client.println("<input type=submit value=\"Enciendelo\"></form>");
break;
}
client.println("</td></tr><tr><td align=center>");
switch (on_off3) {
default:
client.println("Brillo LED 6");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=E>");
client.println("<input type=submit value=\"Incrementa\"></form>");
break;
}
client.println("</td><td align=center>");
switch (on_off4) {
default:
client.println("Brillo LED 6<br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=F>");
client.println("<input type=submit value=\"Decrementa\"></form>");
break;
}

client.println("</td></tr></table></center></center><hr>");

/////////////// Escribe el Valor de Incrementa-Decrementa //////////////////////////////////////
// Pasamos un entero a char mediante este codigo...
// http://stackoverflow.com/questions/8263382/convert-int-to-string-char-c-arduino
// valor es entero, valorc es char
memset (valorc, 0, sizeof(valorc));
snprintf(valorc, sizeof(valorc)-1, "%d", valor);

client.println("<br>Valor incremento/decremento <b>");
client.println(valorc);
client.println(" </b><hr>");
///////////////////////////////////////////////////////////////////////////////////////////////
switch (on_off5) {
default:
client.println("Parar Incrementa/Decrementa automatico:<br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=Parar_Incremento_Decremento>");
client.println("<input type=submit value=\"Parar Incremento-Decremento\"></form><hr>");
break;
}
//////////////// Pulsador 8 ///////////////////////////////////////////////////////////////

buttonState = digitalRead(boton9); // LEE ESTADO DEL PULSADOR 9

if (buttonState == HIGH) {
on_off6=1;
delay(20); // Ajustar este tiempo de retardo
}
else {
on_off6=0;
}
switch (on_off6) {
case 1:
client.println("<font color=\"#00FF00\">Pulsador 9 Activado</font><br><hr>");
break;
case 0:
client.println("<font color=\"#CC0000\">Pulsador 9 Desactivado</font><br><hr>");
break;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////// VALOR DE LA LDR ///////////////////////////////////////////////////////////////////////////////////////////

ValorLDR = map(ValorLDR, 0,500, 0, 100) ; // mapear el valor del LED
// Pasamos un entero a char mediante este código...
// http://stackoverflow.com/questions/8263382/convert-int-to-string-char-c-arduino
// sensorValue es entero, LDR es char
memset (LDR, 0, sizeof(LDR));
snprintf(LDR, sizeof(LDR)-1, "%d", ValorLDR);

client.println("Valor en la LDR: (en ANALOG IN 3) <b>");
client.println(LDR);
client.println(" </b>");
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////// Boton de Refrescar pagina /////////////////////////////////////////////////////////////////////////
client.println("<hr><FORM><INPUT TYPE=\"button\" onClick=\"history.go(0)\" VALUE=\"Refrescar pagina\"></FORM>"); // Refresco por boton

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
client.println("<hr>Juan Antonio Villalpando");

client.println("</body>");
client.println("</html>");

client.stop();

}
}
}
}
}

 

__________________________________

Al pulsar un botón del Arduino, se envía un email a mi cuenta de correo.
(Nota: hay que depurarlo, no funciona)


Bajar el Proyecto_completo_W5100.ino

 

Pues eso. Pulsamos un botón en el circuito del Arduino y se envía un email a nuestra cuenta de correo.

Esto es algo complicado de hacer directamente con la librería Ethernet, así que voy a utilizar un truquito. Para ello necesito un servidor web que tenga php. Es decir un servidor "normal", un hosting externo con php.
Si tenemos un hosting de pago, muy probablemente dispondrá de php. De todos modos hay hosting gratuitos que disponen de php. Este es un hosting gratuito con php (aunque no he probado si funciona el correo): http://byethost.com/index.php/free-hosting

- Una característica, en este caso negativa, de este proyecto es que para que funcione, debe estar visualizándose previamente la página web, en mi caso: 192.168.1.15:234

Subimos a nuestro servidor web (hosting) el siguiente archivo: correo.php
(Lo subimos a la raíz de nuestro sitio web)

Subo a mi hosting este archivo: correo.php

// Juan Antonio Villalpando
// juana1991@yahoo.com

<HTML><HEAD></HEAD><BODY>

<?php
$para = "juana1991@yahoo.com";
$asunto = "Tu casa está ardiendo";
$mensaje = "Hola Juan,\n\nel Arduino ha detectado que tu casa está ardiento. Ven pronto.";
$nombre = "Arduino";
$decorreo = "arduino@juana1991.com";

if (mail($para, $asunto, $mensaje,"From: $nombre <$decorreo>"))
{
echo ("Mensaje enviado");
}
else
{
echo ("Error en el envio!...");
}
?>

</BODY></HTML>

Estoy utilizando: Arduino UNO, Ethernet Shield con el W5100, la librería Ethernet y el IDE 1.0 de Arduino.
Ahora cargamos en nuesto Arduino este archivo:

El casi el mismo del Proyecto_completo_W5100.ino visto anteriormente, no he querido cambiarlo para que resulte familiar.

Por supuesto que tiene muchas mejoras, por ejemplo si dejas pulsado el botón enviará varios correos. Así que debemos poner en el código un algoritmo para que solo se envíe una vez.

En fin, se puede corregir todo lo que quieras, esto es un programa de aprendizaje, no pretendo hacer un programa depurado.

Total que he añadido solamente esta línea roja:

switch (on_off6) {
case 1:
client.println("<font color=\"#00FF00\">Pulsador 9 Activado</font><br><hr>");

client.println("<iframe src=\"http://www.iesromerovargas.com\\correo.php\" frameborder=\"0\" >");


break;
case 0:
client.println("<font color=\"#CC0000\">Pulsador 9 Desactivado</font><br><hr>");
break;
}


- No voy a subir el archivo del código, es el mismo visto anteriormente
Bajar el Proyecto_completo_W5100.ino, solo añade las líneas rojas anteriores en el switch(on_off6)

- Llamo al archivo correo.php mediante un iframe, se me ha ocurrido que puede ser la manera más sencilla.
El archivo correo.php lo he puesto en la raíz del sitio web.

- Cuando pulso el botón (más bien es un pulsador), sale el mensaje de Pulsador 9 Activado y se envía un correo mediante el correo.php

Voy a mi cuenta de correo y observo los mensajes que me ha enviado el Arduino.

NOTA: Si en un navegador web escribimos la dirección donde se encuentra correo.php, también recibiremos el correo, en mi caso:
http://iesromerovargas.com/correo.php

¿Por qué algunas comillas " y la barra \ lleva delante una barra?

Resulta que las comillas y la barra el código del Arduino (en lenguaje C) se utiliza para una cosa y en el código HTML se utiliza para otra.

client.println("<iframe src=\"http://www.iesromerovargas.com\\correo.php\" frameborder=\"0\" >");

Las comillas que he puesto en verde pertenecen el código del Arduino (lenguaje C)
Las comillas y la barra en azul, llevan delante una barra para indicar que no pertenecen al código Arduino, que pertenece al código HTML.

Bueno, espero que te haya gustado todo lo que hemos visto, te agradecería que me enviaras un correo de opiniones y sugerencias a juana1991@yahoo.com

__________________________________

Tarjeta de memoria microSD en el Shield Ethernet W51000

 

El Shield basado en el W5100 tiene un conector para tarjetas de memorias SD.

La memoria SD debe ser realmente "microSD", las SD de tamaño normal no entran en el lector, así que asegúrate antes de comprarla.

En esta tarjeta se pueden guardar y leer información en archivos y directorios.

Utilizo el Arduino UNO, el shield Ethernet basado en el chip Wizet W5100, el IDE 1.0, la librería Ethernet que viene con el IDE 1.0 y una tarjeta de memoria microSD. Carga los ejemplos que trae el mismo IDE de Arduino en Archivos / Ejemplos / SD. Suelen funcionar, la mayoría tratan de crear archivos, guardar datos en los archivos, listar archivos, borrarlos,... en la tarjeta microSD. Pero todo independientemente de la parte de Ethernet.

Si queremos trabajar a la vez con la parte Ethernet y la parte de la tarjeta microSD en nuestro shield Ethernet W5100, la cosa se complica.

En mi caso he realizado pruebas llegando a algunas conclusiones, que seguramente se pueden mejorar. He intentado que funcione "a la vez" el Ethernet y la microSD y lo he conseguido con algunos programas.

En fin, lo intento ver de esta manera...

Resulta que los datos "se mueven" por el Shield Ethernet mediante el denominado bus SPI (#include <SPI.h>). Este bus SPI lo utiliza la parte Ethernet y la parte de la tarjeta microSD, pero no pueden utilizarlo conjuntamente al mismo tiempo, o bien lo utiliza el Ethernet o bien lo utiliza la microSD.

De tal manera que el programa debe contener instrucciones que...

- anule la parte Ethernet para que el bus pueda ser utilizado por la microSD
pinMode(10, OUTPUT); // deshabilita ethernet
digitalWrite(10, HIGH ); // deshabilita ethernet

- anule la parte microSD para que el bus pueda ser utilizado por la Ethernet
pinMode(4, OUTPUT); // deshabilita microSD
digitalWrite(4, HIGH ); // deshabilita microSD

Así que cuando queramos trabajar con la parte Ethernet anulamos la microSD y cuando queramos trabajar con la microSD anulamos la parte Ethernet. Vamos cambiando de un código a otro.

Posiblemente no es necesario tanto cambio, pero me ha funcionado de esta manera, en otros tutoriales utilizan otras formas más elegantes.

¿Por qué el pin 4 y el pin 10?

Si volvemos a consultar el dibujo del Shield...

...observamos...

que el pin 4 es el SS for SD card (este pin selecciona a la tarjeta SD)
que el pin 10 es el SS for Ethernet controller (este pin selecciona a Ethernet)

Así que según esté el 4 o el 10 activado, el bus SPI lo tendrá el microSD o el Ethernet.

Lo que en realidad se hace es deshabilitar el que no vas a utilizar...

Al poner en ALTO el pin 10 estamos deshabilitando el Ethernet
pinMode(10, OUTPUT); // deshabilita ethernet
digitalWrite(10, HIGH ); // deshabilita ethernet

Al poner en ALTO el pin 4 estamos deshabilitando microSD
pinMode(4, OUTPUT); // deshabilita microSD
digitalWrite(4, HIGH ); // deshabilita microSD

 

A parte de esto, para que funcione el Ethernet debemos escribir
Ethernet.begin(mac, ip);
server.begin();

Para que funcione el microSD debemos escribir
SD.begin(4); // Inicializa SD card mediante el pin4

Mediante una página web podemos escribir datos en un archivo.

Para este proyecto dispongo de Arduino UNO, Shield Ethernet W5100, librería oficial Ethernet, IDE 1.0 y tarjeta de memoria microSD.

Una vez más quiero insistir que a partir de mayo de 2012 salió el IDE 1.0 del Arduino, a partir de este IDE la extensión de los archivos será .ino ( de arduino) en vez del .pde. Muchos proyectos que encontramos en Internet están realizados con IDE anteriores como el 19, 21, 22, 23, algunos de estos proyectos no funcionan con el nuevo IDE. Así que o bien adaptas el proyecto o instalas varios IDE.

Este programa lanza una página web con dos botones:
- Cuando pulsamos el botón "Incrementa" la variable x aumenta en una unidad. Y ese valor se guarda en un archivo de la microSD.
- Cuando pulsamos el botón "Decrementa" la variable x disminuye en una unidad. Y ese valor se guarda en un archivo de la microSD.

Una vez pulsado varias veces los botones, sacamos la memoria microSD del Shield de Arduino y la introducimos en un ordenador.
Obtendremos un archivo llamado test.txt con un contemido similar a este...

Incremento de x 1
Incremento de x 2
Incremento de x 3
Incremento de x 4
Decremento de x 3
Decremento de x 2

Ethernet y SDCard

// Juan Antonio Villalpando
// juana1991@yahoo.com

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

#include <SD.h> // Tarjeta microSD - Libreria ocupa 5 KB
File myFile;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,15);
EthernetServer server(80);

int x; // Variable a incrementar/decrementar
String readString = String(30); //string para obtener la direccion web

void setup()
{

// Cambio de SD a Ethernet
pinMode(4, OUTPUT);
digitalWrite(4, HIGH );
delay(100);
Ethernet.begin(mac, ip);
server.begin();

}

//
void loop()
{
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (readString.length()<30)
{
readString += c;
}
if (c=='\n')
{

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

if(readString.indexOf("cmd=A")>0){

//zzzzzzzzzzz Cambia a SD - escribe archivo - cambia a Ethernet zzzzzzzzzzzzzzzzz
delay(100);
pinMode(10, OUTPUT); // cambia de ethernet a SD
digitalWrite(10, HIGH ); // deshabilita ethernet

SD.begin(4); // Inicializa la SD card mediante el pin4
myFile = SD.open("test.txt", FILE_WRITE);

// if the file opened okay, write to it:
if (myFile) {
delay(200);
x = x + 1;
myFile.print("Incremento de x ");
myFile.println(x);
// close the file:
myFile.close();
}

// Cambio de SD a Ethernet
pinMode(4, OUTPUT);
digitalWrite(4, HIGH ); // deshabilita SD
delay(100);

}

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

if(readString.indexOf("cmd=B")>0){

//zzzzzzzzzzz Cambia a SD - escribe archivo - cambia a ethernet zzzzzzzzzzzzzzzzz
delay(100);
pinMode(10, OUTPUT); // cambia de ethernet a SD
digitalWrite(10, HIGH ); // deshabilita ethernet

SD.begin(4); // Inicializa la SD card mediante el pin4
myFile = SD.open("test.txt", FILE_WRITE);

// if the file opened okay, write to it:
if (myFile) {
delay(200);
x = x - 1;
myFile.print("Decremento de x ");
myFile.println(x);
// close the file:
myFile.close();
}

// Cambio de SD a Ethernet
pinMode(4, OUTPUT);
digitalWrite(4, HIGH ); // deshabilita SD
delay(100);

}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

readString="";
// Comienzo de pagina
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();

client.println("<html>");
client.println("<head>");
client.println("</head>");
client.println("<body>");
client.println("<h1><center><b>Arduino en Internet y memoria SD - Juan A. Villalpando</b></center></h1>");
client.println("<hr><br>");

client.println("<center><table><tr><td align=center>");

client.println("Suma<br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=A>");
client.println("<input type=submit value=\" Incrementa \"></form>");

client.println("</td><td align=center>");

client.println("Resta<br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=B>");
client.println("<input type=submit value=\" Decrementa \"></form>");
client.println("</td></tr><tr><td align=center>");

client.println("</td></tr></table></center><hr>");

client.println("</body>");
client.println("</html>");
client.flush();

client.stop();

}
}
}
}
}

 

El programa es una solución personal, que funciona. Si en el programa añadimos lineas "planas" como
client.println("<h1><center><b>Vista mi web </b></center></h1>");
el programa sigue funcionando, pero si añadimos líneas en el campo del formulario, empiezan a surgir problemas.
Todo es cuestión de experimentar.

Puedes experimentar introduciendo una línea de autorefresco...
client.println("<head><META HTTP-EQUIV=\"REFRESH\" CONTENT=\"1\"</head>");

Intentar añadir casilleros en el formulario...
client.println("<INPUT TYPE=TEXT NAME=variable>");

Pero posiblemente empezarán los problemas...

Podemos añadir un enlace externo de esta manera...

client.println("<a href=http://google.com target=\"_blank\"> Google </a>");
__________________________________

Otro sketch solo con la SDCard en el W5100. (sin la parte de Ethernet)

Ver el contenido de un archivo. Obtenido del IDE 1.0. Archivos / Ejemplos / SD / DumpFiles
Este programa no tiene nada de Ethernet, solo trata de que ya tenemos en nuestra memoria SD un archivo de texto llamado test.txt.
Y cada vez que entramos en el Serial Monitor, vemos su contenido.

 

Ver el contenido de un archivo. DumpFile. Volcado de archivo.

/*
SD card file dump

This example shows how to read a file from the SD card using the
SD library and send it over the serial port.

The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4

created 22 December 2010
by Limor Fried
modified 9 Apr 2012
by Tom Igoe

This example code is in the public domain.

*/

#include <SD.h>

// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
const int chipSelect = 4;

void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
pinMode(10, OUTPUT);

// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");

// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("test.txt");

// if the file is available, write to it:
if (dataFile) {
while (dataFile.available()) {
Serial.write(dataFile.read());
}
dataFile.close();
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
}

void loop()
{
}

Debemos tener en cuenta las librerías en los ejemplos con los que trabajamos, en unos ejemplos se utilizan la librería SD y en otros la SDFat.

Aquí comento los ejemplos que vienen en la librería SD del IDE 1.0.1 de Arduino.


IDE 1.0 + Shield Ethernet W5100 + librería SD los ejemplos...
Archivos / Ejemplos / SD (Están en la carpeta examples de libraries / SD / examples)

La información se consulta mediante el Serial Monitor, gracias a estas instrucciones:
Especie de reinicio cuando cerramos y abrimos el Serial Monitor

// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

 

- CardInfo (información y listado de archivos de la tarjeta)
- DumpFile (muestra el contenido de un archivo)
- Files (consulta si un archivo existe, lo crea y lo borra)
- listFiles (muestra un listado de los archivos de la tarjeta, ERROR: cambiar la línea if (!SD.begin(4)) {,
- Datalogger, (toma datos de las entradas analógicas 0, 1 y 2 y las guarda en un archivo luego abre el archivo y muestra los datos)
- Readwrite (escribe testing 1, 2, 3. en un archivo y luego lo muestra)

 

__________________________________

Otro proyecto con el Shield Ethernet W51000 + la tarjeta de memoria microSD

Esta página es muy conocida y trata de trabajar con Ethernet W5100 y SDcard: http://www.ladyada.net/learn/arduino/ethfiles.html

Se trata de tener varios archivos de texto en la microSD y mediante una página web ver el listado de archivos y su contenido.

Debemos tener en cuenta qué IDE estamos utilizando, si utilizamos los IDE 19, 22, 23... el código a cargar es el clásico de extensión .pde
Si estamos utilizando el IDE 1.0 el código tendrá de extensión .ino.

Bajar los códigos de los proyectos:
https://github.com/adafruit/SDWebBrowse

Bajar la librería de: http://code.google.com/p/sdfatlib/downloads/list
Una vez más debes tener en cuenta con qué IDE estás trabajando.

Una vez que grabes la librería en: libraries / SdFat
Reinicia el IDE.

En mi caso he utilizado: Arduino UNO, IDE 1.0.1, Shield Ethernet W5100 y tarjeta microSD
Librería: sdfatlib20120719.zip
En la tarjeta microSD debemos tener varios archivos .txt para las pruebas.

Este es el código: Arduino + Ethernet + SD

 

 

************************************************************************************************************************************

SDCard y ethernet ( funciona completamente)


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

#include <SD.h> // Ocupa 5 KB
File myFile;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,15);
EthernetServer server(80);
byte on_off1;
byte on_off2;
int x;
String readString = String(30);

void setup()
{

// Cambio de SD a Ethernet
pinMode(4, OUTPUT);
digitalWrite(4, HIGH );
delay(100);
Ethernet.begin(mac, ip);
server.begin();

}

//
void loop()
{
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (readString.length()<30)
{
readString += c;
}
if (c=='\n')
{

if(readString.indexOf("cmd=A")>0){

//zzzzzzzzzzz Cambia a SD - escribe archivo - cambia a ethernet zzzzzzzzzzzzzzzzz
digitalWrite(2, HIGH); // LED 2 Encendido
delay(100);
pinMode(10, OUTPUT); // cambia de ethernet a SD
digitalWrite(10, HIGH ); // apaga ethernet

SD.begin(4); // Initialize the SD card mediante su el pin4
myFile = SD.open("test5.txt", FILE_WRITE);

// if the file opened okay, write to it:
if (myFile) {
delay(200);
x = x + 1;
myFile.print("Incremento de x ");
myFile.println(x);
// close the file:
myFile.close();
}

// Cambio de SD a Ethernet
pinMode(4, OUTPUT);
digitalWrite(4, HIGH ); // apaga SD
delay(100);

}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

if(readString.indexOf("cmd=B")>0){
//zzzzzzzzzzz Cambia a SD - escribe archivo - cambia a ethernet zzzzzzzzzzzzzzzzz
digitalWrite(3, HIGH); // LED 3 Encendido
delay(100);
pinMode(10, OUTPUT); // cambia de ethernet a SD
digitalWrite(10, HIGH ); // apaga ethernet

SD.begin(4); // Initialize the SD card mediante su el pin4
myFile = SD.open("test5.txt", FILE_WRITE);

// if the file opened okay, write to it:
if (myFile) {
delay(200);
x = x - 1;
myFile.print("Decremento de x ");
myFile.println(x);
// close the file:
myFile.close();
}

// Cambio de SD a Ethernet
pinMode(4, OUTPUT);
digitalWrite(4, HIGH ); // apaga SD
delay(100);

}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

readString="";
// Comienzo de pagina

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();

client.println("<html>");
client.println("<head>");
//client.println("<head><META HTTP-EQUIV=\"REFRESH\" CONTENT=\"1\"</head>");
client.println("</head>");
client.println("<body>");
client.println("<h1><center><b>Arduino en Internet - Juan A. Villalpando</b></center></h1>");
client.println("<hr><br>");

client.println("<center><table><tr><td align=center>");
switch (on_off1) {
default:
client.println("Suma: <font color=\"#00FF00\">Incrementa</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=A>");
client.println("<input type=submit value=\" Incrementa \"></form>");
}
client.println("</td><td align=center>");

switch (on_off2) {
default:
client.println("Resta: <font color=\"#00FF00\">Decrementa</font><br>");
client.println("<form METHOD=get >");
client.println("<input type=hidden name=cmd value=B>");
client.println("<input type=submit value=\" Decrementa \"></form>");
}

client.println("</td></tr><tr><td align=center>");

client.println("</td></tr></table></center><hr>");

client.println("</body>");
client.println("</html>");

client.stop();

}
}
}
}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

http://www.elektor.nl/forum/forum/algemene-forums/microcontrollers/arduino-v1-0-met-ethershield-v1-1.2029859.lynkx
EN28J60 Ethernet Shield v1.1 library voor Arduino v1.0.

https://github.com/thiseldo/EtherShield

 

http://www.youtube.com/watch?v=r7E3uq_nMBg

 

http://www.youtube.com/watch?v=r7E3uq_nMBg

 

http://luisfuentesr.blogspot.com.es/

 

http://www.instructables.com/id/Arduino-Ethernet-Shield-Tutorial/step4/Server/

http://ww1.microchip.com/downloads/en/DeviceDoc/39662c.pdf

http://tuxgraphics.org/electronics/200606/article06061.shtml

http://www.microchip.com/forums/m585672.aspx

WIFI

http://www.elechouse.com/elechouse/index.php?main_page=product_info&cPath=90_186&products_id=2165

http://www.soliddepot.com/index.php?main_page=product_info&products_id=106

http://www.cutedigi.com/wireless/wifi/linksprite-cuhead-wifi-shield-v2-0-for-arduino.html

http://todoelectronica.com/shield-arduino-wifi-p-15406.html

buscalo: http://lmgtfy.com/?q=send+email+from+arduino#

 

Hay dos librerías una llamada EtherCard y otra ethershield: http://blog.thiseldo.co.uk/?p=623

EtherCard: https://github.com/jcw/ethercard

 

- El Robot LEGO es un juguete/recurso didáctico, que se utiliza en muchos centros escolares de enseñanza secundaria para iniciar a los alumnos en la programación informática y en la robótica. Es algo caro, viene a costar unos 340 €. Aquí he puesto un tutorial en el que indico como controlar el Robot LEGO mediante Bluetooh y Visual Basic en un ordenador. Al final también indico cómo controlarlo mediante un teléfono móvil con Android utilizando Appinventor para programarlo.

Tutorial: Visual Basic + Bluetooh + Robot LEGO + AppInventor + Android.

- El Arduino y un módulo shield Bluetooth

Tutorial: Visual Basic + Bluetooh

 

- Otro dispositivo que vale la pena conocer es el microcontrolador Arduino, es una placa con un circuito electrónico que podemos programarlo para que haga infinidad de funciones. Aquí he puesto otro tutorial en el que indico cómo controlar al Arduino conectado por USB al ordenador, mediante Visual Basic.

Tutorial: Arduino + Visual Basic 2010.

 

- Aquí sigo con el Arduino en una estación meteorológica:

Tutorial: Arduino + Estación Meteorológica.

____________________________________________

__________________________________ __________________________________
Si quieres que este tutorial se mantenga y lo actualice con más programas, escríbeme un correo a: juana1991@yahoo.com
__________________________________
__________________________________