Arduino rifà la setup

Salve a tutti,
Inizio dicendo che questo è il mio primo post e spero di averlo messo nella sezione giusta..
Sto implementando con arduino UNO un sistema di rilevazione delle presenze per delle attività extrascolastiche che utilizza la rfid shield e la wifi.
La rfid la utilizzo per rilevare quando un tag con un microchip viene utilizzato, mentre la wifi per poter impostare il progetto che viene svolto.. In questa maniera viene deciso a priori quale attività si sta svolgendo e poi verrano avvicinati i tag e verrano scritte su file le presenze..
Il mio problema è che mentre lo sviluppo con un portatile a scuola funziona.. Quando vado a casa invece e utilizzo il mio pc, appena viene impostato un progetto e inviati una request al server, arduino rifa la setup e il server smette di funzionare..

Benvenuto. :slight_smile:
Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum
e a leggere il regolamento: [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum

Il programma (sketch) è identico tra scuola e casa ? Non hai aggiunto nulla ?
Uno dei motivi principali e più diffusi per un reset (causa software) di Arduino è l'esaurimento della SRAM.

P.S. cambia il titolo, autoreset è un'altra cosa. Scrivi "Arduino si resetta da solo" o qualcosa del genere

Ne hanno appena parlato in un altro post.

Se apri la seriale Arduino (non tutti i modelli) si resetta.
Le soluzioni le trovi qui...

gpb01:
... allora devi imparare a fare le ricerche ... ]:smiley: ]:smiley: ]:smiley:

  1. Se ne parla QUI

  2. se ne parla QUI

  3. se ne parla approfonditamente QUI

e, come se non bastasse, nel Playground QUI

Potrebbe anche essere un problema di alimentazione.

Perfetto, grazie mille :slight_smile: Appena disporrò di un condensatore vi farò sapere se funziona o meno.. Ma tuttavia una cosa non mi è chiara.. Avevo provato a fare anche io una ricerca, ma sinceramente non pensavo che il problema fosse quello: perchè a scuola funziona perfettamente e non si autoresettava mai?

(io la seriale la aprivo solo subito dopo il caricamento dello sketch e lo ricaricavo ogni volta)
Grazie ancora della pazienza e scusate la mia ignoranza:)

Per me l'autoreset (che è una cosa ben precisa su Arduino) non c'entra nulla, altrimenti dovrebbe accadere anche scuola.
Parere mio, ovvio. Magari mi sbaglio.

Chiedo venia, ho fatto caso solo ora che consigliavi di cambiare il titolo, in effetti non sapevo come chiamarlo, perchè leggevo in giro dell'autoreset ma non mi sembrava proprio il mio caso. Magari però mi sbaglio. Il problema è che è un po' di tempo che cerco di trovare una soluzione, ma non saprei nemmeno quale potrebbe essere la causa di tutto (non so se possa essere influente ma la versione dell'ide è la 1.0.2).

Il problema non dovrebbe dipendere dall'IDE utilizzato però se scarichi l'ultimo, il 1.0.5-r2 è meglio
--> http://arduino.cc/en/Main/Software

Puoi scrivere qui il tuo sketch? (per vedere come fare guarda il punto 7 del regolamento --> [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum)

Metto il codice come allegato perchè supera i caratteri massimi consentiti. La parte in cui si gestisce la modalità nel senso di impostarla potrebbe essere sbagliata; a mio malgrado non ho quella precedente, in ogni caso il problema a casa persisteva ancora prima di aggiungerla.
Comunque la libreria WiFi putroppo dalla version 1.0.3 compresa in poi mi dava dei problemi e facendo una ricerca sul web dicevano di fare un downgrade alla 1.0.2 e così infatti funzionava correttamente.
Vi ringrazio

Wifi_NOSD.ino (10.9 KB)

Compilando con la 1.5.6r2 mi da

Lo sketch usa 20.484 byte (63%) dello spazio disponibile per i programmi. Il massimo è 32.256 byte.
Le variabili globali usano 1.607 byte (78%) di memoria dinamica, lasciando altri 441 byte liberi per le variabili locali. Il massimo è 2.048 byte.
Poca memoria disponibile, potrebbero verificarsi problemi di stabilità

Il 78% è altino.

Inserendo la funzione F scendi al 56%

Lo sketch usa 20.588 byte (63%) dello spazio disponibile per i programmi. Il massimo è 32.256 byte.
Le variabili globali usano 1.161 byte (56%) di memoria dinamica, lasciando altri 887 byte liberi per le variabili locali. Il massimo è 2.048 byte.

WiFi_NOSD_whit_F.ino (11 KB)

Ora sembra funzionare, fantastico, grazie mille! :slight_smile:
Però saresti così gentile, se lo sai chiaramente, da portermi spiegare perchè a scuola non mi dava lo stesso errore? Voglio dire la RAM usata dal programma non è la stessa?

Sto implementando con arduino UNO un sistema di rilevazione delle presenze per delle attività extrascolastiche che utilizza la rfid shield e la wifi.

come hai detto tu.... attivita' extrascolastiche, quindi visto che sei fuori da scuola Arduino sta' lavorando a pieno ritmo e le risorse non gli bastano

Ho eseguito gli stessi test a casa e a scuola.

Dubito che tra scuola e casa hai la stessa situazione. Già la rete di casa e quella di scuola sarà diversa ?!?
I router saranno diversi ?

Si beh certamente la situazione è diversa.. Ma il fatto è che con il mio pc a scuola non funzionava mentre con quello che ho scuola sempre a scuola funzionava.. E' questo che non mi torna

Mi sono accorto che le lib arduino, mettono a disposizione la funzione malloc(...) e realloc(....) che servono rispettivamente a riservare la ram ad una variabile, ed a liberarla... per le stringhe ti consiglio di usarle... almeno così liberi spazio in ram... considera che quello che passi come stringa, verrà mantenuto in ram... quindi all'esaurimento della ram, il micro si resetta! in piu al posto di usare interi, usa uint8_t / uint16_t / uint32_t / uint64_t in base a quello che devi fare...

GalaxyHD96:
quindi all'esaurimento della ram, il micro si resetta!

Non è detto.
All'esaurimento della RAM il micro ha un comportamento imprevedibile.
Di solito però si pianta più che resettarsi, almeno che non sia attivo il WatchDog.
Comunque usando la funzione F() ha liberato moltissima memoria. Quindi un blocco per memoria esaurita adesso è meno probabile.

GalaxyHD96:
Mi sono accorto che le lib arduino, mettono a disposizione la funzione malloc(...) e realloc(....) che servono rispettivamente a riservare la ram ad una variabile, ed a liberarla... per le stringhe ti consiglio di usarle... almeno così liberi spazio in ram... considera che quello che passi come stringa, verrà mantenuto in ram... quindi all'esaurimento della ram, il micro si resetta! in piu al posto di usare interi, usa uint8_t / uint16_t / uint32_t / uint64_t in base a quello che devi fare...

Un consiglio, non "giocate" con l'allocazione dinamica della memoria in un micro con 2 soli KB di RAM. Si corre seriamente il rischio di mandarlo in crash con poco. L'oggetto String, difatti, è uno dei principali artefici dei problemi di esaurimento della memoria. Creare a runtime stringhe corpose porta un'elevata frammentazione della memoria e non è detto che distruggere l'oggetto libera RAM.
Esempio: se hai una stringa di 10 caratteri, poi un'altra di 12, se distruggi la prima e ne crei una terza di 20 caratteri, questa stringa andrà a posizionarsi dopo la seconda perché i 10 caratteri iniziali non bastano a contenerla. E nella RAM non ci stanno solo gli oggetti dinamici ma TUTTI i dati, compreso lo stack, le variabili statiche ecc... Anche i messaggi di testo che si mettono nei Serial.print vengono prima copiati in RAM, per questo è stata aggiunta la funzione F() che permette di leggere le stringhe costanti direttamente dalla Flash.

Ah, grazie, non lo sapevo nemmeno io :slight_smile:
Tuttavia non mi si è spiegato perchè a scuola non avevo il problema..

Se usi 2 computer differenti, potrebbe essere un problema di alimentazione, come qualcuno ti ha suggerito. Non tutte le schede madri forniscono la stessa quantità di corrente sulle porte USB.

E allora perchè riducendo la quantità di RAM usata tramite la funzione F funziona? Mi spiego, fosse stato un problema di alimentazione non sarebbe dovuto persistere? (ho provato con piu di un pc a casa e non funzionava ottenendo sempre lo stesso risultato, e anche alimentando tramite una batteria)