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?
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.
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
Qualche interessante spunto lo potresti prendere da qui : Wjsonduino ...
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
@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
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
È 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
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.
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.
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.
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