dimensione massima ram per utilizzo stringhe

Ciao
Domanda: è normale che arduino dopo una serie di println per stampare una pagina web comincia ad avere comportamenti strani? (Tipo..rele che commutano senza avr avuto un esplicito consenso)? La pagina ha in tutto 6 bottoni inseriti in una table 3x2.
Ci sono delle restrizioni che non conosco?

Grazie.

Eleonora.

Eleonora27:
...
Ci sono delle restrizioni che non conosco?
...

Se hai Arduino Uno considera che in tutto hai 2 KB di RAM e che a riempirli .. ci vuole un attimo ... specie giocando con le pagine web :grin:

Guglielmo

P.S. : Se pubblichi il codice magari gli si può dare un'occhiata ... :wink:

gpb01:

Eleonora27:
...
Ci sono delle restrizioni che non conosco?
...

Se hai Arduino Uno considera che in tutto hai 2 KB di RAM e che a riempirli .. ci vuole un attimo ... specie giocando con le pagine web :grin:

Guglielmo

P.S. : Se pubblichi il codice magari gli si può dare un'occhiata ... :wink:

Ciao Gugliemo, grazie per la disponibilità.

Ecco il codice e si, ho arduino UNO:

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<html>");
          client.println("<head>");
          
          client.println("<meta http-equiv=\"content-type\" content=\"application/xhtml+xml\"/>");
          client.println("<meta http-equiv=\"cache-control\" content=\"max-age=300\" />  ");
          client.println("<meta name=\"viewport\" content=\"initial-scale=1.0; user-scalable=no; minimum-scale=1.0; maximum-scale=1.0;\" /> ");
          client.println("<meta name=\"format-detection\" content=\"telephone=no\" /> ");
          client.println("<meta name=\"HandheldFriendly\" content=\"true\" /> ");
          client.println("<meta name=\"MobileOptimized\" content=\"240\" /> ");
          
          
          client.println("<title>Webserver</title>");
          client.println("<style>");
          client.println("body { font-family: Arial, sans-serif; font-size:16px;}");
          client.println("</style>");
          client.println("</head>");
          client.println("<body bgcolor=\"#E6E6FA\">");
          client.println("<div style='width:360px; height:360px;'>");
          client.println("<h1>Webserver </h1>");
          client.println("<table align=\"center\"><tr><td>");
          client.println("<form action=\"./?1-on\" method=\"POST\"><button type=\"submit\">azione 1</button>
</form>");
          client.println("</td><td></td></tr><tr><td>");
          client.println("<form action=\"./?2-on\" method=\"POST\"><button type=\"submit\">azione 2</button>
</form>");
          client.println("</td><td>");
          client.println("<form action=\"./?2-off\" method=\"POST\"><button type=\"submit\">azione 3</button>
</form>");
          client.println("<td></tr><tr><td>");
          client.println("<form action=\"./?3-on\" method=\"POST\"><button type=\"submit\">azione v4</button>
</form>");
          client.println("</td><td>");
          client.println("<form action=\"./?3-off\" method=\"POST\"><button type=\"submit\">azione 5</button>
</form>");
          client.println("</td></tr></table>");
          
     
          
          if (digitalRead(3))
          {  
            client.print("<font color='green'>Spento</font>");
          }
          else
          {
            client.print("<font color='red'>Acceso</font>");
          }
          client.println("<hr>");
          client.println("</div>");
          client.println("</body>");
          client.println("</html>");
          break;

Stavo pensando di separare il tutto con un frontend applicativo (webserver con raspberry) perche le pagine web andranno a complicarsi..
Grazie.
Eleonora.

Come ha anticipato Guglielmo, la ram è solo 2K.
Si può fare in modo di "spostare" quelle frasi nella memoria del programma, ma se le pagine saranno tante, puoi (scondo me) o mettere le pagine su una schedina SD e le carichi da quella memoria, oppure deleghi la gestione web a Raspy.

La ram esaurita da stringhe provoca un crash e arduino smette di funzionare. Quelle linee non possono saturare la ram, bisognerebbe vedere cosa hai dichiarato nelle var pubbliche.
C'è quasi sicuramente un evento nello sketch che da consensi non autorizzati, quello che hai postato non è sufficiente per dirti di più.
Puoi ottimizzare la ram con l'uso di flash .... client.println(F(“Hello World”)) purchè la stringa inviata sia priva di variabili diverse da costanti.

ciao

Si, se le pagine andranno ad aumentare ed a complicarsi, direi che il suggerimento di nid69ita è da prende in considerazione ... memorizzi le varie pagine su scheda SD e mano mano che ti servono le prendi da li :wink:

Qualche interessante spunto lo potresti prendere da qui : Wjsonduino ...

Guglielmo

Quelle linee non possono saturare la ram, impegnano la mem una alla volta e il massimo che occupa la linea più lunga è circa 110 byte. Bisogna vedere quale impiego ha fatto prima di usare il client, vedere se svuota il buffer ecc. Quando la ram è piena non ci sono cose strane, si inchioda tutto :frowning:

ciao

@pablos, credo che quel codice sia solo parziale, non ha messo tutto lo sketch.
Di sicuro se le pagine si complicheranno i 2K li finirà anche usando la F()

Effettivamente però se esaurisci la ram Arduino dovrebbe riavviarsi, mi sembra.
Forse sarebbe meglio avere lo sketch completo, e anche lo schema dei collegamenti elettrici. Il problema di rele che si attivano in maniera strana potrebbe non essere l'esaurimento di ram.

nid69ita:
Effettivamente però se esaurisci la ram Arduino dovrebbe riavviarsi, mi sembra.

Gli effetti dipendono da come la RAM esaurita colpisce lo sketch. Ad esempio sui display LCD la prima cosa che si nota è l'apparizione di caratteri senza senso: questo deriva dal fatto che l'Arduino va a "pescare" in locazioni della memoria che non sono quelle che aspetta il programma. Va "fuori indice".
Se poi i dati devono essere elaborati od altro gli effetti possono essere i più disparati, come l'azionamento di uscite non volute fino al reset, dipende da cosa quei dati fanno fare al programma.

nid69ita:
Forse sarebbe meglio avere lo sketch completo

e io che dissi :slight_smile:

pablos:
quello che hai postato non è sufficiente per dirti di più.

nid69ita:
Effettivamente però se esaurisci la ram Arduino dovrebbe riavviarsi, mi sembra.

No, non si riavvia, magari fosse così intelligente ... purtroppo ci sono passato anch'io sul problema ram esaurita da stringhe e ci vuole un bel mattone prima di compromettere l'MCU.

Comunque aspettiamo, nulla è escluso, ma secondo me il comportamento strano non è causato da quei clientprint, basandomi sul pezzo di codice postato

ciao

pablos:

nid69ita:
Forse sarebbe meglio avere lo sketch completo

e io che dissi :slight_smile:

pablos:
quello che hai postato non è sufficiente per dirti di più.

Era un rafforzativo :grin:

XD XD rafforziamoci!!

È un estratto del codice. Ora non ho il resto sottomano, ma giusto per anticiparvi vi dico che subito dopo quei client.print ci sono una serie di if basati su indexof del method post dei vari bottoni. Esempio
Azione uno -? if indexof(post /? 1-on) attiva relè 1.

Vi posso dire che questo scherzetto..ovvero i 3 relè vengono commutati senza un consenso voluto me lo fa sul primo caricamento della pagina...senza neanche aver cliccato un bottone...bypassa le condizioni di tutti gli If

La ram del micro dell'Arduino è fatta come puoi vedere a pag. 18 del datasheet che puoi trovare al link http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet.pdf

In pratica, quando dichieri una variabile, questa viene inserita in ram a partire dal fondo e le successive vendono inserite sopra (da qui il nome stack - pila). Come puoi vedere c'è una parte della ram chiamata I/O registers, quelli sono tutti i registri del micro, compreso l'immagine delle uscite. Se la ram si esaurisce vai a scrivere su quei registri e il micro attiva le uscite in funzione di quanto c'è scritto in quella porzione di memoria, quindi inizia a fare cose imprevedibili.

Queste problematiche si dovrebbero risolvere con il nuovo Arduino YUN. Spostando su di esso la gestione delle pagine Web e lasciando la UNO solo per la gestione degli I/O digitali. :grin:

Non sapevo di questo Arduino YUN... :fearful: :fearful: :fearful: E' fantastico, finalmente potremo sperare di risolvere i fatidici crash della ethernet...

Disponibilità di questo prodotto? A quando ?

Eleonora27:
Disponibilità di questo prodotto? A quando ?

Qui trovi l'annuncio e tutte le info : http://blog.arduino.cc/2013/05/18/welcome-arduino-yun-the-first-member-of-a-series-of-wifi-products-combining-arduino-with-linux/

Hai comunque dato un occhiata a questo progetto : Wjsonduino ? ... perché credo che ti aiuterebbe ...

Guglielmo

PaoloP:
Queste problematiche si dovrebbero risolvere con il nuovo Arduino YUN. Spostando su di esso la gestione delle pagine Web e lasciando la UNO solo per la gestione degli I/O digitali. :grin:

Ho un web server con pagine su sd online da 5 mesi (utilizza socket ed è in beta test, fa aggiornamenti in tempi quasi reali) e non si è ancora inchiodato, lo tormento tutti i giorni da più ip pubblici, ciò non toglie che possono fare tutte le schede che vogliono, ma un 16 Mhz per scopi del genere sono troppo pochi, il sistema è lento e poco soddisfacente.

ciao

infatti la youn in realtà è un micro ARM con una distribuzione linux, che si interfaccia con l'arsuino... in poche parole è come se colleghazzi via seriale un rasperry+pennina wifi ad un arduino, con un programmino sul rasp che legge dalla seriale i comandi AT per configurare i dati del wifi+richieste di connessione, dopodichè fa semplicemente "da ponte" tra i dati inviate e ricevuti.

Inzomma, se prendessi una yun la userei come stand-alone più che come shield