Mi proyecto de domótica con arduino mega + ethernet shiel y 9 paginas web SIN SD

Hola gente del foro, no entiendo porque en los foros dice que no se pueden tener mas de una pagina web sencilla en arduino como web server cuando yo de una manera muy simple muestro 9 paginas web que estan alojadas en una arduino mega para mi proyecto de domotica de mi casa y de hecho se pueden mostrar las que quiera siempre y cuando haya espacio en arduino. La verdad que no entiendo.

Quién lo dice y cual es tu pregunta?

Fue un comentario y no una pregunta. Y quien lo dice? Buscando en google simplemente hay foros que dice que no se puede tener mas de 2 paginas en una misma arduino y estoy seguro que es incorrecto. Mi intención fue colo comentarlo para que a lo mejor los que recien empiezan como yo en el mundo de arduino no se queden con ese concepto.

A ver.. vienes a este foro, haces una afirmación pero no pones un link para debatir algo, entonces pareciera que fueras tu quien lo afirma.
Coloca ejemplos de lo que dices.
Y luego lo debatimos.

Por ejemplo en 2 páginas web en 1 Arduino - Rincón Ingenieril muestra que se puede abriendo 2 puertos (el 80 y el 81) pero no es mas fácil y simple con el uso de las condiciones "if() {} else if() {}???

Dejo un fragmento de mi codigo:

EthernetClient cliente = server.available();
if (cliente)
{
boolean currentLineIsBlank = true;
while (cliente.connected())
{
if (cliente.available())
{
char c = cliente.read();
LecturaRespuesta += c;
if (c == '\n' && currentLineIsBlank)
{
int param = LecturaRespuesta.indexOf("p");
if (LecturaRespuesta.substring(param, param + 3) == "pP0") { Pagina = 0; }
else if (LecturaRespuesta.substring(param, param + 3) == "pP1") { Pagina = 1; }
else if (LecturaRespuesta.substring(param, param + 3) == "pP2") { Pagina = 2; }
else if (LecturaRespuesta.substring(param, param + 3) == "pP3") { Pagina = 3; }
else if (LecturaRespuesta.substring(param, param + 3) == "pP4") { Pagina = 4; }
else if (LecturaRespuesta.substring(param, param + 3) == "pP5") { Pagina = 5; }
else if (LecturaRespuesta.substring(param, param + 3) == "pP6") { Pagina = 6; }
else if (LecturaRespuesta.substring(param, param + 3) == "pP7") { Pagina = 7; }
else if (LecturaRespuesta.substring(param, param + 3) == "pP8") { Pagina = 8; } 

InicioPaginaWeb(cliente);

if (Pagina == 0) { Pagina0(cliente); }
else if (Pagina == 1) { Pagina1(cliente); FinPaginaWeb(cliente); }
else if (Pagina == 2) { Pagina2(cliente); FinPaginaWeb(cliente); }
else if (Pagina == 3) { Pagina3(cliente); FinPaginaWeb(cliente); }
else if (Pagina == 4) { Pagina4(cliente); FinPaginaWeb(cliente); }
else if (Pagina == 5) { Pagina5(cliente); FinPaginaWeb(cliente); }
else if (Pagina == 6) { Pagina6(cliente); FinPaginaWeb(cliente); }
else if (Pagina == 7) { Pagina7(cliente); FinPaginaWeb(cliente); }
else if (Pagina == 8) { Pagina8(cliente); FinPaginaWeb(cliente); }

void Pagina0(EthernetClient mcliente)
{
mcliente.println(F("<h1 style = 'text-align: center;'><span style = 'color:#0000FF;'>SELECCIONE UNA ZONA</span></h1>"));
mcliente.println(F("<p style = 'text-align: center'><input name = 'txt1' type = 'button' value = 'Dormitorio Principal' / onClick=location.href='./?pP1\' >&nbsp; <input name = 'txt2' type = 'button' value = 'Dormitorio Secundario' / onClick=location.href='./?pP2\' >&nbsp; <input name = 'txt3' type = 'button' value = 'Ba&ntildeo' / onClick=location.href='./?pP3\' ></p>"));
mcliente.println(F("<p style = 'text-align: center'><input name = 'txt4' type = 'button' value = 'Pasillo - Living y Comedor' / onClick=location.href='./?pP4\' >&nbsp; <input name = 'txt5' type = 'button' value = 'Cocina' / onClick=location.href='./?pP5\' ></p>"));
mcliente.println(F("<p style = 'text-align: center'><input name = 'txt6' type = 'button' value = 'Iluminacion Exterior' / onClick=location.href='./?pP6\' >&nbsp; <input name = 'txt7' type = 'button' value = 'Riego' / onClick=location.href='./?pP7\' ></p>"));
mcliente.println(F("<p style = 'text-align: center'><input name = 'txt8' type = 'button' value = 'Acceso al predio' / onClick=location.href='./?pP8\' ></p>"));
}

void Pagina1(EthernetClient mcliente)
{
mcliente.println(F("<h1 style = 'text-align: center;'><span style = 'color:#0000FF;'>Dormitorio Principal</span></h1>"));
if (digitalRead(PinSalida_CuartoGrande_LucesDelTecho) == 1) { mcliente.println(F("<p style = 'text-align: center;'>Luces del techo &nbsp; &nbsp; <input name = 'txt1' type = 'button' value = 'Encender' / onClick=location.href='./?p1A\' ></p>")); } else { mcliente.println(F("<p style = 'text-align: center;'>Luces del techo &nbsp; &nbsp; <input name = 'txt1' type = 'button' value = 'Apagar' / onClick=location.href='./?p1A\' ></p>")); }
if (digitalRead(PinSalida_CuartoGrande_LuzDePared) == 1) { mcliente.println(F("<p style = 'text-align: center;'>Luz de pared &nbsp; &nbsp; <input name = 'txt2' type = 'button' value = 'Encender' / onClick=location.href='./?p1B\' ></p>")); } else { mcliente.println(F("<p style = 'text-align: center;'>Luz de pared &nbsp; &nbsp; <input name = 'txt2' type = 'button' value = 'Apagar' / onClick=location.href='./?p1B\' ></p>")); }
if (digitalRead(PinSalida_CuartoGrande_LucesTechoBajo) == 1) { mcliente.println(F("<p style = 'text-align: center;'>Luces del cielorraso &nbsp; <input name = 'txt3' type = 'button' value = 'Encender' / onClick=location.href='./?p1C\' ></p>")); } else { mcliente.println(F("<p style = 'text-align: center;'>Luces del cielorraso &nbsp; <input name = 'txt3' type = 'button' value = 'Apagar' / onClick=location.href='./?p1C\' ></p>")); }
if (digitalRead(PinSalida_CuartoGrande_LuzTechoBajo) == 1) { mcliente.println(F("<p style = 'text-align: center;'>Luz del cielorraso &nbsp; &nbsp; <input name = 'txt4' type = 'button' value = 'Encender' / onClick=location.href='./?p1D\' ></p>")); } else { mcliente.println(F("<p style = 'text-align: center;'>Luz del cielorraso &nbsp; &nbsp; <input name = 'txt4' type = 'button' value = 'Apagar' / onClick=location.href='./?p1D\' ></p>")); }
}

void InicioPaginaWeb(EthernetClient mcliente)
{
mcliente.println("<!DOCTYPE html>");
mcliente.println("<html>");
mcliente.println("<head>");
mcliente.println(F("<title>Control remoto de hogar - Guillermo.</title>"));
mcliente.println("</head>");
mcliente.println("<body>");
}

void FinPaginaWeb(EthernetClient mcliente)
{
mcliente.println("<hr />");
mcliente.println(F("<p style='text-align: center;'><input name='txtMenu' type='button' value='Menu Principal' onClick=location.href='./?pP0\'></p>"));
}

Por dios GorloLaguzzi**, no me hagas trabajar todo el dia contigo.**
Lee las normas del foro, por favor!!!
Tenias 13 o 14 msg, nunca leíste las normas del foro? Parece que no al postear como lo has hecho.
Mira otros hilos y luego vuelve a éste y edita este ultimo post.
Ve a More, luego Modify y ya puedes editar. Selecciona todo el código y luego click en </>
No sabes que hay que usar tags para postear códigos y enlaces?
Los enlaces van con el tag que luce como eslabón.

Es un problema de cuan detallada esta la página y de la memoria disponible en tu arduino.
Si usas una SD no tienes inconveniente en poner cuantas páginas quieras.
Pero si solo muestras datos con paginas simples, se puede poner varias.
La afirmación corre por cuenta de esa página pero Internet esta plagado de cosas asi. Ahora yo no percibo que quien hizo el tutorial afirme que solo dos páginas se pueden montar en un arduino. El muestra como poner 2 en ese ejemplo pero lo vi superficialmente.

Míralo de esta manera:

  • Un Arduino Mega dispone de 256 KB de memoria flash (programa), de los cuales 8 son del bootloader, y posiblemente 3 para las funciones básicas del IDE y la librería Ethernet. Te quedan 245 KB libres para almacenar lo que quieras.
  • Un archivo HTML es básicamente un archivo de texto plano, el cuál contiene el código fuente para mostrar la página web. Se puede insertar el contenido como un array de byte/unsigned char y con la palabra clave "PROGMEM". Para eso yo utilizo el programa bin2h; el cual convierte un archivo en un array de unsigned char (código fuente en un archivo .h).

Quizá la limitante que se refería el del tutorial, es por unas que tiene el compilador usado en la IDE de Arduino (para arquitecturas AVR):

  • Los arrays no pueden ser de más de 32767 bytes de longitud (no utilizar bin2h en archivos mayores a 32 KB); de lo contrario habrá error de compilación.
  • Los punteros de memoria (tipo de dato con un * al final) siempre son de 16 bits; en memoria flash, esto significa que no se puede acceder más allá de los 64 KB (1/4 de la memoria flash de un Arduino Mega).
  • Para tener acceso a toda la memoria flash de un Mega, se usa pgm_read_byte_far y no el pgm_read_byte que se usa en Arduino Uno/Nano.

pgm_read_byte_far recibe un puntero de 32 bits (o algún valor que quepa en un unsigned long) y devuelve el valor del byte leído en esa posición.
Ahora bien, ese no es el problema; el problema es saber dónde empieza un array de byte que está en la memoria del programa (PROGMEM), pero que quizá esté más allá de los 64 KB.

char caracter = pgm_read_byte_far(&pagina1[0]);

// Esto no se puede hacer en un Arduino Mega, porque el array pagina1 podría estar más allá de los 64 KB.
// De ser así, lo que acabas leyendo, posiblemente sea código del bootloader.

// &pagina1[0] podría estar más allá de 64 KB, pero el puntero resultante sigue siendo de 16 bits.
// Por desborde (overflow), podría acabar apuntando al principio de la memoria (donde está el bootloader).

Si alguien puede demostrarme lo contrario a lo que acabo de decir, se lo agradecería porque ando con un problema de este tipo desde hace un mes. :confused: