En este tutorial mostrare como encender/apagar un led desde un servidor web, para ello configuraremos la shield ethernet y aprenderemos a crear un servidor web con conocimientos básicos en html.
Vídeo
En el siguiente vídeo se puede apreciar el servidor web y también como al presionar en los botones de la pagina se enciende y apaga el LED conectado al arduino.
Fotos del proyecto
Aquí se presentan unas fotos donde se puede ver el Arduino, sobre el se encuentran la shield Ethernet y la ProtoShield. Cuando se tomaron las fotos ya funcionaba el proyecto y se apreciar también que esta encendido y otro momento esta apagado el LED.
En la siguiente imagen se muestra el circuito sin protoshield
Objetivos
- Lograr nuestra primera conexión con la Shield Ethernet
- Aprender a configurar la Ethernet Shield
- Subir un servidor web con Ethernet Shield
- Crear un servidor web con quackit
- Lograr conocimientos básicos en html
Materiales:
- Arduino UNO/Mega y su cable USB
- Ethernet Shield
- Router ó Switch con su respectivo cable con conector RJ45
- Resistencia de 220 ohm
- LED
- Cables ó conectores
- Protoboard
- Cargador USB 5v/100mA (opcional)
1.-Conexión de hardwares
- Montar ethernet shield sobre Arduino.
- Conectar por medio del cable con conectores RJ45 el Router y la ethernet shield.
- Conectar arduino por medio de su USB a la computadora.
Con esto esta lista la conexión entre arduino, Ethenret Shield y su Router o Switch. Ahora se puede comenzar a programar
2.-Armado del circuito
El circuito es muy simple basta con conectar desde el pin 8 una resistencia de 220 ohm y en serie un led, para terminar el circuito conectando a tierra (GND).
Seguiré haciendo mas tutoriales, pero volveré en un mes aproximadamente ya que tengo que terminar trabajos y prepararme para pruebas, para así cerrar el semestre en la Universidad
2.-Armado del circuito
El circuito es muy simple basta con conectar desde el pin 8 una resistencia de 220 ohm y en serie un led, para terminar el circuito conectando a tierra (GND).
3.-Buscar una IP para el servidor web
Una vez conectado todo como se mencionó anteriormente se puede comenzar a programar, pero antes de esto necesitamos tener una IP para el servidor web que subiremos con la shield ethernet, para ello iremos a inicio y escribiremos "cdm" (sin comillas, todo lo que se mencione sera sin comillas), luego de eso en consola se escribe "ipconfig", aquí tienen que buscar su IPv4 para el "adaptador de LAN inalámbrico" en el caso que estén conectados a su router por wifi, en mi caso se puede ver que el IPv4 para el adaptador LAN inalámbrico es 192.168.1.6.
3.1.-Pasos a seguir para obtener la IP nuestra computadora y la IP para el servidor web
Primero vamos a inicio y escribimos "cmd" en el buscador que aparece en inicio
En consola escribimos "ipconfig"
Si estamos conectados por Wifi buscamos el IPv4 del adaptador de LAN inalámbrica
Una vez que tenemos nuestra IPv4 que en mi caso es 192.168.1.6 tenemos que buscar un IP para el web server que subiremos con la ethernet shield, esto lo haremos buscando una ip que este desocupada, para ello iremos nuevamente a inicio, escribiremos "cmd" y en consola escribiremos ping y escribiremos la IPv4, pero cambiaremos el ultimo numero (en mi caso es 6) por un numero entre 1 y 254
Si nos entrega un mensaje como el que se ve en la imagen de abajo (nos dice que el host de destino es inaccesible debido a que nadie esta usando la IP que estoy probando)
Ahora que tenemos una IP que esta desocupada (192.168.1.7 que solo sirve para mi caso, ustedes tendrán que buscar la suya) podemos comenzar a programar y crear el servidor web.
4.-Programación Arduino - Ethernet Shield
Aquí lo probé desde mi computadora
4.-Programación Arduino - Ethernet Shield
El código que utilice para este proyecto es el siguiente:
4.1.- Probar el servidor web#include <SPI.h> //Aqui incluimos la libreria SPI #include <Ethernet.h> //Aqui incluimos la libreria Ethernet byte mac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED}; //Declaracion de la direccion MAC IPAddress ip(192,168,1,7); //Declaracion de la IP EthernetServer servidor(80); //Declaracion del puerto 80 int PIN_LED=8; //Aqui establecemos la variable PIN_LED como un valor entero String readString=String(30); //lee los caracteres de una secuencia en una cadena. //Los strings se representan como arrays de caracteres (tipo char) String state=String(3); void setup() { Ethernet.begin(mac, ip); //Inicializamos con las direcciones asignadas servidor.begin(); //inicia el servidor pinMode(PIN_LED,OUTPUT); digitalWrite(PIN_LED,LOW); state="OFF"; } void loop() { //EthernetClient Crea un cliente que se puede conectar a //una dirección específica de Internet IP EthernetClient cliente= servidor.available(); if(cliente) { boolean lineaenblanco=true; while(cliente.connected()) { if(cliente.available()) { char c=cliente.read(); if(readString.length()<30) { readString.concat(c); //Cliente conectado //Leemos petición HTTP caracter a caracter //Almacenar los caracteres en la variable readString } if(c=='\n' && lineaenblanco) //Si la petición HTTP ha finalizado { int LED = readString.indexOf("LED="); if(readString.substring(LED,LED+5)=="LED=T") { digitalWrite(PIN_LED,HIGH); state="ON"; } else if (readString.substring(LED,LED+5)=="LED=F") { digitalWrite(PIN_LED,LOW); state="OFF"; } //Cabecera HTTP estándar cliente.println("HTTP/1.1 200 OK"); cliente.println("Content-Type: text/html"); cliente.println(); //Página Web en HTML cliente.println("<html>"); cliente.println("<head>"); cliente.println("<title>LED ON/OFF</title>"); cliente.println("</head>"); cliente.println("<body width=100% height=100%>"); cliente.println("<center>"); cliente.println("<h1>LED ON/OFF</h1>"); cliente.print("<br><br>"); cliente.print("Estado del LED: "); cliente.print(state); cliente.print("<br><br><br><br>"); cliente.println("<input type=submit value=ON style=width:200px;height:75px onClick=location.href='./?LED=T\'>"); cliente.println("<input type=submit value=OFF style=width:200px;height:75px onClick=location.href='./?LED=F\'>"); cliente.println("</center>"); cliente.println("</body>"); cliente.println("</html>"); cliente.stop(); //Cierro conexión con el cliente readString=""; } } } } }
Para probar el servidor web lo único que debemos hacer es ir a nuestro navegador favorito e ingresar la IP del servidor web que creamos en la barra de navegación.
Aquí lo probé desde mi computadora
También lo probé desde mi celular (Sony C3) desde el navegador Chrome
Nota: No me cargaba el servidor web al ingresar en la IP en el buscador de iphone (safari) lo que hice para solucionar el problema fue ingresar la siguiente dirección 192.168.1.7/?LED=F (también pueden probar con la T de TRUE en vez de una F).
5.- Creación del servidor web mediante Quackit
5.- Creación del servidor web mediante Quackit
Como se vio la etapa anterior ya habíamos creado el servidor web pero ahora mostrare como se hace un servidor web para que luego se pueda poner en el sketch (programa que hicimos) en Arduino IDE.
5.1.- Nociones básicas de HTML
5.2.- Código HTML de nuestro servidor web
En la imagen se muestra el código html del servidor web
En esta otra imagen se muestra el mismo código con comentarios para que quienes no saben programar en html lo entiendan
5.1.- Nociones básicas de HTML
Es importante entender estas cosas si quieres entender como se crea la pagina web
- Un documento html siempre comienza con <html> y termina con </html>
- <head>Aquí va la cabecera de la pagina</head>
- <title>Aqui va el titulo de la pagina (el titulo de la pestaña)</title>
- <body>siempre despues del head va el body (cuerpo de la pagina)</body>
- height="100%" widht="100%" son dos características que se le asignaron a body, usar el 100% de la altura y anchura de la pagina
- <center>se centra todo el texto que este dentro de este enunciado</center>
- </br>genera un espacio de una linea
- <input (características)/> se añade "algo" puede ser botón, caja, imagen, contraseña, etc depende de su característica type="(aquí va ese algo)"
- (característica) onclick="location.href"="./?LED=T", redirección IP/?LED=T
en mi caso redirecciona al siguiente enlace 192.168.1.7/?LED=T - (característica) name="led on", nombre: led on
- (característica) type="button", tipo: botón
- (característica) value="ON", tiene valor ON
En la imagen se muestra el código html del servidor web
6.- Forma alternativa de conectar el Arduino una vez programado
Una vez programado Arduino podemos alimentarlo por medio de un cargador de celular siempre y cuando suministre suficiente corriente y sea de 5V. Como se puede ver la imagen el arduino se alimenta por medio de su cable USB que se encuentra conectado al cargador USB de mi celular (Output 5V 1000mA) que esta conectado a la corriente alterna.
Nota: Es normal que la shield se caliente, se calentara conectado a la computadora o ya sea al cargador USB, como se puede ver en la ethernet shield hay un disipador ( esta pieza de metal sirve para irradiar el calor hacia el medio ambiente) y en esa zona se suele calentar, no hay por que preocuparse.
Seguiré haciendo mas tutoriales, pero volveré en un mes aproximadamente ya que tengo que terminar trabajos y prepararme para pruebas, para así cerrar el semestre en la Universidad
Muchas gracias por visitar mi blog y si tienen alguna consulta o consejo puede realizarlo por medio de este mismo blog o por medio de mi correo electrónico sebastian.latorre.cl@ieee.org
Hola disculpa mi atrevimiento tengo pocos conocimientos de programación de
ResponderBorrararduino,me gustaria que me pudieras ayudar.Tengo un ordenador que me está enviando
esta cadena 2a:2d:34:23 es lo que puedo ver a través de Wireshark ,lo recibo por UDP
en red local y me gustaria poder activar algún pin de arduino ejemplo 22 ard mega.com
escudo.correojav@yahoo.es
Hola, la verdad es que desconozco de lo que me preguntas, quizás podrías trabajar con processing o recibir los datos de manera serial y de ese modo seria mas facil trabajar con esos datos que recibes por la red local, pero hasta el momento no he trabajado con algo similar como para poder ayudarte.
BorrarEstaré investigando para poder ayudarte. Saludos
TALVEZ LO QUE ESTAS VIENDO ES LA DIRECCION MAC DEL EQUIPO Y NO LA DIRECCION IP DE ESTE.
BorrarHola, quisiera saber como se haría un programa usando Arduino UNO y ethernet shield y prender un led con un botón físico conectado a arduino UNO?
ResponderBorrarSaludos
Tenes que modificar el programa leyendo un entrada predefinida que te simule un boton en la placa de arduino, que cuando es presionado haga lo mismo que si la orden viniese del navegador.
Borrarhola amigo, me gustaria hacerte una pregunta, tengo el programa que esta aqui en el blog, tambien hice una aplicacion en android para poder prender y apagar las luces desde la aplicacion, y esta sincronizada con la de la pagina que esta montada en arduino, esto funciona muy bien en mi red local, pero lo que quiero es hacer que funcione de manera remota desde otra red, como no tengo un dominio loque hice es utilizar ngrok, la cual es una herramienta que permite acceder a nuestro servidor locar desde internet, lo cual funciona perfectamente para cualquier pagina que este en un servidor como porejemplo xamp o wamp, pero para la pagina que esta montada en el servidor de arduino no funciona, mi pregunta es puedo crear la pagina web que esta montada en arduino y ponerla en el servidor ya sea xamp o wamp, y como le haria para ligarla con arduino, de antemano muchas gracias
ResponderBorrarHola, gracias por tu aporte. Una consulta, tengo todo conectado y funcionando, me responde del navegador y desde un celular conectado al wifi. El problema es que cuando conecto mi arduino a un cargador desconectando la notebook, la pagina deja de responder. Alguna sugerencia??? Desde ya, muchas gracias.
ResponderBorrarHola, disculpa pero cuando escribo en código html que está en la página y lo pruebo no me salen los botones para seleccionar el encendido y apagado de los led. Lo revise muchas veces y está igual que el tuyo no se cual puede ser el error. Ayuda
ResponderBorrarbuenas tardes, mi nombre es miuel angel (colombia), tengo una solicitud; en esta linea de codigo << if(readString.substring(LED,LED+5)=="LED=T" >> aparece "LED+5" ESE INCREMENTO DE 5 QUÉ SIGNIFICA? / QUÉ RELEVANCIA TIENE DENTRO DEL CODIGO?
ResponderBorrarAGRADEZCO SU TIEMPO, MIL GRACIAS!
Mm tengo una pregunta quisiera saber si este programa es solo para una red local o también para wan. Ya que para acceder desde cualquier parte desde el celular se necesita un dominio
ResponderBorrarme pide usuario y contraseña cuando quiero ejecutar el proyecto
ResponderBorrarMe sale este error Ayuda por favor
ResponderBorrarIn file included from C:\Program Files (x86)\Arduino\libraries\Ethernet\src\Dns.cpp:8:0:
C:\Program Files (x86)\Arduino\libraries\Ethernet\src\Dns.cpp: In member function 'uint16_t DNSClient::BuildRequest(const char*)':
C:\Program Files (x86)\Arduino\libraries\Ethernet\src\utility/w5100.h:457:25: warning: result of '(256 << 8)' requires 18 bits to represent, but 'int' only has 16 bits [-Wshift-overflow=]
#define htons(x) ( (((x)<<8)&0xFF00) | (((x)>>8)&0xFF) )
~~~^~~
C:\Program Files (x86)\Arduino\libraries\Ethernet\src\Dns.cpp:164:18: note: in expansion of macro 'htons'
twoByteBuffer = htons(QUERY_FLAG | OPCODE_STANDARD_QUERY | RECURSION_DESIRED_FLAG);
Hola buen dia. Como puedo hacer para que un led se apague automaticamente cuando pierda comunicacion a un ip en especifico (Ping) y cuando establesca conexion a esa ip encienda el led nuevamente. AYUDENMEEEEEE
ResponderBorrar