Fallo en código intentando encender 8 leds a través de Internet..

Hola,mi primer post aquí :slight_smile: Novatillo pero con muchas ganas jejeje

Bueno, pues debido a un mini proyecto que tengo en mente, he decidido modificar un código que me encontré en una web por casualidad. El post original es este:

Se trata de encender un led con un relé a través de navegador, pero yo necesito encender todos los pines desde el 2 hasta el 9.

He modificado el código pero no funciona (IDE lo reconoce sin fallos pero a la hora de ejecutarlo, en pantalla salen unas lineas del código html).

A ver si alguien me puede echar una mano (Os he subido el texto porque me daba error)

Llevo unos dias haciendo pruebas y no hay manera.......Mi proyecto va de controlar cualquier cosa que tengamos en casa mediante movil, portatil o lo que sea que esté FUERA DE LA RED DONDE SE ENCUENTRE ARDUINO, haciendo una web si es necesario (La web me dá lo mismo, porque son garbanzos contados,ya que no tiene que ser una página para que la vea el mismisimo rey de españa, sino mi profe y los capullos que tengo al lado xD)

Para ello voy a crear una habitación y meteré alarmas de acceso y de incendio, ducha, luces, persiana y aire acondicionado, a ver como queda...

Otra cosa que tengo en mente es acceder a esa página de control de leds con contraseña (Tengo algo preparado pero no funciona...)

Salu2 :slight_smile:

Puff que éxito..
Nadie..??

Saludos
(Añado que el código funciona ok con 4 leds, pero a la que le configuro un 5º led, deja de funcionar la mini-web..)

Sin haber llegado a examinar el código, pero vamos, entiendo que el añadir nuevos led no trae ninguna diferencia significativa al programa, así que lo más seguro es que se trate de problema de hardware. A ver si estás "pisando" alguno de los pines de la ethernet. En todo caso convendría que muestres tu montaje y el arduino que usas.
Podría ser también problema de memoria. En tal caso creo que tu programa se puede optimizar mucho más, dado que estás repitiendo ocho veces el mismo código con unas pocas variaciones (en evitar eso consiste la programación).
Saludos.

Hola noter, gracias por responder..

Memoria no es porque no llega a 16mil bytes.....He leido en muchos sitios que el escudo usa los pines 10,11,12 y 13, y el 0 y 1 no los uso, sólo del 2 al 9 uso para el proyecto..Lo que es curioso, es que con otro código de otro blog me pasa lo mismo, con 4 leds (Dá igual el pin/led que use) funciona pero a la que le meto un 5º,peta (O salen los botones y no hacen nada o sale un error tipo fallo html, con lineas en pantalla del código)

Un usuario de un blog me ha dicho que el sketch funciona, y para que veas que lo he intentado todo, hasta he formateado el pc por si habia algo, pero me hace lo mismo....Con tablet, smartphone, portatil, sobremesa..Dá igual lo que use...Siempre peta...

He probado metiéndole una microSD y mismo problema..

Saludos

Si descartamos problema de memoria y de "pisamiento" de puertos, te reitero que lo más probable es que sea problema de montaje. Ahí poco puedo aportar, pero a buen seguro que alguien te ayudará si expones tu montaje (cómo y cuánto estás alimentando y cómo acoplas los led y los botones). Podría ser por ejemplo que estés exigiendo demasiada corriente a tu arduino.

noter:
Podría ser por ejemplo que estés exigiendo demasiada corriente a tu arduino.

Hola noter :slight_smile: Calla calla, que ayer por la tarde me dió por preguntarme las tensiones e intensidades máximas del arduino y sus pines digitales y me llevé un chasco.....

Busqué en el foro y encontré este post:

Voltage and max current of digital output?:
http://forum.arduino.cc/index.php?topic=121675.0

Y de ese post, salté a este blog (De un user que participa en ese post):

Arduino Power, Current, and Voltage Limitations:

La verdad es que flipé con la información que pone el chaval en el articulo..MUY bien explicado....Y creo que puedo afirmar que mi problema es ese, que le estoy pidiendo mucho al arduino (Mi montaje es sencillo,8 leds 5mm con una resistencia de 240 ohmios a negativo y positivo al pin digital X)

Voy a hacer una prueba poniendo resistencias mas grandes (Me dá igual si el brillo es tenue) y poniendo el estado original de los pines en LOW....Si no funciona, me voy a por una Mega el martes (Un usuario del blog que cité en el primer post me ha dicho que ese código funciona ok en su Mega..)

Te digo algo con lo que sea, noter :slight_smile:

Un saludo :slight_smile:

Hola Carlos,
yo estuve dandole caña al tema pero con Relés, el único problema es que pesa mucho el programa...
Con 5 relés me funciona perfectamente.
A mí me ha dicho Noter que tengo que aprender a simplificarlo con Arrais etc...

Echale un ojo :wink:

/*
Arduino Ethernet Shield
Control Remoto de Reles v1.0
*/

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

//Declaración de la direcciones MAC e IP. También del puerto 80
byte mac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED}; //MAC
IPAddress ip(10,10,10,100); //IP
EthernetServer servidor(80);

int PIN_LED1=5;
String readString1=String(30);
String state1=String(3);
int PIN_LED2=6;
String state2=String(3);
int PIN_LED3=7;
String state3=String(3);
int PIN_LED4=8;
String state4=String(3);
int PIN_LED5=9;
String state5=String(3);
int PIN_LED6=11;
String state6=String(3);
int PIN_LED7=12;
String state7=String(3);
int PIN_LED8=13;
String state8=String(3);

void setup()
{
Ethernet.begin(mac, ip); //Inicializamos con las direcciones asignadas
servidor.begin();

pinMode(PIN_LED1,OUTPUT);
digitalWrite(PIN_LED1,LOW);
state1="OFF";
digitalWrite(PIN_LED2,LOW);
pinMode(PIN_LED2,OUTPUT);
state2="OFF";
pinMode(PIN_LED3,OUTPUT);
digitalWrite(PIN_LED3,LOW);
state3="OFF";
pinMode(PIN_LED4,OUTPUT);
digitalWrite(PIN_LED4,LOW);
state4="OFF";
pinMode(PIN_LED5,OUTPUT);
digitalWrite(PIN_LED5,LOW);
state5="OFF";
pinMode(PIN_LED6,OUTPUT);
digitalWrite(PIN_LED6,LOW);
state6="OFF";
pinMode(PIN_LED7,OUTPUT);
digitalWrite(PIN_LED7,LOW);
state7="OFF";
pinMode(PIN_LED8,OUTPUT);
digitalWrite(PIN_LED8,LOW);
state8="OFF";
}

void loop()
{
EthernetClient cliente= servidor.available();

if(cliente)
{
boolean lineaenblanco=true;
while(cliente.connected())//Cliente conectado
{
if(cliente.available())
{
char c=cliente.read();
if(readString1.length()<30)//Leemos petición HTTP caracter a caracter
{
readString1.concat(c); //Almacenar los caracteres en la variable readString

}
if(c=='\n' && lineaenblanco)//Si la petición HTTP ha finalizado
{
int LED1 = readString1.indexOf("LED1=");
int LED2 = readString1.indexOf("LED2=");
int LED3 = readString1.indexOf("LED3=");
int LED4 = readString1.indexOf("LED4=");
int LED5 = readString1.indexOf("LED5=");
int LED6 = readString1.indexOf("LED6=");
int LED7 = readString1.indexOf("LED7=");
int LED8 = readString1.indexOf("LED8=");

if(readString1.substring(LED1,LED1+6)=="LED1=T")
{
digitalWrite(PIN_LED1,HIGH);
state1="ON";
} else if (readString1.substring(LED1,LED1+6)=="LED1=F")
{
digitalWrite(PIN_LED1,LOW);
state1="OFF";
}
if(readString1.substring(LED2,LED2+6)=="LED2=T")
{
digitalWrite(PIN_LED2,HIGH);
state2="ON";
} else if (readString1.substring(LED2,LED2+6)=="LED2=F")
{
digitalWrite(PIN_LED2,LOW);
state2="OFF";
}
if(readString1.substring(LED3,LED3+6)=="LED3=T")
{
digitalWrite(PIN_LED3,HIGH);
state3="ON";
} else if (readString1.substring(LED3,LED3+6)=="LED3=F")
{
digitalWrite(PIN_LED3,LOW);
state3="OFF";
}

if(readString1.substring(LED4,LED4+6)=="LED4=T")
{
digitalWrite(PIN_LED4,HIGH);
state4="ON";
} else if (readString1.substring(LED4,LED4+6)=="LED4=F")
{
digitalWrite(PIN_LED4,LOW);
state4="OFF";
}
if(readString1.substring(LED5,LED5+6)=="LED5=T")
{
digitalWrite(PIN_LED5,HIGH);
state5="ON";
} else if (readString1.substring(LED5,LED5+6)=="LED5=F")
{
digitalWrite(PIN_LED5,LOW);
state5="OFF";
}
if(readString1.substring(LED6,LED6+6)=="LED6=T")
{
digitalWrite(PIN_LED6,HIGH);
state6="ON";
} else if (readString1.substring(LED6,LED6+6)=="LED6=F")
{
digitalWrite(PIN_LED6,LOW);
state6="OFF";
}

if(readString1.substring(LED7,LED7+6)=="LED7=T")
{
digitalWrite(PIN_LED7,HIGH);
state7="ON";
} else if (readString1.substring(LED7,LED7+6)=="LED7=F")
{
digitalWrite(PIN_LED7,LOW);
state7="OFF";
}

if(readString1.substring(LED8,LED8+6)=="LED8=T")
{
digitalWrite(PIN_LED8,HIGH);
state8="ON";
} else if (readString1.substring(LED8,LED8+6)=="LED8=F")
{
digitalWrite(PIN_LED8,LOW);
state8="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("");
cliente.println("");
cliente.println("CRR v1.0");
cliente.println("

Control Remoto de Reles v1.0</font color>

");
cliente.print("");
cliente.println("");
cliente.println("

RELE 1

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED1=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED1=F'>");
cliente.print("Estado: ");
cliente.print(state1);
cliente.println("

RELE 2

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED2=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED2=F'>");
cliente.print("Estado: ");
cliente.print(state2);
cliente.println("

RELE 3

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED3=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED3=F'>");
cliente.print("Estado: ");
cliente.print(state3);
cliente.println("

RELE 4

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED4=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED4=F'>");
cliente.print("Estado: ");
cliente.print(state4);
cliente.println("

RELE 5

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED5=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED5=F'>");
cliente.print("Estado: ");
cliente.print(state5);
cliente.println("

RELE 6

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED6=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED6=F'>");
cliente.print("Estado: ");
cliente.print(state6);
cliente.println("

RELE 7

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED7=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED7=F'>");
cliente.print("Estado: ");
cliente.print(state7);
cliente.println("

RELE 8

");
cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED8=T'>");
cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED8=F'>");
cliente.print("Estado: ");
cliente.print(state8);
cliente.println("");
cliente.println("");
cliente.stop();//Cierro conexión con el cliente
readString1="";
}
}
}
}
}

macallan:
Hola Carlos,
yo estuve dandole caña al tema pero con Relés, el único problema es que pesa mucho el programa...
Con 5 relés me funciona perfectamente.
A mí me ha dicho Noter que tengo que aprender a simplificarlo con Arrais etc...

Hola macallan :slight_smile: El código es igual al que modifiqué (Varian un par de cosillas) y no me va a funcionar, porque como ya dije, a la que pongo un 5º led, se va al carajo y no funciona nada..

Sé que el código pesa, pero, he hecho historias con mas peso y han funcionado, por eso no lo entiendo..

macallan:
Echale un ojo :wink:

int PIN_LED6=11;
int PIN_LED7=12;
int PIN_LED8=13;

Con el ethernet shield no puedes usar esos pines..A ver si sólo te han funcionado 5 por este motivo...(He leido, y ya lo puse arriba, que el escudo se vé que usa los pines 10,11,12 y 13..No lo he mirado mucho, pero imagino que por esos 4 pines van los dos de rx y los dos de tx)

Ayer estuve todo el santo dia liado con arduino, haciendo experimentos, y por casualidad tenia un receptor de infrarojos. Pillé todos los pines digitales desde el 2 al 13 (12 leds), configuré un mando de casa de un dvd para que me lo fuera leyendo el arduino, y funcionaron todos los leds..8500 bytes frente a 18000 del código html....Lo parió !!

He pensando dividir el proyecto:

-Controlar 4 cosas a través de Internet (Escudo ethernet)
-Controlar 4 cosas a través del mando a distancia (Sensor IR)
-Controlar 4 cosas a través de bluetooth/android (HC05/06+appinventor)

Pero hablé con un compi de clase el sábado y me dijo que el colega(Profe) no me iba a dejar hacerlo, así que si no me pillo la mega, casco xDDD (Lo malo de pillar la mega en spain es que son 40 euracos frente a los 10 que vale la china, y lo malo de esto es 1 MES DE ESPERA, así que estoy atrapao ¬¬)

No sé como lo voy a resolver macallan,pero pinta negro xD A ver el tema de las arrays (A mi tambien me ha dicho noter que hay que simplificarlo...Habrá que bucear sin que nos muerda una piraña en las pelotas xDDDD)

Gracias por responder :slight_smile:

Saludos

Hola Carlos,
la verdad es que no había pensado en los pines 10,11,12 y 13 que los utiliza el ethernet shield, pero al no dejarme subir el programa por pesar tanto, no me he visto con este problema.
De todas formas... Llevo varios dias con Arduino y no tengo ni... Estoy leyendo mucho y comparando y así saco el programa.

Saludos y suerte

Hola, interesante el proyecto, en todo caso una cosa, no es lo mismo la "memoria" donde se almacena el sketch, que la memoria del arduino propiamente dicho, de hecho esta es mucho mas pequeña, en torno a los 2kb si no recuerdo mal. Por mi experiencia con la ethernet ENC tiene problemas de buffer de memoria, y en otra idea que estamos desarrollando (envio de xml a openhab) hemos encontrado problemas parecidos al intentar mantener todo activo.

No te puedo ayudar mucho con tu codigo, pero si te puedo decir que con Souliss puedes hacer eso y mucho mas, y ya esta desarrollada la app, el sketch para arduino y solo es cuestion de "configurarlo" a tu gusto en unos pequeños pasos.
Sin que sirva para menospreciar tu trabajo te recomiendo que le heches un vistazo.

http://forum.arduino.cc/index.php?topic=223723.0

Para el tema de la alimentacion no es necesario pedirle al Arduino que alimente todos los reles, la mayoria de modulos traen una toma especifica para meterle 5v externos a los reles, y evitar asi la limitacion de intensidad que tiene Arduino.

Del codigo que he visto, efectivamente falta optimizarlo mucho con arrays y evitar el uso de Strings para el ON OFF por ejemplo, esto seria una variable boolean 0 1 que luego el codigo "convierte" a ON OFF en el momento de enviar la linea al Cliente.

Salu2 y buen Karma, espero haber sido de ayuda.

macallan:
Hola Carlos,
la verdad es que no había pensado en los pines 10,11,12 y 13 que los utiliza el ethernet shield, pero al no dejarme subir el programa por pesar tanto, no me he visto con este problema.
De todas formas... Llevo varios dias con Arduino y no tengo ni... Estoy leyendo mucho y comparando y así saco el programa.

Saludos y suerte

Pues pruébalo a ver que tal....Yo estoy igual que tu....Aprendiendo a saco con los códigos que me encuentro y leyendo manuales y sacando info de la propia web de arduino...A ver como escapamos xD

juanpintom:
Hola, interesante el proyecto, en todo caso una cosa, no es lo mismo la "memoria" donde se almacena el sketch, que la memoria del arduino propiamente dicho, de hecho esta es mucho mas pequeña, en torno a los 2kb si no recuerdo mal. Por mi experiencia con la ethernet ENC tiene problemas de buffer de memoria, y en otra idea que estamos desarrollando (envio de xml a openhab) hemos encontrado problemas parecidos al intentar mantener todo activo.

No te puedo ayudar mucho con tu codigo, pero si te puedo decir que con Souliss puedes hacer eso y mucho mas, y ya esta desarrollada la app, el sketch para arduino y solo es cuestion de "configurarlo" a tu gusto en unos pequeños pasos.
Sin que sirva para menospreciar tu trabajo te recomiendo que le heches un vistazo.

Proyecto Souliss (Domotica sencilla y barata) con App Android. ESTABLE - Proyectos - Arduino Forum

Para el tema de la alimentacion no es necesario pedirle al Arduino que alimente todos los reles, la mayoria de modulos traen una toma especifica para meterle 5v externos a los reles, y evitar asi la limitacion de intensidad que tiene Arduino.

Del codigo que he visto, efectivamente falta optimizarlo mucho con arrays y evitar el uso de Strings para el ON OFF por ejemplo, esto seria una variable boolean 0 1 que luego el codigo "convierte" a ON OFF en el momento de enviar la linea al Cliente.

Salu2 y buen Karma, espero haber sido de ayuda.

Hola juan :slight_smile: Efectivamente falta adelgazar el código, y ahi estoy dándole, a ver que saco..En el foro guiri me han comentado que lo haga con "ifs elses", algo así:

if ( stateX == true ) client.print("ENCENDIDO") ; else client.print("APAGADO");

Lo de souliss parece MUY interesante, y no te preocupes, no menosprecias mi trabajo jeje :wink:

Pero corrigeme si me equivoco, es una base de relés con acceso a la red no?? He estado mirando videos en yutube y la gente hace birguerias (Aunque he visto dos o tres apps diferentes :astonished:)...Me lo miraré este finde muuuuuy detenidamente :slight_smile:

Gracias y saludos :slight_smile:
(Se me acumula la faena, ya que tengo unos cuantos frentes abiertos xDDDDDD)