Ethernet Shield - Problema con cantidad de codigo HTML

Buenos dias,

soy nuevo en el foro, y en Arduino. Me llamo Quim y soy técnico en electronica des de hace cinco años. Me he interesado por Arduino por su facilidad de uso y de ensamblaje con tantos dispositivos. He empezado por la ethernet shield y una placa Arduino Uno.

Hechas todas mis primeras pruebas con leds y pulsadores, me he propuesto empezar a hacer una interfaz web para comprobar y interactuar con las distintas entradas y salidas de la placa. Pero me he encontrado con un problema que no me explico: si listo, en HTML los seis primeros “actuadores” no hay problema, pero si listo ocho, tengo el clasico error de pàgina no encontrada.

Adjunto el codigo completo, agradezco sugerencias!

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

//mac, IP
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);    //En casa
//IPAddress ip(192,168,0,22);    //En el trabajo

EthernetServer server(80);

String inString = String(35);

//Pins dels actuadors:
boolean act1 = 2;
boolean act2 = 3;
boolean act3 = 4;
boolean act4 = 5;
boolean act5 = 6;
boolean act6 = 7;
boolean act7 = 8;
boolean act8 = 9;

//Pines de sensores analogicos:
int sensor1 = A0;
int sensor2 = A1;
int sensor3 = A2;
int sensor4 = A3;
int sensor5 = A4;
int sensor6 = A5;


//codigos varios HTML:
const char act1_ON[] = "        <input type=checkbox name=act1 value=ON CHECKED> Actuador 1";
const char act1_OFF[] = "        <input type=checkbox name=act1 value=ON> Actuador 1";

const char act2_ON[] = "        <input type=checkbox name=act2 value=ON CHECKED> Actuador 2";
const char act2_OFF[] = "        <input type=checkbox name=act2 value=ON> Actuador 2";

const char act3_ON[] = "        <input type=checkbox name=act3 value=ON CHECKED> Actuador 3";
const char act3_OFF[] = "        <input type=checkbox name=act3 value=ON> Actuador 3";

const char act4_ON[] = "        <input type=checkbox name=act4 value=ON CHECKED> Actuador 4";
const char act4_OFF[] = "        <input type=checkbox name=act4 value=ON> Actuador 4";

const char act5_ON[] = "        <input type=checkbox name=act5 value=ON CHECKED> Actuador 5";
const char act5_OFF[] = "        <input type=checkbox name=act5 value=ON> Actuador 5";

const char act6_ON[] = "        <input type=checkbox name=act6 value=ON CHECKED> Actuador 6";
const char act6_OFF[] = "        <input type=checkbox name=act6 value=ON> Actuador 6";

const char act7_ON[] = "        <input type=checkbox name=act7 value=ON CHECKED> Actuador 7";
const char act7_OFF[] = "        <input type=checkbox name=act7 value=ON> Actuador 7";

const char act8_ON[] = "        <input type=checkbox name=act8 value=ON CHECKED> Actuador 8";
const char act8_OFF[] = "        <input type=checkbox name=act8 value=ON> Actuador 8";

const char inicio_html[] = 
"<head>"
"<title>Prueba de sensores y actuadores</title>"
"</head>"
"<body>"
"<H1> Control de sensores y actuadores</H1>"
"<form method=get name=CONTROL>"
;

const char final_html[]=
"


<input type=submit value=Envia>"
"</form>"
"</body>"
"</html>";

void setup()
{
  //iniciar conexion
  Ethernet.begin(mac, ip);
  server.begin();
  
  //Pines de los actuadores:
  pinMode(act1,OUTPUT);
  pinMode(act2,OUTPUT);
  pinMode(act3,OUTPUT);
  pinMode(act4,OUTPUT);
  pinMode(act5,OUTPUT);
  pinMode(act6,OUTPUT);
  pinMode(act7,OUTPUT);
  pinMode(act8,OUTPUT);
  
  //Los ponemos a cero:
  digitalWrite(act1,LOW);
  digitalWrite(act2,LOW);
  digitalWrite(act3,LOW);
  digitalWrite(act4,LOW);
  digitalWrite(act5,LOW);
  digitalWrite(act6,LOW);
  digitalWrite(act7,LOW);
  digitalWrite(act8,LOW);

}
void loop()
{

  EthernetClient client = server.available();
  
  if (client)
  {
    boolean currentLineIsBlank = true;
    
    while (client.connected())
    {
      if (client.available())
      { 
        char c = client.read();
        
        if (inString.length() < 100) inString += c;
 
        if (c == '\n' && currentLineIsBlank)
        {
          //Escribimos el codigo HTML
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          
          client.print(inicio_html);
          
          //antes de seguir imprimiendo, gestionamos los cambios que nos haya indicado el usuario
          gestiona_actuadores();
          
          //Hecha la comprobación, seguimos escribiendo, intercalando las lecturas de las entradas analogicas:
          client.print("<pre>");
          if(digitalRead(act1)==1) client.print(act1_ON);
          else client.print(act1_OFF);
          
          client.print("                                                        Sensor de entrada 1: ");
          client.print(analogRead(sensor1));
          client.print("</pre>");
          
          client.print("<pre>");          
          if(digitalRead(act2)==1) client.print(act2_ON);
          else client.print(act2_OFF);
          
          client.print("                                                        Sensor de entrada 2: ");
          client.print(analogRead(sensor2));
          client.print("</pre>");
          
          client.print("<pre>");
          if(digitalRead(act3)==1) client.print(act3_ON);
          else client.print(act3_OFF);
          
          client.print("                                                        Sensor de entrada 3: ");
          client.print(analogRead(sensor3));
          client.print("</pre>");
          
          client.print("<pre>");
          if(digitalRead(act4)==1) client.print(act4_ON);
          else client.print(act4_OFF);
          
          client.print("                                                        Sensor de entrada 4: ");
          client.print(analogRead(sensor4));
          client.print("</pre>");
          
          client.print("<pre>");
          if(digitalRead(act5)==1) client.print(act5_ON);
          else client.print(act5_OFF);
          
          client.print("                                                        Sensor de entrada 5: ");
          client.print(analogRead(sensor5));
          client.print("</pre>");
          //client.print("
");
          
          client.print("<pre>");
          if(digitalRead(act6)==1) client.print(act6_ON);
          else client.print(act6_OFF);

          client.print("                                                        Sensor de entrada 6: ");
          client.print(analogRead(sensor6));
          client.print("</pre>");
          /*
          client.print("<pre>");
          if(digitalRead(act7)==1) client.print(act7_ON);
          else client.print(act7_OFF);
          client.print("</pre>");
          
          client.print("<pre>");
          if(digitalRead(act8)==1) client.print(act8_ON);
          else client.print(act8_OFF);
          client.print("</pre>");
          client.print("
");
          */
          client.print(final_html);
          
          break;
        }
        
        // you're starting a new line
        if (c == '\n') currentLineIsBlank = true;

        // you've gotten a character on the current line
        else if (c != '\r')currentLineIsBlank = false;

      }
  }
    // give the web browser time to receive the data
    delay(10);
    //Clearing the String:
    inString="";
    // close the connection:
    client.stop();
}
}

void gestiona_actuadores()
{
          if(inString.indexOf("act1") >0) digitalWrite(act1 , HIGH);
          else digitalWrite(act1 , LOW);
          
          if(inString.indexOf("act2") >0) digitalWrite(act2 , HIGH);
          else digitalWrite(act2 , LOW);
          
          if(inString.indexOf("act3") >0) digitalWrite(act3 , HIGH);
          else digitalWrite(act3 , LOW);
          
          if(inString.indexOf("act4") >0) digitalWrite(act4 , HIGH);
          else digitalWrite(act4 , LOW);
          
          if(inString.indexOf("act5") >0) digitalWrite(act5 , HIGH);
          else digitalWrite(act5 , LOW);
          
          if(inString.indexOf("act6") >0) digitalWrite(act6 , HIGH);
          else digitalWrite(act6 , LOW);
          
          if(inString.indexOf("act7") >0) digitalWrite(act7 , HIGH);
          else digitalWrite(act7 , LOW);
          
          if(inString.indexOf("act8") >0) digitalWrite(act8 , HIGH);
          else digitalWrite(act8 , LOW);
}

Gracias por vuestra atención!

No sé si habrá algo más pero estás declarando los pines de los actuadores boolean act2 = 3; cuando boolean sólo puede ser true (1) o false (0). Cualquier otro número lo interpreta como true (1). Una cosa es la declaración de pines que puedes declarar como const byte act2 = 3; y otra es la variable que uses para ver el estado de esa salida una vez declarada como tal boolean Estadoact2 = false;

Si con 6 funciona y con 8 no, el problema es que saturas sl shield. las páginas que soporta tienen que ser sencillas. Si ocupan algo más de lo que pueden, se corrompe el funcionamiento.

Uooo! vaya error de principiante, no me habia dado cuenta del error en la asignación de pines, gracias cheyenne!

Por los que respecta a la explicación de pacojarcia, hombre, estoy imprimiendo menos de diez lineas, si que hay unos cuantos comparadores if-else de por medio, pero no veo en que deben afectar al funcionamiento del html, si los realiza el micro, no la shield de ethernet...

quizas es porque realizo estas operaciones durante la conexión del cliente? Eso me pareceria mas razonable, pero entonces, como deberia comprobar el estado de los sensores para poder mostrarlo?

Gracias por vuestra ayuda y consejos, jamas había escrito una linea en html y me encuentro mucho mas perdido de lo que esperaba... :~

hola he probado el programa me leen los datos de entrada analogicos pero las salidas de reles no me funcionan.

a ti te funciona, que podre estar haciendo mal?

Soy nuevo en esto de ethernet control ,gracias

jorgelopezsierra a quien le hablas ? La ultima respuesta fue Jan 30, 2012, 02:04 pm

Crea un post nuevo con tu inguietud e intenta ser claro en tu objetivo, y sumar la mayor cantidad de información posible. Ademas de leer las normas usando tags para códigos, imagenes, etc.