Sto costruendo un data logger, con sensore dht, mpl115a2, gps/gsm shield e sd shield.
Quando compilo il primo sketch (pre_final3_at), ho il seguente output (tutto ok):
CONTROLLO COMUNICAZIONE MODULI IN CORSO
Modulo DHT: OK
Modulo MPL115A2: OK
Modulo GSM/GPS: OK
Reset del GPS in corso, 60 secondi
Attivazione del GPS in corso, 180 secondi
Per una rapida verifica io farei così: usa la funzione freeRam() (cercala qui o con google, ce ne sono diverse), e prova ad usare la macro F() per tutte le stringhe literal che hai.
con lo sketch che funziona esce un 325 mentre con l'altro, dove ho aggiunto l'sd esce questo (tra l'altro si resetta dato che il controllo dei moduli deve avvenire una sola volta):
--368
Modulo DHT: OK
-368
Modulo DHT: OK
-368
Modulo DHT: OK
Quindi l'SD va a saturare gli ultimi byte di Ram ?
la seconda versione occupa meno RAM perché la stringa non viene letta nella RAM prima di essere "stampata", ma viene prelevata direttamente dalla PROGMEM.
Effettua questa modifica su tutte le stringhe "literal", come ho detto prima, e vedi se non si riavvia più.
Il riavvio del micro è un indicatore abbastanza certo di un problema di esaurimento RAM.
Non credo risolverai con una mega .... ma tu e skosso siete la stessa persona?
perchè guarda caso il tuo sketch ha le stesse variabili di quelle di skosso che ha pubblicato ieri
Si la SD prende un bel po' di ram, soprattutto in lettura e scrittura infatti nel mio progetto ho dovuto abolirla per quanto riguarda il logger, per il caricamento all'avvio del sistema e per gli aggiornamenti dei dati va bene.
Puoi provare con una mega, ma se pensi di espandere lo sketch ti ritroverai come me di nuovo con dei limiti.
Dovresti rivedere se tutte quelle matrici pubbliche le puoi spostare o passare tra le varie funzioni, verificare se gli int non superano i 255 e cambiarli in byte, alcune variabili dichiarale const se non variano .... ma soprattutto i serialprint lunghi danno un sacco di problemi. Studiare le librerie e vedere se puoi fare dei tagli, insomma rivederle. Tu attualmente stai occupando circa 290byte di variabili tutto il resto sta nelle librerie e nei tuoi messaggi seriali.
Arduino con il suo atmel sarebbe valido come strumento, ma pecca su librerie di funzionamento che hanno un po' di difetti, queste non sono ottimizzate per lavorare in simbiosi con molte altre, ciascun utente si inventa la lib usando più risorse di quelle che servono solo perchè a lui serviva quella, senza pensare che possono servirne anche altre nell'intero progetto... prendi ad esempio la libreria UDP per aggiornare i time dai server NTP, perchè mi mette una matrice da 255 byte quando il messaggio non supera i 16 byte (ma siii stiamo larghi non si sa mai), perchè molti nelle lib mettono int o long quando per certo le cifre non arrivveranno mai oltre il byte?
La morale è prendi anche 1terabyte, ma i programmatori dovrebbero pensare di più quando inventano e pubblicano librerie e sketch apparentemente formidabili.
@leo72: per consumo statico intendo quanto pesa tutto lo sketch ?
@pablos: non so ancora lavorare a livello di libreria, cioè scomporle per capire dove migliorare/tagliare, ma avevo pensato pure io che queste librerie non sono molto ottimizzate, ma non al livello della tua spiegazione ;).
Ora, secondo voi con la Mega risolvo tutti i problemi o mi conviene usare un altro Arduino Uno al solo scopo di salvare i dati sulla sd e trasmettere ?
Ovvero nell'Arduino UNO #1 monto i sensori ed il gps/gsm shield, nell'Arduino UNO #2 monto l'sd shield e il trasmettitore, quindi collego il #1 al #2 che provvederà alla memorizzazione ?
Esattamente, dove si trova avr-size ?
Per quanto riguarda il Macintosh, entro su Arduino.app > Contents > Resources > Java e qua ho tutto il programma (cartella librerie, example, reference, etc etc) ma non riesco a trovare ave-size !
Invece ho trovato il file .hex che vi allego !
Invece per quanto riguarda Petit ora vedo come implementare questa libreria su arduino !
anerDev:
Esattamente, dove si trova avr-size ?
Per quanto riguarda il Macintosh, entro su Arduino.app > Contents > Resources > Java e qua ho tutto il programma (cartella librerie, example, reference, etc etc) ma non riesco a trovare ave-size !
Non conosco il Mac.
Però se attivi la compilazione "verbose" (File/Preferenze) poi nella finestra dell'IDE in basso vedi il percorso da dove vengono richiamati i vari comandi, così trovi anche avr-size.
Invece ho trovato il file .hex che vi allego !
Non l'hai allegato
Invece per quanto riguarda Petit ora vedo come implementare questa libreria su arduino !
Grazie
Basta copiarla in /sketchbook/libraries (o per lo meno così mi par di ricordare, è passato 1 anno da quando l'ho usata)
Non conosco il Mac.
Però se attivi la compilazione "verbose" (File/Preferenze) poi nella finestra dell'IDE in basso vedi il percorso da dove vengono richiamati i vari comandi, così trovi anche avr-size.
/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avr-g++ ? può essere ?
Nella cartella hardware/tools avevo trovato una cartella ave, ma non c'era nessun accenno ad "avr-size" però nel verbose output viene molte volte ripetuto quel percorso !
Per si e per no ecco tutti i tool che si trovano nella cartella bin (gli eseguibili) contenuti nella cartella avr:
ar c++ g++ gccbug ld objcopy ranlib
as cpp gcc gcov nm objdump strip
Non l'hai allegato
Ancora devo smaltire i vari danni del capodanno ! hahua or al'ho allegato
Basta copiarla in /sketchbook/libraries (o per lo meno così mi par di ricordare, è passato 1 anno da quando l'ho usata)
importato ! Ma non trovo nessun sketch similar .ino ! ora googlo un pò per vedere cosa trovo
anerDev:
/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avr-g++ ? può essere ?
Lo devi avere, fa parte della toolchain. Deve stare in quel percorso.
Se dai /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avr-size cosa risponde il terminale?
importato ! Ma non trovo nessun sketch similar .ino ! ora googlo un pò per vedere cosa trovo
Hai scaricato questo?
Prova allora a fare così: crei in /sketchbook/libraries una cartella denominata pff (ho visto che il file header della lib si chiama pff.h) e poi scompattaci dentro tutti i file di quell'archivio. Poi crea uno sketch e prova a mettere #include "pff.h" e vedi se ti da errore.
...ricordando di chiudere tutte le finestre dell'IDE e di rilanciarlo dopo aver scompattato i file. Se "installi" una libreria mentre è avviato, non la "vede" fino al riavvio del programma.
Lo devi avere, fa parte della toolchain. Deve stare in quel percorso.
Se dai /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avr-size cosa risponde il terminale?
/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avr-size: 'a.out': No such file
yes ! Ho estratto la cartella "src" l'ho rinominata in pff ed esce:
/Applications/Arduino.app/Contents/Resources/Java/libraries/pff/diskio.c:48: error: conflicting types for 'disk_writep'
/Applications/Arduino.app/Contents/Resources/Java/libraries/pff/diskio.h:28: error: previous declaration of 'disk_writep' was here
La riga 48 corrisponde a questo:
DRESULT disk_writep (
BYTE* buff, /* Pointer to the data to be written, NULL:Initiate/Finalize write operation */
DWORD sc /* Sector number (LBA) or Number of bytes to send */
)
mentre la riga 28 del diskio.h:
DRESULT disk_writep (const BYTE*, DWORD);
...ricordando di chiudere tutte le finestre dell'IDE e di rilanciarlo dopo aver scompattato i file. Se "installi" una libreria mentre è avviato, non la "vede" fino al riavvio del programma.