WEB SERVER-PROBLEMI CON LA ETHERNET SHIELD

Salve a tutti,
il mio problema concerne la creazione di una interfaccia web all'interno della quale dovrei visualizzare i dati relativi ad alcuni sensori.
Scrivo quindi il mio sketch,utilizzando per la realizzazione della pagina anche codice javascript,e lo carico in Arduino,utilizzando 1/3 della
memoria disponibile.
Solo che quando cerco di connettermi al server accadono eventi che non riesco a spiegarmi:

  • la pagina non viene caricata oppure
    -mi viene richiesto di scaricare un file di testo(che contiene il mio codice html).
    Dopo qualche giorno di prova/riprova ho scoperto che dipende dalla dimensione della pagina ma anche qui in maniera strana:
    -se la dimensione non supera una certa dimensione(non so come è calcolata),riesco a visualizzare tutto correttamente:
    E' come se la classe client() (che utilizzo per inviare le istruzioni al server: client.print("istruzione"))
    avesse un certo buffer all'interno del quale memorizza le istruzioni che dovrà poi "scrivere" sul server,quindi superata la lunghezza del buffer,tutto il resto venga ignorato,con la conseguenza che la pagina non viene caricata!
    Questa è solo una mia ipotesi!Spero che qualcuno di voi possa aiutarmi!!!!
    Grazie in anticipo a tutti!

Quale Arduino usi?
Dalla descrizione dell'errore "casuale" mi suggerisce che é un problema di RAM; che stai usando piú ram di quella che il ATmega ha.
Ciao Uwe

Utilizzo una scheda Arduino Uno.
Bhè quando carico il programma,la memoria utilizzata è circa 1/3 di quella disponibile.
Anche io ho pensato ad un problema di memoria,ma memoria allocata dinamicamente durante l'esecuzione
del programma,ecco perchè mi chiedevo se la classe client non avesse un buffer, con una dimensione massima allocabile.
Tuttavia,se così fosse si potrebbe risolvere il problema con una SD?
Grazie per la risposta!!

  • la pagina non viene caricata oppure
    -mi viene richiesto di scaricare un file di testo(che contiene il mio codice html).
    Dopo qualche giorno di prova/riprova ho scoperto che dipende dalla dimensione della pagina ma anche qui in maniera strana:
    -se la dimensione non supera una certa dimensione(non so come è calcolata),riesco a visualizzare tutto correttamente:

se posti il codice che utilizzi sarà più facile aiutarti.

Per esempio, il fatto che ti proponga di scaricare la pagina invece di visualizzarla, potrebbe essere banalmente la mancata o errata dichiarazione del content type (text/html).. :roll_eyes:

Con una sd puo fare belle cosette, pagine html, interfacci i dati verso o da arduino con una libreria Jquery usando a piacimento post, get, put, ti fai i tuo script in js indipendenti dalla memoria limitata senza impegnare troppo Arduino. Poi tutto dipende da cosa vuoi fare.

Ciao

Manu89:
Salve a tutti,
il mio problema concerne la creazione di una interfaccia web all'interno della quale dovrei visualizzare i dati relativi ad alcuni sensori.
Scrivo quindi il mio sketch,utilizzando per la realizzazione della pagina anche codice javascript,e lo carico in Arduino,utilizzando 1/3 della
memoria disponibile.
Solo che quando cerco di connettermi al server accadono eventi che non riesco a spiegarmi:

  • la pagina non viene caricata oppure
    -mi viene richiesto di scaricare un file di testo(che contiene il mio codice html).
    Dopo qualche giorno di prova/riprova ho scoperto che dipende dalla dimensione della pagina ma anche qui in maniera strana:
    -se la dimensione non supera una certa dimensione(non so come è calcolata),riesco a visualizzare tutto correttamente:
    E' come se la classe client() (che utilizzo per inviare le istruzioni al server: client.print("istruzione"))
    avesse un certo buffer all'interno del quale memorizza le istruzioni che dovrà poi "scrivere" sul server,quindi superata la lunghezza del buffer,tutto il resto venga ignorato,con la conseguenza che la pagina non viene caricata!
    Questa è solo una mia ipotesi!Spero che qualcuno di voi possa aiutarmi!!!!
    Grazie in anticipo a tutti!

ciao,

se non ho capito male usi PRAGMA "codice pagina html + java + ecc.." utilizzando la memoria interna di ArduinoUNO, all'inizio della realizzazione del mio progetto avevo pensato anch'io di utilizzare tale metodologia, ma poi l'ho trovata particolarmente scomoda, complessa, limitante (niente immagini)...

cercando sul forum e chiedendo un po' in giro, mi è stata consigliata la libreria WebduinoSD, tale libreria mette a disposizione le pagine web contenute sulla uSD dello shield Ethernet così come progettate, ad esempio, con Dreamveawer.

di seguito troverai il link al progetto che sto ottimizzando, il link degli sketch realizzati (in calce alla pagina troverai tutto il progetto downloadabile, compreso la libreria WebduinoSD) ed il link del server ArduinoUNO in fase di test nel caso tu voglia verificarne il comportamento.

link su arduino.cc della discussione per la realizzazione dell'interfaccia grafica + comunicazione verso e da arduino: http://arduino.cc/forum/index.php/topic,61424.0.html

spero di esserti stato utile :slight_smile:

saluti
kattivik76

@kattivik nel tuo progetto non vedo file js che usino GET o POST... come gestisci i dati nelle pagine html? nemmeno script js ... o mi sono perso qualcosa?

ciao

pablos71:
@kattivik nel tuo progetto non vedo file js che usino GET o POST... come gestisci i dati nelle pagine html? nemmeno script js ... o mi sono perso qualcosa?

ciao

ciao,

eseguo una sostituzione dei marker (@A, @B, @C, ecc) contenuti nella pagina, prima che quest'ultima venga passata al client, il prossimo upgrade del progetto sarà:

  • implementazione di una connessione persistente per l'aggiornamento dei dati di pagina.
  • implementazione del refresh dei soli dati di pagina senza aggiornare l'intera pagina, es utilizzando la libreria JQuery.
  • implementazione del calcolo di linearizzazione degli ingressi analogici direttamente in pagina web, in modo tale da passare alla pagina i valori provenienti dal campo senza "affaticare" arduino con calcoli in float o double.
  • pulizia del codice inerente alla sostituzione dei marker (che occupa parecchio spazio in KB)
  • implementazione di un datalogger su file csv/txt su uSD ciclato ogni X tempo (es. un log di tutte le misure ogni ora)

saluti
kattivik76

  • implementazione di una connessione persistente per l'aggiornamento dei dati di pagina.
  • implementazione del refresh dei soli dati di pagina senza aggiornare l'intera pagina, es utilizzando la libreria JQuery.
  • implementazione del calcolo di linearizzazione degli ingressi analogici direttamente in pagina web, in modo tale da passare alla pagina i valori provenienti dal campo senza "affaticare" arduino con calcoli in float o double.
  • pulizia del codice inerente alla sostituzione dei marker (che occupa parecchio spazio in KB)
  • implementazione di un datalogger su file csv/txt su uSD ciclato ogni X tempo (es. un log di tutte le misure ogni ora)

tutto questo già lo faccio senza refresh in tempo reale, leggo e modifico anche i file da remoto js, html, log presenti nella sd, ma credo che nel tuo progetto più che implementare lo devi rifare da capo. Anche il tuo sistema non è male, nel mio progetto che è persistente, inviare tutti i dati ogni 400 millisec, mi ciuccia circa 1mega al minuto e non sono pochi :frowning: specie se apro il sinottico da smartphone.

ciao

Ciao,
innanzi tutto grazie per le risposte!!
Mi rendo conto di essere stato molto vago nel primo post,quindi cerco di rettificare un po le cose:
-l'interfaccia web che sto creando è un'interfaccia di controllo/monitoraggio dei segnali provenienti da sensori.
In particolare dovrò acquisire un certo numero di campioni del segnale per poi ricostruirlo,quindi plottarne l'andamento(la forma d'onda);
per questo motivo sto utilizzando javascript,in particolare jQuery.
Tuttavia come qualcuno ha suggerito sarebbe meglio postare il codice.Allo scopo per focalizzare l'attenzione sul mio problema,ho creato questo codice che rappresenta una soluzione semplificata di un modulo del mio programma:

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

byte mac[]={0x90,0xA2,0xDA,0x00,0x77,0x6B};
byte ip[]={192,168,1,177};

Server server(80);

void rispondi(Client obj);
void web_page(Client obj);


void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac,ip);
  server.begin();
}

void loop()
{
  char buffer[4];
  Client client=server.available();
  if(client)
  {
    while(client.available())
    {
      TextFinder trova(client);
      trova.getString("","/",buffer,sizeof(buffer));
      if(strcmp(buffer,"GET")==0)
      {
        rispondi(client);
        web_page(client);
    
      }
    }
  }
 
  
  client.stop();
}


void rispondi(Client obj)
{
  obj.println("HTTP/1.1 200 OK");
  obj.println();
}

void web_page(Client obj)
{ 
  
 obj.println("<html>");
  obj.println("<head>");
     obj.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>");
     obj.println("<title>Flot Examples</title>");
     obj.println("<script language='javascript' type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js'></script>");
     obj.println("<script language='javascript' type='text/javascript' src='http://flot.googlecode.com/svn/trunk/jquery.flot.js'></script>");
     obj.println("<script language='javascript' type='text/javascript' src='http://flot.googlecode.com/svn/trunk/jquery.flot.selection.js'></script>");
  obj.println("</head><body><h1>Flot Examples</h1><div style='float:left'><div id='placeholder' style='width:500px;height:300px'>"); 
  obj.println("</div></div><div id='miniature' style='float:left;margin-left:20px'>");
  obj.println("<div id='overview' style='width:166px;height:100px'></div><p id='overviewLegend' style='margin-left:10px'></p>");
  obj.println("</div>");
 obj.println( " <script id='source'>$(function () { " );
  
 obj.println("function getData(x1, x2) {var d = [];for (var i = 0; i <= 100; ++i) {var x = x1 + i * (x2 - x1) / 100;");
 obj.println("d.push([x, Math.sin(x * Math.sin(x))]); }return [{ label: 'sin(x sin(x))', data: d }];}var options = {");
 obj.println("legend: { show: false },series: {lines: { show: true },points: { show: true }},yaxis: { ticks: 10 },selection: { mode: 'xy' }");
 obj.println("};var startData = getData(0, 3 * Math.PI);");
 obj.println("var opt = {legend: { show: true, container: $('#overviewLegend') },");
 obj.println("selection : {mode: 'xy'},xaxis: { ticks:4}, yaxis: { ticks: 3 , min: -2, max: 2}, series: { shadowSize: 0 } } ;");
 obj.println("var plot = $.plot($('#placeholder'), startData, options);");
 
 
obj.println("var overview = $.plot($('#overview'), startData,opt);"); 


/********************** INSERIRE IL RESTO COME COMMENTO PER VISUALIZZARE LA PAGINA **** */ 
obj.println("$('#placeholder').bind('plotselected', function (event, ranges) {"); 
     
        obj.println("if (ranges.xaxis.to - ranges.xaxis.from < 0.00001)"); 
            obj.println("ranges.xaxis.to = ranges.xaxis.from + 0.00001;"); 
        obj.println("if (ranges.yaxis.to - ranges.yaxis.from < 0.00001)"); 
            obj.println("ranges.yaxis.to = ranges.yaxis.from + 0.00001;"); 
        
     
		
        obj.println("plot = $.plot($('#placeholder'), getData(ranges.xaxis.from,ranges.xaxis.to),"); 
                  obj.println("$.extend(true,{},options,{"); 
                  obj.println("xaxis: { min: ranges.xaxis.from, max: ranges.xaxis.to },"); 
                  obj.println("yaxis: { min: ranges.yaxis.from, max: ranges.yaxis.to }"); 
                      obj.println("})"); 		
			obj.println(");");    
        
        
        obj.println("overview.setSelection(ranges, true);");  
    obj.println("});"); 
    
    
    obj.println("$('#overview').bind('plotselected', function (event, ranges) {"); 
         obj.println("plot.setSelection(ranges);"); 		
		
    obj.println("});");  

/* *********************** FINE COMMENTO ******* */


obj.println("});"); 
 
 obj.print("</script>");
 obj.print("</body></html>");
 
}

Per poter visualizzare la pagina,si deve "tagliare" un po di codice, quindi vi ho
inserito due commenti per indicare la parte che va oscurata!

Come vi spieghereste questo comportamento?! :cold_sweat:

Negli header manca

Content-Type: text/html

@bigjohnson:

pur inserendo all'interno dell'header di risposta al server :

void rispondi(Client obj)
{
  obj.println("HTTP/1.1 200 OK");
  obj.println("Content-Type: text/html"); 
  obj.println("Content-Script-Type: text/javascript");
  obj.println();
}

oppure:

void rispondi(Client obj)
{
  obj.println("HTTP/1.1 200 OK");
  obj.println("Content-Type: text/html"); 
  obj.println();
}

non riesco comunque a visualizzare la pagina tranne se ne oscuro
la parte che ho indicato nel post precedente.

Tu sei riuscito a visualizzarlo?
Mi sa che mi sto perdendo qualkosa!! :roll_eyes:

io vedo 2 grafici uno piu' grande e uno piu' piccolo

Pablos71:
in effetti è proprio quello che si dovrebbe vedere.Ma riesci a visualizzare la pagina senza oscurare la parte
che ho indicato nel post precedente.O meglio se selezioni una zona con il mouse nei grafici
riesci a riprodurre l'effetto zoom?
Perchè non riesco proprio a capire cosa non vada!!!
Grazie x la risposta!

Manu89,
anche io vedo quel che dice pablos71.
La questione è che lasciando il codice intatto, non viene visualizzata correttamente la pagina, ovvero si vede il codice html e nella parte superiore della pagina compare una parte in particolare del codice.

Una prima domanda mooooolto base:
questo codice lo hai verificato su di una normale pagina html, prima di metterlo in arduino?

Sarò poi della vecchia scuola, ma per lo script js io specificherei il type...
(es: )

pitusso,
certo che l'ho provata,solo che caricando l'interfaccia in arduino sono iniziati i problemi,così,
ho smembrato il codice in modo da trovare l'anello debole e a quanto pare lo script non viene
caricato correttamente.
Cmq anche la soluzione di specificare il tipo di script all'interno del tag non porta ad
un diverso risultato..
Il fatto è che anche caricando un'altra interfaccia(che poi dovrà essere complementare a questa)
ho notato che se dichiaro un numero elevato di identificativi per i tag(# nome) la pagina non
viene caricata,mentre se effettuo una dichiarazione inline mediante il tag style la pagina viene caricata
correttamente.
Tutto questo mi riporta alla domanda iniziale ,quindi, che voi sappiate la classe client() prima di inviare
al server i dati, li memorizza in un buffer(che ha quindi una dimensione limitata),compromettendo
quindi il caricamento della pagina dovuto al fatto che parte del codice viene ignorato?

Salve a tutti,
avendo assodato che il mio problema è la scarsa memoria a disposizione(-.-),
volevo chiedervi se qulkuno ha già provato ad usare una scheda SD per la
memorizzazione di web pages e js scripts !
Inoltre quale SD mi consigliate?!
thanks a lot!!