Arduino Ethernet Shield + LED RGB Control Web

Controlar LED RGB desde una pagina Web usando Arduino Ethernet shield.

 Materiales: Placa Arduino Placa Arduino Ethernet Shield LED RGB 3 resistencias de 220 ohm Conexión de clable trenzado cat 5E , uso de red LAN Software arduino BreadBoard. Cableado necesario a la breadBoard

 DESARROLLO
Lo que se hará es controlar un LED RGB desde pagina Web, donde se prende cada uno de sus colores y manejar su intensidad, haciendo uso de una red LAN, por lo que utilizaremos el Arduino Ethernet Shield como servidor web. Para este laboratorio debemos entonces crear la red LAN, en donde al Arduino Ethernet Shield le asignaremos la ip 192.168.1.6 y al cliente la dirección ip 192.168.1.4 . Se hará uso de un router, por lo que el cliente estará conectado vía WIFI y el arduino Ethernet Shield con cable trenzado cat 5E, cabe aclarar que para la compilación del códigoy su carga al arduino, se conectara por USB con el mismo host del cliente. Para empezar, haremos el montaje de nuestro sistema.

Seguidamente haremos el código necesario, el cual al terminar cargaremos al montaje Arduino. Lo primero que haremos es el código HTML donde se colocaran un formulario con 3 botones: uno para rojo , otro para verde y otro para azul; mas dos botones: uno para subir la intensidad y otro para bajar la intensidad. Ek código HTML lo montaremos en el webServer Arduino Ethernet Shield;
para esto en el código del programa usaremos una constante de tipo char [ ] la
cual llamaremos html;
const char html[] = " anexar codigo HTML aqui ";

Debemos importar las librerías necesarias.
//librerias

#include  SPI.h
#include  Ethernet.h

Seguidamente debemos darle una dirección mac y una dirección ip al arduino Ethernet Shield, según nuestro esquema de red LAN, mas una variable de tipo
Server que le entregaremos el puerto a usar.
//mac, IP
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1,6 };
Server server(80);
Luego las variables necesarias
//pines out LED
int Red = 6;
int Green = 5;
int Blue = 3;
//para activar los colores del LED
boolean flatRed = false;
boolean flatGreen = false;
boolean flatBlue = false;
//para controlar la intesidad de luz
int steep=15;//paso de intensidad de color en los LEDs
int depth=120;//intensidad inicial
boolean reading = false;

Se declaran los pines de salida pwm , según nuestro montaje del sistema : rojo el 6, verde el 5 y azul el 3; luego unas variables de tipo boolean que nos darán paso al uso de activar que pin de salida activar en las terminales del LED RGB, otras dos variables mas para controlar el paso para subir o bajar la intensidad de luz del LED y una para el valor de la intensidad , donde el LED recibe valores entre 0 y 255 , por ultimo una variable de tipo boolean para la lectura de petición del cliente.
Sobre el método setup() iniciamos la conexión del webServer y activamos los pines pwm 6,5 y 3 como salida , conectados a las terminales del LED RGB , en su respectivo color.
void setup(){
Serial.begin(9600);
//iniciar conexion
Ethernet.begin(mac, ip);
server.begin();
//activar pines
pinMode(Red,OUTPUT);
pinMode(Green,OUTPUT);
pinMode(Blue,OUTPUT);
}


Continuando, sobre el método loop() colocaremos todo el código pesado para nuestro webserver Arduino Shield. Lo primero dentro este método es colocar una variable de tipo Client para la escucha de conexión del cliente .
Client client = server.available();
Luego dentro de una condición, de que si el cliente se encuentra < if (client) > , colocaremos lo siguiente :
Primero un par de variables boolean que nos permitirán recibir la petición del cliente
// una peticion http termina con una linea en blanco
boolean currentLineIsBlank = true;
boolean sentHeader = false;
Luego montaremos nuestro html al servidor
server.print(html);

Ahora haremos un ciclo en donde el webServer trabajara mientras el cliente manifieste una conexión .
En este ciclo colocaremos unas condiciones que nos dirán si el cliente está enviando petición o sino , crearemos una variable de tipo chart que recibirá los datos; hay que tener en cuenta que los datos vienen si se inicia con ‘ ? ’ lo llamado “ URL enconded” donde los datos viene en la URL , así que para eso debemos crear una condición y asi poder obtener los datos , y estos datos usarlos como valores para el uso o el control del LED RGB; cada condición en donde manipule el valor de la variable char se debe terminar con un break debido al método GET html o que envía los datos como parte de la URL. Por
último, y ya fuera del ciclo y dentro de la condición de que si esta el cliente , usaremos el método delay() para darle tiempo de respuesta al navegador y stop() para parar la conexión.



if (client) {
// una peticion http termina con una linea en blanco
boolean currentLineIsBlank = true;
boolean sentHeader = false;
server.print(html);//puesta HTML en servidor
while (client.connected()) {
if (client.available()) {
if(!sentHeader){
sentHeader = true;
}
char c = client.read();
if(reading && c == ' ') reading = false;
if(c == '?') reading = true; //encuentra ? donde inicia la informacion
if(reading){
Serial.print(c);//imprime lo que recibe del cliente
//control del LED
if(c == '3'){
flatRed = false; analogWrite(Red , LOW); //lo desactiva y lo apaga
flatGreen = false; analogWrite(Green , LOW);
flatBlue = true; //activa el color del LED
break;
}
if(c == '5'){
flatRed = false; analogWrite(Red , LOW);
flatGreen = true;
flatBlue = false; analogWrite(Blue , LOW);
break;
}
if(c == '6'){
flatRed = true;
flatGreen = false; analogWrite(Green , LOW);
flatBlue = false; analogWrite(Blue , LOW);
break;
}
//para intensificar botones 1 sube, 2 baja
if(c == '1'){
if(depth == 255) depth=255;
else depth = depth+steep;
break;
}
if(c == '2'){
if(depth == 0) depth=0;
else depth = depth-steep;
break;
}
}
if (c == '\n' && currentLineIsBlank) break;
if (c == '\n') {
currentLineIsBlank = true;
}else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1); // give the web browser time to receive the data
client.stop(); // close the connection:
}

Por último dentro del método loop() colocaremos el código que escribirá en las salidas de los pines , a cada terminal del LED RGB; usaremos una condición en donde un valor booleano nos dirá si escribir o no , debido a que el cliente dirá por medio de que botón pulsado , que color prender; esto es importante porque si se colocan el código o se escribe en los pines pwm al momento de la obtener los valores de la petición del cliente , puede pasar que dejemos un color prendido en el LED RGB , mas la idea es uno por uno.
if (flatRed == true) analogWrite(Red , depth);
if (flatGreen == true) analogWrite(Green,depth);
if (flatBlue == true) analogWrite(Blue ,depth);

Miremos entonces el código completo:

//librerias

#include  SPI.h
#include  Ethernet.h

//mac, IP
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1,6 };
Server server(80);//ethernet server port 80
//pines out LED
int Red = 6;
int Green = 5;
int Blue = 3;
//para activar los colores del LED
boolean flatRed = false;
boolean flatGreen = false;
boolean flatBlue = false;
//para controlar la intesidad de luz
int steep=15;//paso de intensidad de color en los LEDs
int depth=120;//intensidad inicial
boolean reading = false;

//HTML creacion de formulario
const char html[] =

void setup(){
Serial.begin(9600);
//iniciar conexion
Ethernet.begin(mac, ip);
server.begin();
//activar pines
pinMode(Red,OUTPUT);
pinMode(Green,OUTPUT);
pinMode(Blue,OUTPUT);
}
void loop()
{
// Escuchar a los clientes que entran
Client client = server.available();
if (client) {
// una peticion http termina con una linea en blanco
boolean currentLineIsBlank = true;
boolean sentHeader = false;
server.print(html);//puesta HTML en servidor
while (client.connected()) {
if (client.available()) {
if(!sentHeader){
sentHeader = true;
}
char c = client.read();
if(reading && c == ' ') reading = false;
if(c == '?') reading = true; //encuentra ? donde inicia la informacion
if(reading){
Serial.print(c);//imprime lo que recibe del cliente
//control del LED
if(c == '3'){
flatRed = false; analogWrite(Red , LOW); //lo desactiva y lo apaga
flatGreen = false; analogWrite(Green , LOW);
flatBlue = true; //activa el color del LED
break;
}
if(c == '5'){
flatRed = false; analogWrite(Red , LOW);
flatGreen = true;
flatBlue = false; analogWrite(Blue , LOW);
break;
}
if(c == '6'){
flatRed = true;
flatGreen = false; analogWrite(Green , LOW);
flatBlue = false; analogWrite(Blue , LOW);
break;
}
//para intensificar botones 1 sube, 2 baja
if(c == '1'){
if(depth == 255) depth=255;
else depth = depth+steep;
break;
}
if(c == '2'){
if(depth == 0) depth=0;
else depth = depth-steep;
break;
}
}
if (c == '\n' && currentLineIsBlank) break;
if (c == '\n') {
currentLineIsBlank = true;
}else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1); // give the web browser time to receive the data
client.stop(); // close the connection:
}
if (flatRed == true) analogWrite(Red , depth);
if (flatGreen == true) analogWrite(Green,depth);
if (flatBlue == true) analogWrite(Blue ,depth);
}
Luego compilamos y cargamos el código al Arduino por medio de un cable USB o Serial según el modelo. Conectaremos el Arduino Ethernet Shield a la red LAN para hacer la pruebas. Abrimos el navegador y accedemos al webServer Arduino Etherne Shield : En mi caso es  http://192.168.1.6



Abrimos la ventana de sucesos en el puerto Serial para verifica que envía el cliente al servidor al momento de usar un botón.Al dar clic en el botón rojo vemos el envió es ?6GET , donde el 6 es el pin pwm 6 asignado al terminal rojo del LED RGB, por lo tanto el color rojo del LED alumbra. Ahora démosle intensidad: (botones de subir y bajar )  ?1GET , donde 1 es que sube y ?2GET donde 2 baja intensidad del color.


Listo . Gracias por la atención prestada.



visite :
Librerias
http://arduino.cc/es/Reference/Ethernet

Marin, Diego Fernando. Universidad Santiago de Cali.
http://colombiadigital.net/b2e/blogs/index.php?blog=32











Comentarios

LeoArd ha dicho que…
Este comentario ha sido eliminado por un administrador del blog.
Jorge ha dicho que…
Este comentario ha sido eliminado por el autor.
Jorge ha dicho que…
Este comentario ha sido eliminado por el autor.
LeoArd ha dicho que…
Este comentario ha sido eliminado por un administrador del blog.
Unknown ha dicho que…
y en mi caso de que yo lo quiero hacer con la el modulo de arduino wifi shield sd como le haria para montarlo y que me funcione con una red WPA
OoOsSCkkAaRriInN ha dicho que…
Hola que tal, estaba testeando tu programa y el HTML tiene unos errores de sintaxis, aun asi buenisimo aporte
Unknown ha dicho que…
HOLA QUE TAL QUIERO SIMULAR PERO EL PROCESING SALE CON ERROR
Jorge ha dicho que…
Hola , te refieres a processing ? dime algo mas especifico del error , puede ser instalación , sintaxis , otras .

Entradas populares