problema "println(htm)"

Salve Buongiorno vi chiedo aiuto...

sto realizzando un progetto che preveda l'azionamento di relay tramite ethernet (tutto Funzionante).
Cercando su questo forum trovo che per "abbellire" posso tranquillamente usare il codice html a mio piacimento... se inserisco codice html con tag particolari =

          client.println("<center> < img src = http: //www.gelarredi.it/img/logo.png></center>");
          client.println("< hr / >");

qui tutto ok.
mentre nel momento in cui continuo a scrivere righe di codice semplice con delle img collegate perdo totalmente la formattazione html.

   client.println("<center>");
          client.println("<h1>Apri Porta </h1>");
          client.println("<a href=\"/?button3on\"\"></a>");
          client.println("<img src=http://www.gelarredi.it/imgard/btnb.png>");
          client.println(" < / a >" );
          client.println(" < / center >" );

Grazie in anticipo

PS: in allegato quello che intendo per perdita formattazione html.

Non postando tutto il codice non riesco a essere preciso nell'indicarti il punto dove hai commesso l'errore, è abbastanza evidente che ci sia un tag o una stringa non correttamente ciusa in quanto il browser ti visualizza pezi di codice html. Posta tutto il codice o verifica se hai erronamente mancato di chiudere un apice, un doppio apice, se hai aperto con doppio apice e chiuso con apice sinogolo o viceversa o se hai un tag non chiuso in modo corretto

scusami posto tutto il codice:

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

int led = 4;
int led2 = 3;
int led3 = 5;
int led4 = 6;

unsigned long tempo = 10000;
unsigned long ora;
unsigned long prima;
int pos = 0;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   //physical mac address
byte ip[] = { 192, 168, 1, 30 };                      // ip in lan (that's what you need to use in your browser. ("192.168.1.178")
byte gateway[] = { 192, 168, 1, 1 };                   // internet access via router
byte subnet[] = { 255, 255, 255, 0 };                  //subnet mask
EthernetServer server(80);                             //server port
String readString;

void setup() {
  // Apri Seriale
  while (!Serial) {
    ;
  }
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  // Inizializza Network
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {

  // Crea Connessione Client
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (readString.length() < 100) {

          readString += c;

        }


        if (c == '\n') {
          Serial.println(readString);
          //html file
          client.println("HTTP/1.1 200 OK");
          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("<TITLE>&copy; Giuseppe Marazzotta < / TITLE > ");
          client.println(" < / HEAD > ");
          client.println("<body >");
          //    <body style="background-color:powderblue;">
          client.println("<center> < img src = http: //www.gelarredi.it/img/logo.png></center>");
          client.println("< hr / >");
          client.println(" < br / >");
          client.println("<center>MY_HOME V 0.02 < / center >");
          client.println( "< br / > ");
          client.println("<center>");
          client.println("<h1>Apri Porta </h1>");
          client.println("<a href=\"/?button3on\"\"></a>");
          client.println("<img src=http://www.gelarredi.it/imgard/btnb.png>");
          client.println(" < / a >" );
          client.println(" < / center >" );
          client.println(" < br / > ");
          client.println(" < br / > ");
          client.println("<center>");
          client.println("<h1>Luce Cucina < / h1 >");
          client.println("<a href=\"/?button1on\"\">");
          client.println("<img src=http://www.gelarredi.it/imgard/btng.png></a>");
          client.println("<a href=\"/?button1off\"\">");
          client.println("<img src=http://www.gelarredi.it/imgard/btnr.png></a>");
          client.println( "< / center >" );
          client.println(" < br / > ");
          client.println(" < br / > ");
          client.println("<center>");
          client.println("<h1>Luce Camera < / h1 >" );
          client.println("<a href=\"/?button2on\"\">");
          client.println("<img src=http://www.gelarredi.it/imgard/btng.png></a>");
          client.println("<a href=\"/?button2off\"\">");
          client.println("<img src=http://www.gelarredi.it/imgard/btnr.png></a>");
          client.println(" < / center > ");
          client.println(" < br / > ");
          client.println(" < br / >");
          client.println("<center><h1>Scala < / h1 >");
          client.println("<a href=\"/?button3on\"\"></a>");
          client.println("<img src=http://www.gelarredi.it/imgard/btnb.png>");
          client.println(" < / a >" );
          client.println(" < / center >" );
          client.println( "< br / > ");
          client.println( "< br / > ");
          client.println( "< br / > ");
          client.println( "< br / > ");
          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(led, HIGH);
          }
          if (readString.indexOf("?button1off") > 0) {
            digitalWrite(led, LOW);
          }



          if (readString.indexOf("?button2on") > 0) {
            digitalWrite(led2, HIGH);
          }
          if (readString.indexOf("?button2off") > 0) {
            digitalWrite(led2, LOW);
          }



          if (readString.indexOf("?button3on") > 0) {
            ora = millis();
            if ((unsigned long)(ora - prima) >= tempo) {
              digitalWrite(led3, HIGH);
            }
          } else {
            digitalWrite(led3, LOW);
          }
          if (readString.indexOf("?button3off") > 0) {
            digitalWrite(led3, LOW);
          }





          if (readString.indexOf("?button4on") > 0) {
            ora = millis();
            if ((unsigned long)(ora - prima) >= tempo) {
              digitalWrite(led4, HIGH);
            }
          } else {
            digitalWrite(led4, LOW);
          }
          if (readString.indexOf("?button4off") > 0) {
            digitalWrite(led4, LOW);
          }



          //clearing string for next read
          readString = "";

        }
      }
    }
  }

}

il codice è stato scritto su di un compilatore html e da solo funziona.

Il codice html sembra corretto, ovvero tag chiusi e apici a posto, l'unica cosa che noto è che inizia ad andare in crisi dopo il tag head, da quel punto dopo la parentesi angolare c'è uno spazio prima del meta ecc..
Così su due piedi non mi viene altro in metnte che provare a rimuovere tutti gli spazi non necessari prima e dopo le parentesi angolari di apertura e chiusura tag

<meta name = 'apple-mobile-web-app-capable' content = 'yes' />

e vedere come si comporta, anche se dubito sia quello il problema.
Proverei a non eseguire tutte le operazioni ad ogni ciclo di loop ma tramite millis() verificare connessione ecc ogni tot secondi, il caos potrebe dipendere dall'eccessivo refresh (un po' come avviene con gli LCD che se si aggiornano ad ogni ciclo di loop vanno in crisi), altro non mi viene in mente

Per quel che può valere, mettendo il codice html su questo validatore escono una caterva di errori legati agli spazi prima e dopo le parentesi angolari

Riposto il codice corretto e funzionante, e ringrazio @fabpolli per i consigli, i problemi credo che siano inerenti proprio gli spazi e all' uso degli apici(anche se credo che il compilatore o il browser"visto che se il file esterno lo salvavo in html nessun problema di visualizzazione"li elimini gli spazi).

comunque perdendo un po di tempo nella mia pausa pranzo sono riuscito a rivedere-riscrivere ex novo la parte html adesso tutto ok.

//CREATED BY gmmg90

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

int led = 4;
int led2 = 3;
int led3 = 5;
int led4 = 6;

unsigned long tempo = 10000;
unsigned long ora;
unsigned long prima;
int pos = 0;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   //physical mac address
byte ip[] = { 192, 168, 1, 30 };                      // ip in lan (that's what you need to use in your browser. ("192.168.1.178")
byte gateway[] = { 192, 168, 1, 1 };                   // internet access via router
byte subnet[] = { 255, 255, 255, 0 };                  //subnet mask
EthernetServer server(80);                             //server port
String readString;

void setup() {
  // Apri Seriale
  while (!Serial) {
    ;
  }
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  // Inizializza Network
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {

  // Crea Connessione Client
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (readString.length() < 100) {

          readString += c;

        }


        if (c == '\n') {
          Serial.println(readString);
          //html file
          client.println("HTTP/1.1 200 OK");
          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("<TITLE>&copy; Gelarredi</TITLE>");
          client.println("</HEAD>");
          client.println("<BODY style='background-color:powderblu;>");
          client.println("<CENTER>");
          client.println("<img src=http://www.gelarredi.it/img/logo.png");
          client.println("<hr />");
          client.println("
");
          client.println("<H2 STYLE='background-color:tomato;'>MY_HOME_v0.03</H2>");
          client.println("
");
          //BUTTON FOR FIRST LED
          client.println("<p>ApriPorta</p>");
          client.println("<a href=\"/?button3on\"\"><img src='http://www.gelarredi.it/imgard/btnb.png' width='64'height='64'></a>");
          client.println("
");
          client.println("
");
          //BUTTON SECOND LED
          client.println("<p>Luce Scala</p>");
          client.println("<a href=\"/?button4on\"\"><img src='http://www.gelarredi.it/imgard/btnb.png' width='64'height='64'></a>");
          client.println("
");
          client.println("
");
          //BUTTON THIRD LED
          client.println("<p>Luce Soggiorno</p>");
          client.println("<a href=\"/?button1on\"\"><img src='http://www.gelarredi.it/imgard/btng.png' width='64'height='64'></a>");
          client.println("<a href=\"/?button1off\"\"><img src='http://www.gelarredi.it/imgard/btnr.png' width='64'height='64'></a>
");

          client.println("
");
          client.println("
");
          //BUTTON FOURTH LED
          client.println("<p>Luce Soggiorno</p>");
          client.println("<a href=\"/?button2on\"\"><img src='http://www.gelarredi.it/imgard/btng.png' width='64'height='64'></a>");
          client.println("<a href=\"/?button2off\"\"><img src='http://www.gelarredi.it/imgard/btnr.png' width='64'height='64'></a>
");
          client.println("
");
          client.println("
");
          client.println("
");
          client.println("</CENTER>");
          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(led, HIGH);
          }
          if (readString.indexOf("?button1off") > 0) {
            digitalWrite(led, LOW);
          }



          if (readString.indexOf("?button2on") > 0) {
            digitalWrite(led2, HIGH);
          }
          if (readString.indexOf("?button2off") > 0) {
            digitalWrite(led2, LOW);
          }

          if (readString.indexOf("?button3on") > 0) {
            ora = millis();
            if ((unsigned long)(ora - prima) >= tempo) {
              digitalWrite(led3, HIGH);
            }
          } else {
            digitalWrite(led3, LOW);
          }


          if (readString.indexOf("?button4on") > 0) {
            ora = millis();
            if ((unsigned long)(ora - prima) >= tempo) {
              digitalWrite(led4, HIGH);
            }
          } else {
            digitalWrite(led4, LOW);
          }


          //clearing string for next read
          readString = "";

        }
      }
    }
  }

}

Quindi se a qualcuno possa servire qualcosa del genere che ben venga.

Adesso mi sorge un'altro problema ben diverso, con la funzione millis() da me mai usata,
come vedete nel codice per i relay 3 e 4 voleva settare un tempo di accensione spegnimento (blink) che mi servirebbero rispettivamente per aprire la porta e accendere la luce della scala dando un impulso di un secondo.

Cercando in giro dovrei usare millis() inserendo una constante da me chiamata Tempo

unsigned long tempo = 10000;
unsigned long ora;
unsigned long prima;

e se non erro dovrei fare questo:(cercho aiuto)

     if (readString.indexOf("?button3on") >0){
                ora = millis();
              if((unsigned long)(ora - prima) >= tempo){
               digitalWrite(led3, HIGH);
              }
            }else{
               digitalWrite(led3, LOW);
           }

Grazie Sempre!

Credo sia meglio che tu preveda una specie di macchina a stati finiti per arrivare al tuo obiettivo, se metti un delay puoi usare il codice così com'è ma con la millis se non ritorni all'interno dell'if che verifica se il parametro è stato impostato non riesci a raggiungere lo scopo, quindi potresti definirti delle variabili booleane che setti a true in corrispondenza nei vari if che leggono i parametri e poi nel loop testi le variabili se sono vere allora attivi l'uscita relativa e ti setti il "prima", altrimenti se il loro valore è false verifichi se è trascorso il tempo necessario, se si metti a low l'uscita relativa e risolvi.
Sei vicino a capire il funzionamento di millis, per chiarirti meglio il suo uso puoi vedere prima QUI, poi QUI ed infine leggi anche QUI e QUI ... ti chiariranno le possibilità che hai :wink: [cit. gpb01]

@gmmg90
Non dici niente su che Arduino usi e che scheda Ethernet.

Secondo me é un problema di RAM esaurita.
Usa la makro f() per non usare la RAM nel print() di testo.

esempio
client.println(F(""));

Ciao Uwe

uwefed:
@gmmg90
Non dici niente su che Arduino usi e che scheda Ethernet.

Arduino Genuino Uno
W501 Ethernet Shield

uwefed:
Secondo me é un problema di RAM esaurita.
Usa la makro f() per non usare la RAM nel print() di testo.

esempio
client.println(F(""));

Vorre capire a che serve(non usare la ram'utile')cos'è la macro o makro f?? :o :o

PS o modificato il mio POST precedente avevo incollato il codice "corretto e Funzionante" ma sinceramente no so manco cosa avevo copiato :blush: :blush:

gmmg90:
Vorre capire a che serve(non usare la ram'utile')cos'è la macro o makro f?? :o :o

Se usi troppa RAM viene sovvrascritto parte della RAM che viene usato per altri scopi e percui non funziona.

gmmg90:
... cos'è la macro o makro f?? :o :o

Basta fare una piccola ricerca con Google ... :wink:
... leggi QUI ed anche QUI (... per entrambi i link, la macro F() è a fondo pagina, ma leggi tutto che ti da importanti informazioni).

Guglielmo

uwefed ha ragione nell'uso della macro F comunque gmmg90 aveva segnalato che eliminando gli spazi ilcodice funzionava, quindi il problema ram non c'entra, almeno sulle piccole prove su operatività a lungo termine sicuramente avrà i suoi effetti quindi è meglio mettere la F()