Pages: [1] 2   Go Down
Author Topic: WEB SERVER-PROBLEMI CON LA ETHERNET SHIELD  (Read 887 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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! 
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20281
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

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!!
Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 2231
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
- 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)..   smiley-roll
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2758
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Galliate (NO) Italia
Offline Offline
Full Member
***
Karma: 0
Posts: 180
Sviluppo sistemi software PLC/DCS/SCADA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

- progetto gestione antigelo caldaia: http://sites.google.com/site/circuitiarduino/home/antigelo-caldaia
--- dettaglio sketch + download progetto/libreria: http://sites.google.com/site/circuitiarduino/home/antigelo-caldaia/sketch
--- server ArduinoUNO_test: http://home-galliate.dyndns.org:81/ (collegate per il test solo le sonde di temperatura esterna/ambiente)

spero di esserti stato utile smiley

saluti
kattivik76
« Last Edit: November 22, 2011, 06:12:59 pm by kattivik76 » Logged

kattivik76
Sviluppo e realizzazione  Progetti Arduino
Teamspeack -> Arduino.cc -> 79.38.142.178:9987

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2758
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Galliate (NO) Italia
Offline Offline
Full Member
***
Karma: 0
Posts: 180
Sviluppo sistemi software PLC/DCS/SCADA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
Logged

kattivik76
Sviluppo e realizzazione  Progetti Arduino
Teamspeack -> Arduino.cc -> 79.38.142.178:9987

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2758
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
- 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  smiley-sad specie se apro il sinottico da smartphone.

ciao
« Last Edit: November 23, 2011, 04:32:06 am by pablos71 » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

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

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:
Code:
#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?! smiley-roll-sweat
Logged

Milan, Italy
Offline Offline
Sr. Member
****
Karma: 0
Posts: 329
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Negli header manca
Content-Type: text/html
Logged


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

@bigjohnson:

pur inserendo all'interno dell'header di risposta al server :
Code:
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:
Code:
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!! smiley-roll
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2758
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

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

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!
Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 2231
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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: <script type="text/javascript">)
Logged

Pages: [1] 2   Go Up
Jump to: