Web server, submit query ed impaginazione.

Ciao a tutti :slight_smile:
Oggi lavoravo al mio web server e come ultimissima cosa ho implementato la possibilità di cambiare due set point del termostato via web page.
In pratica con una GET mando una stringa, verifico cosa c'è nella stringa, se ritrovo gli indicatori che mi servono estraggo i relativi valori, li trasformo in int con atoi li impacchetto e li mando via seriale ad un ad un altro arduino che si occupa di controllare il termostato.
Quando il secondo arduino li riceve, li legge e fa un update delle sue variabili per gestirsi il termostato.
Poi rimanda queste variabili al primo arduino che si occupa di pubblicarle sulla web page.

Il codice funziona e sono molto contenta :slight_smile:
Vorrei però dare una sistemata all'impaginazione ed alla "grafica", mi date una mano?
Si tratta prevalentemente di html, quindi non propriamente arduino, però siamo in tema credo.

Premessa: E' mia intenzione tenere la pagina più scarna possibile. Per non appesantire l'arduino.
Al momento il mio codice presenta quello che potete vedere nell'immagine allegata.

Quello che vorrei fare io è:

  1. Spostare i bottoni di submit query sulla stessa riga dei relativi setpoint.
    Nonostante non ci siano ne br ne println ne /n non ci riesco.

  2. Cambiare i bottoni di submit. Vorrei i medesimi bottoni ma con un semplice "invia".

  3. Cambiare le input box.
    Mi piacerebbe avere un menu a tendina con un set di valori prestabilito. Tipo "- 1 2 3 4 5.... 40"

  4. Ultimissimo.
    Al momento dopo aver inviato la query ho fatto in modo che l'arduino risponda con una pagina di conferma. Sarebbe possibile avere questa pagina in un popup di dimensioni ridotte?
    Così mi rimane la pagina principale sullo sfondo.

Avete suggerimenti o link da leggere per fare queste cose?
A seguire il mio codice, che produce la pagina nell'allegato.
Grazie!

// send a standard http response header
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println();

          // meta refresh page every 60 seconds
          client.print(F("<HEAD><meta http-equiv=\"refresh\" content=\"60\"><TITLE />GreenHouse Project Lan Page</title></head>"));

          // Creazione pagina web locale: 
 a capo <HR> a capo con separatore
          client.print(F("<h3>GreenHouse Project 0.5 Final R4a IDE 1.0</h3><HR>Temperatura OUT: "));
          client.print(mydata.toutES);
          client.print(F(" C
Umidita' OUT: "));
          client.print(mydata.houtES); 
          client.print(F(" %<HR>Temperatura IN: "));          
          client.print(mydata.tinES); 
          client.print(F(" C
Umidita' IN: ")); 
          client.print(mydata.hinES); 
          client.print(F(" %<HR>Temperatura H2O: "));
          client.print(mydata.T1ES); 
          client.print(F(" C
Luminosita': "));
          client.print(mydata.mediaHzES); 
          client.print(F(" Hz<HR>Temperatura Heater: "));          
          client.print(mydata.T2ES); 
          client.print(F(" C
SetPoint Heater ON: "));      
          client.print(mydata.tSSRMinES);   // temperatura per accensione relé
          client.print(F(" C"));      
          client.print(F("<form method=GET>TMin: <input type=text name=tmin><input type=submit></form>"));
          client.print(F("
SetPoint Heater OFF: "));      
          client.print(mydata.tSSRMaxES);   // temperatura per spegnimento relé
          client.print(F(" C"));      
          client.print(F("<form method=GET>TMax: <input type=text name=tmax><input type=submit></form>"));
          client.print(F("
Heater Status: "));      
          if ( mydata.statusSSRES == 1 ) {  // mostra lo stato del riscaldatore
            client.print(F("ON")); 
          }
          else {          
            client.print(F("OFF"));
          }
          client.print(F("<HR>Pachube Connection: "));
          if ( pachubestatus == 1 ) {       // mostra lo stato della connessione a pachube
            client.print(F("ON
Pachube Response: "));
            client.print(rxbuffer);         // Se la connessione è riuscita mostra la risposta di pachube
          }
          else {          
            client.print(F("OFF"));
          }
          client.print(F("
Minutes Since LastReset: "));
          client.print(millis()/60000);
          client.print(F("
"));
          client.print(mydata.annoES);
          client.print(F("/"));
          client.print(mydata.meseES);
          client.print(F("/"));
          client.print(mydata.giornoES);
          client.print(F(" "));
          client.print(mydata.oraES);
          client.print(F(":"));
          client.print(mydata.minutiES);
          client.print(F(":"));
          client.print(mydata.secondiES);

          client.print(F("<h3> Log files:</h3>"));
          ListFiles(client, LS_SIZE);


        } 

        else if (strstr(clientline, "GET /?tmin=") != 0) {
          // recezione set point t min
          char *filename;
          filename = clientline + 11; // look after the "GET /?tmin=" (11 chars)
          // a little trick, look for the " HTTP/1.1" string and 
          // turn the first character of the substring into a 0 to clear it out.
          (strstr(clientline, " HTTP"))[0] = 0;
          // print the file we want
          Serial.print(F("Temperatura Minima Ricevuta: "));
          Serial.println(filename);
          int tminviaweb = atoi(filename);
          Serial.print(F("Atoi: "));
          Serial.println(tminviaweb);
          mydata.tminviawebES = tminviaweb;
          ET.sendData();
          Serial.println(F("Tmin Inviata"));
          mydata.tminviawebES = 0;
          client.println(F("HTTP/1.1 TMin Ok"));
          client.println(F("Content-Type: text/html"));
          client.println();
          client.println(F("Temperatura Minima Inviata"));

        }

        else if (strstr(clientline, "GET /?tmax=") != 0) {
          // recezione set point t max
          char *filename;
          filename = clientline + 11; // look after the "GET /?tmax=" (11 chars)
          // a little trick, look for the " HTTP/1.1" string and 
          // turn the first character of the substring into a 0 to clear it out.
          (strstr(clientline, " HTTP"))[0] = 0;
          // print the file we want
          Serial.print(F("Temperatura Massima Ricevuta: "));
          Serial.println(filename);
          int tmaxviaweb = atoi(filename);
          Serial.print(F("Atoi: "));
          Serial.println(tmaxviaweb); 
          mydata.tmaxviawebES = tmaxviaweb;
          ET.sendData();
          Serial.println(F("Tmax Inviata"));
          mydata.tmaxviawebES = 0;
          client.println(F("HTTP/1.1 TMin Ok"));
          client.println(F("Content-Type: text/html"));
          client.println();
          client.println(F("Temperatura Massima Inviata"));
        }

Ok, qualche piccolo passo avanti l'ho fatto.
Ho sistemato il pulsante invia e ridotto la dimensione del campo.
Lascerei perdere il menu a tendina perché ho visto che devo codificare tutte le opzioni e questo significa un sacco di codice in progmem che, a questo punto, preferisco evitare.

Mi rimangono due cose.
Sistemare quei cavolo di input sulla stessa riga del rispettivo set point
Ed aprire la pagina di conferma in un popup.

Idee?

client.print(F(" C
SetPoint Heater ON: "));      
          client.print(mydata.tSSRMinES);   // temperatura per accensione relé
          client.print(F(" C"));      
          client.print(F("<form method=GET>TMin:<input type=text name=tmin SIZE=1 ><input type=submit value=Invia></form>"));
          client.print(F("SetPoint Heater OFF: "));      
          client.print(mydata.tSSRMaxES);   // temperatura per spegnimento relé
          client.print(F(" C"));      
          client.print(F("<form method=GET>TMax:<input type=text name=tmax SIZE=1><input type=submit value=Invia></form>"));

Il comando Html , essendo un tag di sezione, crea un blocco all'interno della pagina, in altre parole porta a capo il cursore del flusso di scrittura html (in realtà aggiunge anche una riga vuota). Per risolvere il problema puoi scegliere una di queste due soluzioni:

a) (in CSS) trasforma il tag in uno inline aggiungendo al comando:

client.print(F("<form method=GET style='display:inline'>TMin:<input type=text name=tmin SIZE=1 ><input type=submit value=Invia></form>"));

e anche...

client.print(F("<form method=GET style='display:inline'>TMax:<input type=text name=tmax SIZE=1><input type=submit value=Invia></form>"));

in pratica devi aggiungere style='display:inline', in questo modo li vedrai sulla stessa riga...dove serve metti dei ritorni a capo (
)

b) (in HTML) crea una tabella di una riga e due colonne dove inserire i bottoni, con uno schema di questo tipo:

 <table>
    <tr>
       <td><form method=GET>TMin:<input type=text name=tmin SIZE=1 ><input type=submit value=Invia></form></td>
       <td><form method=GET>TMin:<input type=text name=tmin SIZE=1 ><input type=submit value=Invia></form></td>
   </tr>
 </table>

Ciao

Dalubar... perfetto :slight_smile:
Hai anche qualche suggerimento per fare aprire la pagina di risposta in un popup?
Io so farlo cliccando su un link html... ma non ho idea di come metterlo codificato in arduino.

Codice di input e codice di risposta a seguire:

 client.print(F(" C
SetPoint Accensione...: "));      
          client.print(mydata.tSSRMinES);   // temperatura per accensione relé
          client.print(F(" C"));      
          client.print(F("<form method=GET style='display:inline'> --- <input type=text name=tmin SIZE=1 ><input type=submit value=Invia></form>"));
          client.print(F("
SetPoint Spegnimento.: "));      
          client.print(mydata.tSSRMaxES);   // temperatura per spegnimento relé
          client.print(F(" C"));      
          client.print(F("<form method=GET style='display:inline'> --- <input type=text name=tmax SIZE=1><input type=submit value=Invia></form>"));
 else if (strstr(clientline, "GET /?tmin=") != 0) {
          // recezione set point t min
          char *filename;
          filename = clientline + 11; // look after the "GET /?tmin=" (11 chars)
          // a little trick, look for the " HTTP/1.1" string and 
          // turn the first character of the substring into a 0 to clear it out.
          (strstr(clientline, " HTTP"))[0] = 0;
          // print the file we want
          Serial.print(F("Temperatura Minima Ricevuta: "));
          Serial.println(filename);
          int tminviaweb = atoi(filename);
          Serial.print(F("Atoi: "));
          Serial.println(tminviaweb);
          mydata.tminviawebES = tminviaweb;
          ET.sendData();
          Serial.println(F("Tmin Inviata"));
          mydata.tminviawebES = 0;
          client.println(F("HTTP/1.1 TMin Ok"));
          client.println(F("Content-Type: text/html"));
          client.println();
          client.println(F("Temperatura Minima Inviata"));

        }

La soluzione più veloce (e indolore) che mi viene in mente è quella di aprire la pagina dei risultati tramite javascript facendo uso del metodo "open" dell'oggetto window, passando ad essa la richiesta GET diretta ad Arduino. Ovviamente, per fare ciò devi necessariamente rinunciare ai due form che avevi inserito. Questo perchè il pulsante Submit ha come effetto quello di chiudere la sessione di documento corrente e aprirne una nuova al momento in cui riceve i dati di risposta (non per niente si dice che il protocollo http "non ha stato").

Comunque, nella pratica, dovresti solo cambiare le righe:

 <form method=GET style='display:inline'> --- <input type=text name=tmin SIZE=1 ><input type=submit value=Invia></form>
  ...
 <form method=GET style='display:inline'> --- <input type=text name=tmax SIZE=1><input type=submit value=Invia></form>

in:

      <input type='button' value='Invia' onclick='window.open(\"ip_arduino?tmin=\" + document.getElementById(\"tmin\").value)' />
      <input type=text id='tmin' SIZE=1>
    ....
      <input type='button' value='Invia' onclick='window.open(\"ip_arduino?tmax=\" + document.getElementById(\"tmax\").value)' />
      <input type=text id='tmax' SIZE=1>

occhio alla sequenza " utilizzata per via del fatto che i comandi in realtà vanno scritti già dentro una funzione che usa gli apici: F(" ... ")
Se poi fai una minima ricerca su window.open ti accorgerai che possiede molteplici parametri per dimensionare la pagina a piacimento, renderla o meno dimensionabile, etc...

ip_arduino è ovviamente lo stesso che usi per contattare il micro quando accedi alla pagina principale.

Altre soluzioni farebbero necessariamente uso di metodologie più complesse (la cosa più naturale in questi casi è una "semplice" chiamata Ajax) che, per ovvie ragioni, non ti propongo neppure.

Ultima cosa...occhio agli apici, in questi casi sono sempre la principale causa di errore con conseguente non funzionamento.

Fammi sapere...se ti va.
Ciao.

scusa Daniela se intervengo su questo treadh, visto che tu stavi usando la libreria swRTC con aggiornamento via eth a server NTP, hai avuto occasione di verificare la data? mi confermi che il giorno calcolato è più avanti di uno?

ciao

@dalubar grazie. Domani mi leggo tutto con attenzione e provo, poi aggiorno :slight_smile:
@Pablos. Non sto usando la lib di leo (swRTC) ma questa qui: Google Code Archive - Long-term storage for Google Code Project Hosting.
Non ho errori di sincronizzazione, anzi, sono tarata al secondo con l'orologio del INRIM.
Se ti serve il codice che uso per ricevere il pacchetto NTP, convertirlo in TMEC e sincronizzare l'RTC dimmi in che thread ne state parlando che arrivo e pasto il codice :slight_smile:

Per sfizio e curiosità ho provato il codice...
Una semplice pagina di prova dimostrativa (stampa i valori delle porte analogiche), che risponde alla pressione di un bottone con una "popup" passando ad essa il valore di una casella di testo.

Puoi testarla all'indirizzo http://dalubar.homedns.org:62/ ma solo per oggi, poi il micro torna a fare quello che fa di solito...il programmatore ISP :slight_smile: Risponde direttamente Arduino.

Se ho capito bene ed è ciò che volevi allora hai già il codice disponibile copiandolo direttamente da "visualizza sorgente" (su FF) del browser...se invece dovessi avere problemi a contattare la pagina (per i problemi di blocco ben noti della shield ethernet) allora posto il codice direttamente qui.
Ciao

Molto bella e pulita come soluzione, anche se l'ho guardata dall'iphone quindi niente "veri" popup e non posso vedere il source code :slight_smile:
Stasera sono fuori a cena e torno tardi ma appena arrivo do un occhio da pc per vedere il codice.
Se poi hai gia tolto tutto te lo chiedo qui :stuck_out_tongue:

vi sto leggengo e visto che ci sono posto il sorgente dell'html di Dalubar :smiley:

<html><head><title>Prova</title></head><body bgcolor='#eeeeee'>
<h2>Elenco dei valori delle porte analogiche</h2>
<table width='400'>
<tr bgcolor="#ffeeaa" align=center><td>A0</td><td>A1</td><td>A2</td><td>A3</td><td>A4</td><td>A5</td></tr>
<tr style='border 1px dotted gray;' bgcolor='#abcdef'>
<td>275</td><td>255</td><td>234</td><td>290</td><td>352</td><td>436</td></tr>

<tr style='border 1px dotted gray;' bgcolor='#abcdef'>
<td>256</td><td>295</td><td>351</td><td>387</td><td>408</td><td>502</td></tr>
<tr style='border 1px dotted gray;' bgcolor='#abcdef'>
<td>444</td><td>418</td><td>416</td><td>348</td><td>255</td><td>241</td></tr>
<tr style='border 1px dotted gray;' bgcolor='#abcdef'>

<td>412</td><td>325</td><td>297</td><td>280</td><td>225</td><td>236</td></tr>
<tr style='border 1px dotted gray;' bgcolor='#abcdef'>
<td>239</td><td>240</td><td>252</td><td>361</td><td>386</td><td>432</td></tr>
<tr style='border 1px dotted gray;' bgcolor='#abcdef'>
<td>325</td><td>372</td><td>368</td><td>399</td><td>391</td><td>303</td></tr>

<tr style='border 1px dotted gray;' bgcolor='#abcdef'>
<td>409</td><td>419</td><td>327</td><td>268</td><td>255</td><td>166</td></tr>
<tr style='border 1px dotted gray;' bgcolor='#abcdef'>
<td>222</td><td>246</td><td>241</td><td>221</td><td>322</td><td>381</td></tr>
<tr style='border 1px dotted gray;' bgcolor='#abcdef'>

<td>207</td><td>241</td><td>330</td><td>350</td><td>386</td><td>491</td></tr>
<tr style='border 1px dotted gray;' bgcolor='#abcdef'>
<td>409</td><td>381</td><td>390</td><td>332</td><td>231</td><td>218</td></tr>
</table>
<input type='button' value='Invia' onclick='window.open("/?tmin=" + document.getElementById("tmin").value,"_blank","toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=yes, width=400, height=400, top=100, left=500")'>

<input type=text id='tmin' SIZE=3>
</body></html>

Ottimo...anche se in fondo credo che a Daniela servano solo queste righe, che posto direttamente nel codice di Arduino per comodo copia & incolla:

  // pulsanti per popup
  client.print(F("<input type='button' value='Invia' onclick='window.open(\"/?tmin=\" + document.getElementById(\"tmin\").value"));
  client.println(F(",\"_blank\",\"toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=yes, width=400, height=400, top=100, left=500\")'>"));
  client.println(F("<input type=text id='tmin' SIZE=3>"));

  // altre informazioni...

  client.print(F("<input type='button' value='Invia' onclick='window.open(\"/?tmax=\" + document.getElementById(\"tmax\").value"));
  client.println(F(",\"_blank\",\"toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=yes, width=400, height=400, top=100, left=500\")'>"));
  client.println(F("<input type=text id='tmax' SIZE=3>"));

e poi, nella parte mostrata dentro il popup, volendo si può aggiungere il pulsante di chiusura della finestra:

client.println(F("<hr/>"));
client.println(F("<input type='button' value='Chiudi finestra' onclick='self.close();'>"));

e con questo, credo dovrebbe bastare :slight_smile:

Eccomi ragazzi, scusate l'assenza ma ieri sera l'impepata di cozze ed oggi pomeriggio l'ikea... non sono riuscita a mettermi a lavoro prima d'adesso :
Allora, veniamo a noi.
Non ho fatto in tempo a vedere l'esempio pratico di dalubar su pc, quindi non so come era la resa finale.
Ma il codice l'ho implementato e funziona :slight_smile:
Ora... so di essere una rompicazzi, ma non era proprio proprio quello che avevo in mente.
Io pensavo al classico popup, quelli che per intenderci si aprono con javascript, il codice postato a me apre una nuova finestra, con alcuni parametri fissi.
Per certi versi non è male, però nella mia testa avevo in mente il classicissimo popup.
Sono talmente fusa che nemmeno riesco a trovare un esempio nel web, inizio a credere che forse nemmeno si usino più O_o
La cosa che più ci si avvicina è questo:

Crollo a letto che è meglio, domani cerco con più attenzione.

EDIT:
OHHH eccoli li ho trovati
http://wiki.openqa.org/display/WTR/JavaScript+Pop+Ups
i fratellini più brutti del popup di prima :slight_smile:
Domani mi leggo tutto e vediamo se riesco ad inserirli dentro.

Daniela, avevo capito perfettamente ciò che avevi in mente...ma ti dico subito che a parer mio è impossibile realizzarlo!
Non puoi, infatti, uscire da una pagina html e rientrare con una popup senza cancellare la parte sottostante.
Mi spiego meglio; anche se potresti in teoria far apparire il testo di risposta all'interno di una classica popup javascript (una "alert" per intenderci), è anche vero, però, che i nuovi dati in arrivo cancellerebbero inevitabilmente quelli precedenti, per cui ti ritroveresti con una popup su una pagina bianca...e non sarebbe carino :slight_smile:

La soluzione che ti ho proposto, a mio parere, è ciò che si può fare senza usare linguaggi come PHP o (soprattutto) Ajax... insomma, a misura di Arduino :slight_smile:
Ciao

dalubar:
Daniela, avevo capito perfettamente ciò che avevi in mente...ma ti dico subito che a parer mio è impossibile realizzarlo!

Chissà perché io ho la tendenza ad incaponirmi sulle cose impossibili da fare :
Vabbeh dai... se poi ci si riesce si è imparato qualcosa di nuovo :slight_smile:

Ho fatto un piccolo passo avanti.
Premo invio, mi si apre un popup, chiudo il popup e torno alla pagina principale.
Tutto molto bello se non fosse che ancora non ci siamo :smiley:

La fregatura sta qua:
Il popup è un alert in javascript, la query parte dopo e mettendo l'analisi della stringa prima della pagina principale riesco a tornare alla pagina principale con un goto.
Il problema sta nel fatto che da quel momento in poi la pagina principale mostra un address del tipo:
myIP/?tmin=miovalore e siccome la pagina principale ha un meta reload ogni 60 secondi, in pratica reinvia la GET ogni 60 secondi!
Se non ci fosse quell'indirizzo modificato, avremmo quasi risolto!
Che palle. Idee? :smiley:
Ma perché il browser si aspetta una risposta sul GET? non c'è un semplice invio e basta? :slight_smile:

 /*---------- WEB SERVER ------------*/
  //  /* //<---- PER ABILITARE/DISABILITARE IL WEB SERVER RIMUOVERE/COMMENTARE

  char clientline[BUFSIZ];
  int index = 0;

  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean current_line_is_blank = true;

    // reset the input buffer
    index = 0;

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        // If it isn't a new line, add the character to the buffer
        if (c != '\n' && c != '\r') {
          clientline[index] = c;
          index++;
          // are we too big for the buffer? start tossing out data
          if (index >= BUFSIZ)
            index = BUFSIZ -1;

          // continue to read more data!
          continue;
        }

        // got a \n or \r new line, which means the string is done
        clientline[index] = 0;

        // Print it out for debugging
        Serial.println(clientline);

        if (strstr(clientline, "GET /?tmin=") != 0) {
          // recezione set point t min
          char *filename;
          filename = clientline + 11; // look after the "GET /?tmin=" (11 chars)
          // a little trick, look for the " HTTP/1.1" string and 
          // turn the first character of the substring into a 0 to clear it out.
          (strstr(clientline, " HTTP"))[0] = 0;
          // print the file we want
          Serial.print(F("Temperatura Minima Ricevuta: "));
          Serial.println(filename);
          int tminviaweb = atoi(filename);
          Serial.print(F("Atoi: "));
          Serial.println(tminviaweb);
          mydata.tminviawebES = tminviaweb;
          ET.sendData();
          Serial.println(F("Tmin Inviata"));
          mydata.tminviawebES = 0;
          //client.println(F("HTTP/1.1 TMin Ok"));
          //client.println(F("Content-Type: text/html"));
          //client.println();
          //client.println(F("Temperatura Minima Inviata"));
          goto indexpage; 
        }

        if (strstr(clientline, "GET /?tmax=") != 0) {
          // recezione set point t max
          char *filename;
          filename = clientline + 11; // look after the "GET /?tmax=" (11 chars)
          // a little trick, look for the " HTTP/1.1" string and 
          // turn the first character of the substring into a 0 to clear it out.
          (strstr(clientline, " HTTP"))[0] = 0;
          // print the file we want
          Serial.print(F("Temperatura Massima Ricevuta: "));
          Serial.println(filename);
          int tmaxviaweb = atoi(filename);
          Serial.print(F("Atoi: "));
          Serial.println(tmaxviaweb); 
          mydata.tmaxviawebES = tmaxviaweb;
          ET.sendData();
          Serial.println(F("Tmax Inviata"));
          mydata.tmaxviawebES = 0;
          //client.println(F("HTTP/1.1 TMin Ok"));
          //client.println(F("Content-Type: text/html"));
          //client.println();
          //client.println(F("Temperatura Massima Inviata"));
          goto indexpage; 
        }

        // Look for substring such as a request to get the root file
        if (strstr(clientline, "GET / ") != 0) {
indexpage:
          // send a standard http response header
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println();

          // meta refresh page every 60 seconds
          client.print(F("<HEAD><meta http-equiv=\"refresh\" content=\"60\"><script type=\"text/javascript\">"));
          client.print(F("function show_alert() {alert (\"Inviare SetPoint?\");}"));
          client.print(F("</script><TITLE />GreenHouse Project Lan Page</title></head>"));

          // Creazione pagina web locale: 
 a capo <HR> a capo con separatore
          client.print(F("<body><h3>GreenHouse Project 0.5 Final R4d IDE 1.0</h3><HR>Temperatura OUT: "));
          client.print(mydata.toutES);
          client.print(F(" C
Umidita' OUT: "));
          client.print(mydata.houtES); 
          client.print(F(" %<HR>Temperatura IN: "));          
          client.print(mydata.tinES); 
          client.print(F(" C
Umidita' IN: ")); 
          client.print(mydata.hinES); 
          client.print(F(" %<HR>Temperatura H2O: "));
          client.print(mydata.T1ES); 
          client.print(F(" C
Luminosita': "));
          client.print(mydata.mediaHzES); 
          client.print(F(" Hz<HR>Temperatura Heater: "));          
          client.print(mydata.T2ES); 
          client.print(F(" C
SetPoint Accensione...: "));      
          client.print(mydata.tSSRMinES);   // temperatura per accensione relé
          client.print(F(" C"));      
          client.print(F("<form method=GET style='display:inline' onSubmit=\"show_alert()\"> --- <input type=text name=tmin SIZE=3 ><input type=submit value=Invia></form>"));
          client.print(F("
SetPoint Spegnimento.: "));      
          client.print(mydata.tSSRMaxES);   // temperatura per spegnimento relé
          client.print(F(" C"));      
          client.print(F("<form method=GET style='display:inline' onSubmit=\"show_alert()\"> --- <input type=text name=tmax SIZE=3><input type=submit value=Invia></form>"));
          client.print(F("
Heater Status: "));      
          if ( mydata.statusSSRES == 1 ) {  // mostra lo stato del riscaldatore
            client.print(F("ON")); 
          }
          else {          
            client.print(F("OFF"));
          }
          client.print(F("<HR>Pachube Connection: "));
          if ( pachubestatus == 1 ) {       // mostra lo stato della connessione a pachube
            client.print(F("ON
Pachube Response: "));
            client.print(rxbuffer);         // Se la connessione è riuscita mostra la risposta di pachube
          }
          else {          
            client.print(F("OFF"));
          }
          client.print(F("
Minutes Since LastReset: "));
          client.print(millis()/60000);
          client.print(F("
"));
          client.print(mydata.annoES);
          client.print(F("/"));
          client.print(mydata.meseES);
          client.print(F("/"));
          client.print(mydata.giornoES);
          client.print(F(" "));
          client.print(mydata.oraES);
          client.print(F(":"));
          client.print(mydata.minutiES);
          client.print(F(":"));
          client.print(mydata.secondiES);
    } 

        else if (strstr(clientline, "GET /") != 0) {
          // this time no space after the /, so a sub-file!
          char *filename;

          filename = clientline + 5; // look after the "GET /" (5 chars)
          // a little trick, look for the " HTTP/1.1" string and 
          // turn the first character of the substring into a 0 to clear it out.
          (strstr(clientline, " HTTP"))[0] = 0;

          // print the file we want
          Serial.println(filename);

          if (! file.open(&root, filename, O_READ)) {
            client.println(F("HTTP/1.1 404 Not Found"));
            client.println(F("Content-Type: text/html"));
            client.println();
            client.println(F("404 - Pagina Non Trovata"));
            break;
          }

          Serial.println(F("Opened!"));

          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/plain"));
          client.println();

          int16_t c;
          while ((c = file.read()) > 0) {
            // uncomment the serial to debug (slow!)
            // Serial.print((char)c);
            client.print((char)c);
          }
          file.close();
        } 
        else {
          // everything else is a 404
          client.println(F("HTTP/1.1 404 Not Found"));
          client.println(F("Content-Type: text/html"));
          client.println();
          client.println(F("404 - Pagina Non Trovata"));
        }
        break;
      }
}

Premo invio, mi si apre un popup, chiudo il popup e torno alla pagina principale.

Piccole considerazioni:
Cosi non fai altro che mostrare un semplice popup contentente un messaggio e basta. Io, invece, credevo che tu nel popup volessi visualizzare informazioni di risposta provenienti dalla stazione sulla base dei dati inviati (come ad esempio eventuali utilizzatori azionati, lettura di sensori, etc... che dipendessero dal comando o valore inserito); in altre parole pensavo al popup come ad un feedback attivo e non a un semplice messaggio, ed è per questo motivo che ti ho consigliato la window.open, che può essere "modellata" a piacimento per contenere una piccola finestra di dati...ma probabilmente avrò frainteso io.

Anche considerando il tuo caso, sarebbe però, a mio avviso, in ogni caso confortante ricevere dalla stazione il messaggio "Temperatura minima|massima ricevuta!" dato che questo rappresenterebbe la certezza che i dati sono stati realmente ricevuti, mentre il popup da te implementato non è altro che una semplice autorizzazione all'invio dei dati e nulla più.
E questa è una cosa completamente diversa :slight_smile:

A proposito di questo, se il messaggio Inviare SetPoint? è da considerarsi davvero come una domanda, nel senso che l'utente potrebbe anche rifiutarsi di procedere, allora ti consiglio di usare il comando confirm() al posto di alert(), così potrà decidere se inviarlo davvero:

client.print(F("function show_alert() {return confirm(\"Inviare SetPoint?\");}"));

Per quanto riguarda il problema dell'address, cosi come è strutturato il codice, al momento non saprei cosa consigliarti...
Spero comunque di esserti stato d'aiuto. :slight_smile:

dalubar:

Premo invio, mi si apre un popup, chiudo il popup e torno alla pagina principale.

Piccole considerazioni:
Cosi non fai altro che mostrare un semplice popup contentente un messaggio e basta. Io, invece, credevo che tu nel popup volessi visualizzare informazioni di risposta provenienti dalla stazione sulla base dei dati inviati (come ad esempio eventuali utilizzatori azionati, lettura di sensori, etc... che dipendessero dal comando o valore inserito); in altre parole pensavo al popup come ad un feedback attivo e non a un semplice messaggio, ed è per questo motivo che ti ho consigliato la window.open, che può essere "modellata" a piacimento per contenere una piccola finestra di dati...ma probabilmente avrò frainteso io.

No, assolutamente. Avevi capito giusto :slight_smile:
Quella è la mia intenzione, il resto sono solo prove nel frammezzo.
Il popup con js è solo un tentativo, comunque infruttuoso!

Anche considerando il tuo caso, sarebbe però, a mio avviso, in ogni caso confortante ricevere dalla stazione il messaggio "Temperatura minima|massima ricevuta!" dato che questo rappresenterebbe la certezza che i dati sono stati realmente ricevuti

Esattamente :slight_smile:
Ed a dirla tutta la conferma non è altro che una ridondanza inutile, visto che c'è già il tasto invia...
Poi detto tra me e te io mi accontenterei anche di premere "invia" e rimanere sulla stessa pagina, senza popup o finestre di conferma ma nemmeno nuove pagine.
Ma credo di capire che ad ogni GET che il browser invia deve tornare indietro qualcosa...

Per quanto riguarda il problema dell'address, cosi come è strutturato il codice, al momento non saprei cosa consigliarti...
Spero comunque di esserti stato d'aiuto. :slight_smile:

Io continuo a rifletterci... in ogni caso, fa sentire meno soli avere qualcuno che impiega un po' del suo tempo a darti retta, quindi grazie! :smiley:
Btw mi chiedevo:
Ma nei progetti di domotica, dove magari hai una pagina con cinque pulsanti on/off per le luci...
ad ogni pressione su questi pulsanti corrisponde l'apertura di una nuova finestra?
Sarebbe quantomeno sfiancante O_o

EDIT.
Ok... giusto per aggiornare... Io una soluzione l'avrei trovata :slight_smile:
Carico il link in un iframe all'interno della pagina.
L'home rimane inalterata, quando premo invio le risposte vengono caricate all'interno del frame ed al reload l'iframe si svuota.
Che ne pensi/pensate? E' tanto sporca come soluzione?
Ma soprattutto, tips per sistemare la grafica? Ho provato le impostazioni tipo frameborder ma probabilmente sbaglio la sintassi perché non vengono prese.
EDIT: grafica sistemata come da immagine :slight_smile: La conferma dell'invio appare come una normale riga in aggiunta. Al reload l'iframe si svuota e la riga è bianca.
Dai direi che non è male!! Molto meglio dell'idea iniziale del popup. Niente finestre in aggiunta, niente cose da chiudere. Ma un campo che si aggiorna e si svuota al reload in automatico.

Se vi vengono in mente idee migliori dell'iframe fatemi sapere, sennò direi che abbiamo decisamente risolto! :slight_smile:

        client.print(F("<form target=\"prova\" method=GET style='display:inline'> --- <input type=text name=tmin SIZE=3 ><input type=submit value=Invia></form>"));
          client.print(F("
SetPoint Spegnimento.: "));      
          client.print(mydata.tSSRMaxES);   // temperatura per spegnimento relé
          client.print(F(" C"));      
          client.print(F("<form target=\"prova\" method=GET style='display:inline'> --- <input type=text name=tmax SIZE=3><input type=submit value=Invia></form>"));
          client.print(F("
Heater Status: "));      
          if ( mydata.statusSSRES == 1 ) {  // mostra lo stato del riscaldatore
            client.print(F("ON")); 
          }
          else {          
            client.print(F("OFF"));
          }
          client.print(F("
<iframe name=prova src=\"\"  width=\"280\" height=\"20\" frameborder=0 marginwidth=0 marginheight=0></iframe>"));

stavo pensando la stessa cosa mentre leggevo il post precedente. Visto che la pagina la costruisci tu in codice quando ricevi un determinato get aggiungi una riga e al successivo refresh si aggiorna, io direi visto che funziona che è un'ottima soluzione :smiley:

Direi che è una buona soluzione, lasciando perdere l'originale idea di popup e finestre... :slight_smile:

Ma nei progetti di domotica, dove magari hai una pagina con cinque pulsanti on/off per le luci...
ad ogni pressione su questi pulsanti corrisponde l'apertura di una nuova finestra?
Sarebbe quantomeno sfiancante O_o

Nei progetti di domotica più "sostanziosi" di tipo web-oriented, tra le numerose soluzioni io preferisco sempre quella che vede un serverino dedicato come un EeeBox ASUS (appena 20W di consumo, piccolo e silenziosissimo) con dentro una distro Linux qualsiasi e l'inseparabile trittico Apache/Php/MySql (ma posso assicurare anche che regge senza difficoltà un'istanza di Oracle XE), il quale ospita l'intera applicazione web, e che scambia con Arduino solo i dati necessari relativi alle impostazioni e/o feedback in formato json o XML. In questo modo i dati ricevuti (a volte anche numerosi) vengono semplicemente "iniettati" nelle pagine dell'interfaccia utente, che non viene quindi quasi mai ricaricata, aumentando la velocità di risposta, diminuendo il traffico di rete e soprattutto risparmiando prezioso spazio dentro il micro che potrà essere dedicato alla "logica" implementativa.

dalubar:
Nei progetti di domotica più "sostanziosi" di tipo web-oriented, tra le numerose soluzioni io preferisco sempre quella che vede un serverino dedicato come un EeeBox ASUS

Ahh ho capito :slight_smile:
Volendo a questo punto non servirebbe nemmeno l'eth shield, un nodo centrale arduino potrebbe essere connesso via seriale/usb al pc.
Quando avrò una casa in campagna ed una serra seria... ci penserò!

@Mauro il problema non era tanto lato arduino, quanto lato browser... per ogni get il browser si aspetta una risposta di ritorno. E funzionando arduino anche come webserver se questa risposta non viene creata come pagina html il browser si ritrova un 404 oppure dice che il server non ha risposto.
La riga viene aggiunta dal browser, non lato arduino, in uno spazio creato da arduino :slight_smile:
In realtà la riga è sempre presente, non viene aggiunta alla bisogna, è una sorta di box vuoto in cui aprire altre pagine :slight_smile:

Cmq, ho finito adesso di formattare la pagina per l'iphone iframe incluso ed è tutto ok...
ergo abbiamo finito :slight_smile:
Grazie a tutti per l'aiuto!