Pages: [1]   Go Down
Author Topic: pagina web+sd+arduino ethernet  (Read 732 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao a tutti, vi pongo il mio problema:

Ho la necessità di creare una pagina web e renderla accessibile ad un determinato indirizzo, non ho riscontrato problemi scrivendo il codice all'interno del programma da caricare sull'arduino.
La pagina inizia web inizia a diventare abbastanza pesante quindi cercando in rete ho trovato la soluzione dell sd.
Mi sono letto tutte le discussioni ma nn sono riuscito a risolvere il problema.

Sto cercando di capire come funziona, ho scritto due righe in html che ho inserito in un file chiamato index.htm sulla sd

Code:
<form>
<input type=button>
</form>

il programma che ho caricato in arduino invece è il seguente(preso dalla guida di Mauro Alfieri, con un paio di modifiche a causa di errori nella compilazione, tipo la parola BYTE):

Code:
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1, 177 };
File htmlFile;
EthernetServer server(80);
 
void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();
  if (!SD.begin(4)) { return; }
}
 
void loop()
{
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
 
          htmlFile = SD.open("index.htm");
          if (htmlFile) {
            while (htmlFile.available()) {
                client.println(htmlFile.read());
            }
            // close the file:
            htmlFile.close();
          }
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}

collego l'arduino, vado all'indirizzo 192.168.1.177 e al posto della pagina web mi escono una sequenza di numeri tipo:
60 102 111 114 109 62 10 60 105 110 112 117 116 32 116 121 112 101 61 98 117 116 116 111 110 62 10 60 47 102 111 114 109 62 10

qualche suggerimento/idea?? grazie mille
Logged

Pontecagnano (SA)
Offline Offline
Newbie
*
Karma: 0
Posts: 35
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao

ho avuto un problema simile facendo una cosa simile alla tua.
mi sembra che possa essere problema del file  index.htm ,
editalo e puliscilo bene anche degli spazi.

Prova a non richiamare il file htm e vedi se ti fa lo stesso.
« Last Edit: April 04, 2012, 08:46:35 am by pines » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao

ho avuto un problema simile facendo una cosa simile alla tua.
mi sembra che possa essere problema del file  index.htm ,
editalo e puliscilo bene anche degli spazi.

Prova a non richiamare il file htm e vedi se ti fa lo stesso.

ciao, intatto grazie per esserti interessato!

ho provato a rinominare il file, a cambiare estensione e a non metterla.

se metto html non lo legge ed esce una pagina vuota, se se non la metto o metto htm esce sempre una sequenza di numeri!
Logged

Pontecagnano (SA)
Offline Offline
Newbie
*
Karma: 0
Posts: 35
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se non richiami la pagina htm ed esce una pagina vuota, dipende dal file.
Editalo con blocco note e togli i carattteri che non hai scritto tu.
Come ti ho scritto ho avuto lo stesso problema ed era un problema del file htm.

Ciao
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se non richiami la pagina htm ed esce una pagina vuota, dipende dal file.
Editalo con blocco note e togli i carattteri che non hai scritto tu.
Come ti ho scritto ho avuto lo stesso problema ed era un problema del file htm.

Ciao

La pagina htm è formata solamente dal codice che ho scritto, nient'altro!

Se lancio la pagina htm da boswer parte, se scrivo il contenuto della pagina direttamente nell codice di arduino funziona, non riesco proprio a capire!
Logged

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sto facendo esattamente la stessa cosa e quello che ho imparato è che arduino legge i file con formato 8.3 cioè 8 caratteri per il nome e 3 per l'estensione; ti consiglio di rinominare così il file che contiene il codice html.

Inoltre prova a cambiare il codice da così:
Code:
while (htmlFile.available()) {
     client.println(htmlFile.read());
}

a così:
Code:
           
String html;
while (htmlFile.available()) {
                char c=htmlFile.read();
                html.concat(c);
}
client.println(html);
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sto facendo esattamente la stessa cosa e quello che ho imparato è che arduino legge i file con formato 8.3 cioè 8 caratteri per il nome e 3 per l'estensione; ti consiglio di rinominare così il file che contiene il codice html.

Inoltre prova a cambiare il codice da così:
Code:
while (htmlFile.available()) {
     client.println(htmlFile.read());
}

a così:
Code:
           
String html;
while (htmlFile.available()) {
                char c=htmlFile.read();
                html.concat(c);
}
client.println(html);

dopo molte prove sono riuscito a far funzionare qualcosa e a trarre delle conclusioni!

1- il codice deve essere cambiato, infatti nel primo caso non funziona mentre nel secondo si
2- il nome del file non deve essere per forza di 8 caratteri
3- ogni volta che si modifica il file html, e quindi si toglie e si rimette la sd, l'arduino deve essere resettato

intanto grazie mille per l'aiuto!

ora si presenta un altro problema, ovvero, del file html caricato sulla sd vengono lette solamente alcune righe;
connettendomi all'indirizzo 192.168.1.177 la pagina si carica, però parzialemente, solo alcuni elementi, e poi se vado a vedere il codice sorgente a un certo punto a caso si interrompe. qualche idea??
« Last Edit: April 05, 2012, 09:35:20 am by simon_e » Logged

Malo ( VI )
Offline Offline
Sr. Member
****
Karma: 0
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
while (htmlFile.available()) {
     client.println(htmlFile.read());
}
io cambierei questo
client.print(htmlFile.read());
I CR LF nei file html non servono a niente
per andare a capo ci vuole il <br>
Questo funziona
Code:
          htmlFile = SD.open(FileToOpen);
          if (htmlFile) {
            while (htmlFile.available()) {
                x = (htmlFile.read());
                client.print(char(x));               
                //Serial.print(char(x));
            } // fine while           
            htmlFile.close(); // close the file:

x e' definito come byte
Era una mia esigenza vedere un carattere alla volta sul monitor seriale
Io sono passato da Shield Ethernet a Arduino Ethernet ed ho qualche intoppo ma come sopra e' rimasto attivo oltre 500 ore e controllavo la pagina Web almeno una volta al giorno
« Last Edit: April 05, 2012, 09:48:52 am by brunol949 » Logged

Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
while (htmlFile.available()) {
     client.println(htmlFile.read());
}
io cambierei questo
client.print(htmlFile.read());
I CR LF nei file html non servono a niente
per andare a capo ci vuole il <br>
Questo funziona
Code:
          htmlFile = SD.open(FileToOpen);
          if (htmlFile) {
            while (htmlFile.available()) {
                x = (htmlFile.read());
                client.print(char(x));               
                //Serial.print(char(x));
            } // fine while           
            htmlFile.close(); // close the file:

x e' definito come byte
Era una mia esigenza vedere un carattere alla volta sul monitor seriale
Io sono passato da Shield Ethernet a Arduino Ethernet ed ho qualche intoppo ma come sopra e' rimasto attivo oltre 500 ore e controllavo la pagina Web almeno una volta al giorno

yessss!! con questo codice ho risolto tutti i problemi! la pagina si carica e va alla grande!! grazie mille!
Logged

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Io invece non riesco a risolvere.
Ho necessità di avere tutta la pagina html in una stringa usando questo codice:

Code:
String readHtmlPage(char* fileName){
  String form = "";
  File myFile;   
    myFile = SD.open(fileName,FILE_READ);
  if (myFile) {
    while (myFile.available()) {
        byte c = (myFile.read());
    form.concat(char(c));
    Serial.print(char(c));
    }
  } else {
  // if the file didn't open, print an error:
    Serial.println("Errore aprendo il file");
  }         
  myFile.close();
    Serial.println(form);
  return form;
}
ottendo che:

  • Serial.print(char(c)); - mi restituisce tutto il contenuto del file.
  • Serial.println(form); - non contiene tutto il contenuto del file.

Come se il concat non funzioni o si perda qualche carattere.

Mi potete aiutare?
Grazie
Logged


Malo ( VI )
Offline Offline
Sr. Member
****
Karma: 0
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Io invece non riesco a risolvere.
Secondo me e' sbagliata la posizione dove dichiari String form
Prova a dichiararlo in testa al file prima del void setup

Adesso non posso ripescare il Post ma non molto tempo addietro , mi pare Leo72 , mi erudi' sulla dichiarazione delle variabili .
In breve ...
Se tu dichiari una variabile all'interno di una if o un for , la variabile sara' valida solo li
Trovato --- smiley  http://arduino.cc/forum/index.php/topic,94024.0.html
Leggi li' e forse capisci il motivo
Logged

Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il discorso della visibilità delle variabili mi è chiaro.
Secondo me il problema è nella lunghezza della stringa che Arduino gestisce fino ad un certo punto (problema di memoria).

Infatti, inviando al client una riga per volta funziona.

Se sbaglio correggetemi pure.
Logged


Malo ( VI )
Offline Offline
Sr. Member
****
Karma: 0
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Infatti, inviando al client una riga per volta funziona.
Quando fai
Serial.print(char(c));
Stampi un carattere all volta

Non mi pare che tu abbia inserito un controllo sul \r \n come riferimento per l'invio
Per scrivere una riga alla volta dovresti usare form.endsWith(string2) dove string2 rappresenta i caratteri che per te sono i terminatori di riga
Dopo di che stampi form e lo cancelli per "riempirlo" con la riga successiva

Secondo me se la stringa fosse troppo lunga manderesti in crash Arduino
Logged

Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bè quel codice ormai è vecchio.
Non è detto che se arrivo al limite della stringa arduino va in crash. Magari si ferma dove arriva e va avanti.
Logged


Pages: [1]   Go Up
Jump to: