Control Remoto de Reles v1.0 - Arduino Uno + Ethernet Shield + Placa de 8 Reles

Hola amigos,
soy nuevo en esto de Arduino, pero ya he estado probando y he conseguido hacer funcionar mi primer proyecto, con la ayuda de la información de la web y de los foros que he ido leyendo.
Lo he probado con 5 Reles, ya que con 8 no me cabe en la memoria.

Comentaros que el programa tal y como esta no cabe en la memoria de mi Arduino One. (Tengo el Ethernet Shield y una tarjeta SD de 8GB, pero aún no se utilizarla. (Alguien me puede ayudar a cargar el programa en la SD).
Ya me comentais que os parece y que se puede mejorar.

/*
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="";
}
}
}
}
}

Deberías empollarte un poco sobre bucles y arrays. Descubrirás que tu código actualmente ocupa casi ocho veces lo que debería ocupar de estar bien optimizado. El que tiene que repetir las cosas es el arduino, no tú. Tú debes aprender cómo decirle a la máquina qué hay que repetir y qué debe cambiar en cada repetición.
Te pongo un ejemplo, de lo que sería la inicialización de los led y los estados. Como ves, en lugar de usar PIN_LED1, PIN_LED2... PIN_LED8 uso PIN_LED[0], PIN_LED[1], ... PIN_LED[7]. Eso es un array, y tiene la particularidad de que puedo sustituir el número entre corchetes por una variable, que es lo que lo hace tan útil:

int PIN_LED[8]={5, 6, 7, 8, 9 , 11, 12, 13}; // equivale a PIN_LED[0]=5; PIN_LED[1]=6, etc...
bool state[8];

void setup()
{
  for (int i=0; i<8; i++) {
        pinMode(PIN_LED[i],OUTPUT);
        digitalWrite(PIN_LED[i],LOW);
        state[i]=false;
  }
}

No es tan complicado. Sencillamente es algo que hay que conocer :).
Si consigues entender el código que te propongo, deberías poder aplicar la misma técnica al resto del programa. Si te atascas no dudes en pedir ayuda.
Saludos.

Hola de nuevo.
Veo que estás bastante verde en c. Si echas un vistazo a la referencia de arduino verás que es una instrucción para realizar bucles.
En este caso,
for (i=0; i<8; i++) { ....}
Va a crear una variable i que se inicia a 0, va a repetir lo que haya entre llaves mientras i sea menor que 8, y cada vez que llegue al final de las llaves va a incrementar i (i++). Por lo tanto, si no modifico i dentro de las llaves, se va a repetir 8 veces, y la variable i dentro de las llaves va a ir pasando por valor 0, 1, 2, 3, 4, 5, 6 y 7 (cuando sea 8 saldrá del bucle).

Es decir, si entre llaves digo
pinMode(PIN_LED[ i ],OUTPUT);
digitalWrite(PIN_LED[ i ],LOW);
se va a ejecutar así:
pinMode(PIN_LED[ 1 ],OUTPUT);
digitalWrite(PIN_LED[ 1 ],LOW);
pinMode(PIN_LED[ 2 ],OUTPUT);
digitalWrite(PIN_LED[ 2 ],LOW);
etc... hasta
pinMode(PIN_LED[ 7 ],OUTPUT);
digitalWrite(PIN_LED[ 7 ],LOW);

Con lo que al final, con tres instrucciones más el for, estoy realizando el equivalente a 24 instrucciones de tu setup.

Pero todo esto es muy básico. Deberías, como te digo, echar un vistazo a la referencia.

Saludos

Tome el Sketch de [SOLVED] Arduino with Ethernet Shield: Trying to have button click blink an LED. - #4 by max_saeta - Programming Questions - Arduino Forum

Y lo modifique para que lo pruebes

#include <SPI.h>
#include <Ethernet.h>
int PIN_LED[8]={5, 6, 7, 8, 9 , 11, 12, 13};
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   //physical mac address
byte ip[] = { 10,0,0,14 };                      // ip in lan (that's what you need to use in your browser. ("192.168.1.178")
byte gateway[] = { 10,0,0,1 };                   // internet access via router
byte subnet[] = { 255, 255, 255, 0 };                  //subnet mask
EthernetServer server(666);                             //server port     
String readString;
boolean red_blink = false;
unsigned long my_time;


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
  }
  for(int i = 0; i <8; i++){
    pinMode(PIN_LED[i],OUTPUT);
    digitalWrite(PIN_LED[i],LOW);
  }
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {   
      if (client.available()) {
        char c = client.read();
     
        //read char by char HTTP request
        if (readString.length() < 100) {
          //store characters to string
          readString += c;
          //Serial.print(c);
         }

         //if HTTP request has ended
         if (c == '\n') {          
           Serial.println(readString); //print to serial monitor for debuging
     
           client.println("HTTP/1.1 200 OK"); //send new page
           client.println("Content-Type: text/html");
           client.println();     
           client.println("<HTML>");
           client.println("<HEAD>");
           client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
           client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
           client.println("<link rel='stylesheet' type='text/css' href='http://randomnerdtutorials.com/ethernetcss.css' />");
           client.println("<TITLE>Beyerlin Home Automation System</TITLE>");
           client.println("</HEAD>");
           client.println("<BODY>");
           client.print("<body style=background:gray>");
           client.println("<H1>Beyerlin Home Automation Service</H1>");
           client.println("<hr />");
           client.println("
");  
           client.println("<H2>User Interface Control Panel</H2>");
           client.println("
");  
           client.println("<a href=\"/?button1on\"\"> LED 1 ON</a>");
           client.println("<a href=\"/?button1off\"\"> LED 1 OFF</a>
");   
           client.println("
");     
           client.println("
");  
           client.println("<a href=\"/?button2on\"\"> LED 2 ON</a>");
           client.println("<a href=\"/?button1off\"\"> LED 2 OFF</a>
");   
           client.println("
");     
           client.println("
");  
           client.println("<a href=\"/?button3on\"\"> LED 3 ON</a>");
           client.println("<a href=\"/?button3off\"\"> LED 3 OFF</a>
");   
           client.println("
");     
           client.println("
");  
           client.println("<a href=\"/?button4on\"\"> LED 4 ON</a>");
           client.println("<a href=\"/?button4off\"\"> LED 4 OFF</a>
");   
           client.println("
");     
           client.println("
");  
           client.println("<a href=\"/?button5on\"\"> LED 5 ON</a>");
           client.println("<a href=\"/?button5off\"\"> LED 5 OFF</a>
");   
           client.println("
");     
           client.println("
");  
           client.println("<a href=\"/?button6on\"\"> LED 6 ON</a>");
           client.println("<a href=\"/?button6off\"\"> LED 6 OFF</a>
");   
           client.println("
");     
           client.println("
");  
           client.println("<a href=\"/?button7on\"\"> LED 7 ON</a>");
           client.println("<a href=\"/?button7off\"\"> LED 7 OFF</a>
");   
           client.println("
");     
           client.println("
");  
           client.println("<a href=\"/?button8on\"\"> LED 8 ON</a>");
           client.println("<a href=\"/?button8off\"\"> LED 8 OFF</a>
");   
           client.println("
");                
           client.println("</BODY>");
           client.println("</HTML>");
     
           delay(1);
           //stopping client
           client.stop();
           //controls the Arduino if you press the buttons
           
           
           if (readString.indexOf("?button1on") >0)
           {
               digitalWrite(PIN_LED[0], HIGH);
           }
           if (readString.indexOf("?button1off") >0)
           {
               digitalWrite(PIN_LED[0], LOW);
           }
           if (readString.indexOf("?button2on") >0)
           {
               digitalWrite(PIN_LED[1], HIGH);
           }
           if (readString.indexOf("?button2off") >0)
           {
               digitalWrite(PIN_LED[1], LOW);
           }
           if (readString.indexOf("?button3on") >0)
           {
               digitalWrite(PIN_LED[2], HIGH);
           }
           if (readString.indexOf("?button3off") >0)
           {
               digitalWrite(PIN_LED[2], LOW);
           }
           if (readString.indexOf("?button4on") >0)
           {
               digitalWrite(PIN_LED[3], HIGH);
           }
           if (readString.indexOf("?button4off") >0)
           {
               digitalWrite(PIN_LED[3], LOW);
           }
           if (readString.indexOf("?button5on") >0)
           {
               digitalWrite(PIN_LED[4], HIGH);
           }
           if (readString.indexOf("?button5off") >0)
           {
               digitalWrite(PIN_LED[4], LOW);
           }
           if (readString.indexOf("?button6on") >0)
           {
               digitalWrite(PIN_LED[5], HIGH);
           }
           if (readString.indexOf("?button6off") >0)
           {
               digitalWrite(PIN_LED[5], LOW);
           }
           if (readString.indexOf("?button7on") >0)
           {
               digitalWrite(PIN_LED[6], HIGH);
           }
           if (readString.indexOf("?button7off") >0)
           {
               digitalWrite(PIN_LED[6], LOW);
           }
           if (readString.indexOf("?button8on") >0)
           {
               digitalWrite(PIN_LED[7], HIGH);
           }
           if (readString.indexOf("?button8off") >0)
           {
               digitalWrite(PIN_LED[7], LOW);
           }           
           
          
           readString="";
        }
      }
    }
  }
}

Hola de nuevo, macallan. Perdona. No había visto tu post hasta ahora.
¿Podrías ser más preciso? ¿Con qué código necesitas ayuda?

HOLA, Es normal que los indicadores del conector RJ45 de la Ethernet Shield W5100 solo prenda el verde y el Ambar permanezca apagado cuando conecto el cable Utp ?? Gracias