Ciao a tutti,
vengo a esporre subito il mio dubbio, premetto che non si tratta di un codice che non funziona, anzi ho usato il mio codice per parecchio tempo di lavoro senza inghippi.
Quello che io faccio nel loop: leggo dei dati, apro un file, scrivo, lo chiudo. E così una volta al secondo.
La sua obiezione era che da qualche parte ha letto che usare continuativamente open e close può portare a problemi con la scheda (è comunque vero che lui lavora a diversi hertz a quanto ho capito) e che sarebbe meglio usare il flush dopo i vari myFile.print per scrivere effettivamente nella scheda, senza aprire e chiudere il file ogni volta.
Anche il flush scrive i dati sulla Flash della SD, per cui non vedo tanta differenza rispetto ad un open/close.
Il consiglio mio è quello di aprire un file solo quando effettivamente ci devi scrivere sopra e poi chiuderlo non appena i dati sono stati salvati, a meno che non si tratti di salvare dati a piccoli intervalli (dell'ordine di pochi secondi). Altro consiglio è quello di limitare le scritture, salvando i dati in memoria e fare un'unica scrittura di un blocco dati.
Quindi con un datalogger come diresti di fare? salvarli in un buffer e scriverli una volta ogni tanto? Io di fatto scrivo una volta a secondo che è la velocità con cui il gps mi manda un nuovo dato
PS: ti faccio anche una domanda che non c'entra con questo
Per letture analogiche del tiny85: analogRead(numero di ADC)? giusto?
va vista l'intervallo tra 2 letture, se devi fare un salvataggio ogni pochi secondi conviene andare di flush, se devi fare un salvataggio all'ora conviene aprire e poi chiudere il file;
sui Tiny85 il core Tiny mappa i pin sono mappati secondo lo schema che trovi nel file /hardware/tiny/cores/tiny/pins_arduino.c
Ho fatto un copia-e-incolla di quello che c'era nel file originale, non ho minimamente pensato alla questione dei PWM.
A dire il vero, avevo già 1 anno fa fatto notare all'autore del core l'incoerenza di quello schema ma nonci pensavo più e non ho fatto caso che a distanza di tutto questo tempo ancora non abbia aggiornato quello schema. Farò una pull request su Github.
Ho un po' pensato e ho cercato di capire come funzionano le funzioni:
Se non ho capito male:
.print(data): teoricamente scrive sulla SD in realtà però non salva realmente i dati sulla SD
.flush(): salva i dati sulla SD
.close(): come flush e chiude anche il file
Fin'ora io ho salvato una volta a secondo aprendo e chiudendo il file quando mi arrivava un file valido dal GPS.
Ora però ho bisogno di salvare con una frequenza più alta, diciamo 50Hz. open-close non va più bene, quindi pensavo che potrei lavorare così:
nel setup scelgo il nome e apro il file
ad ogni loop uso solo il file.print
dentro alla funzione del GPS che si attiva una volta al secondo salvo a tutti gli effetti.
A questo punto le domande:
cambia qualcosa se uso il flush dentro a tale funzione e poi inserisco un tasto per attivare un file.close, oppure se faccio direttamente un close (seguito da open) dentro a tale funzione?
va bene un approccio del genere o comunque salvare a 1hz è troppo?
In relazione a ciò: io uso il timerinterrupt (ho un mega uso i timer che non tocca nessuna libreria ne funzione tempo -mi pare timer1, ma non ho il sorgente sotto mano), è possibile usare anche una funzione attachInterrupt (purchè non sia un pin relativo allo stesso timer)?
Esiste un buffer, quando scrivi dei dati in realtà finiscono in questo buffer, che viene scritto o quando è pieno oppure quando tu esplicitamente chiami un flush. Se chiudi il file, il flush viene fatto in automatico.
Scrivere però troppe volte non fa bene alla flash. Le flash hanno un ciclo di vita di 10K scritture, poi saltano le celle. Non so se ti conviene scrivere con questi ritmi.