ciao a tutti ho fatto un datalogger. Leggo una termocoppia (con un moduletto cinese con MAX6675) e la invio (1 campione al secondo) su una microSD. Aggiungo anche la data con una RTD DS1307. Il file txt contiene quindi ora e temperatura.
Il sistema funziona egregiamente. Ma ho notato un problema stranissimo.
Se faccio acquisizioni di poche ore (3-4) non ho nessun problema. Ma se acquisisco per un tempo abbastanza lungo (8-10 ore) trovo quasi sempre la sd danneggiata, nel senso che vedo molti file che non sono file (hanno nomi con caratteri strani e non sono apribili). Ho anche provato a scrivere ogni tot su file piccoli. Succede la stessa cosa: se scrivo per molto tempo, ad un certo punto succede qualcosa per cui nella sd trovo file danneggiati. Con questo secondo metodo, della moltitudine di file, solo una parte risulta danneggiata.
Non capisco perchè.
Ho aggiunto un condensatore da 10uF sull'alimentazione del modulo, ipotizzando un problema di alimentazione. Ho provato anche a scrivere ogni 10 secondi, ma il risultato è uguale.
La sintassi che uso è del tipo:
if (dataFile) {
dataFile.println("tempo;temperatura");
dataFile.flush();
dataFile.close();
}
Purtroppo non ho esperienze a riguardo pero' ti posso dare indicazioni su come affronterei io il problema
Per cominciare la libreria SD non e' molto robusta, notoriamente
E nemmeno le schede stesse lo sono
Cambia scheda, formattare una nuova con tool di formattazione adatti, non format di Windows
Usa file system fat16
E questa e' la parte propedeutica
Adesso passiamo alla "ciccia"
Potrebbe essere la libreria che gestisce il file system ad essere un npo' povera
Solitamente questi programmi sono scritti dichiarando gli oggetti nel preambolo, globali quindi
Inizializzati nella setup() e usati nella loop()
Se vanno in overflow o simili c'e' li teniamo cosi' fino al reset
Prova a spostare le dichiarazioni di oggetti dal preambolo alla loop, scrivere una loop lunga e ogni tanto uscirne; questo dovrebbe far rilasciare tutti gli oggetti e re-inizializzarne di nuovi e "vergini" da errori od overflow
Se la cosa ti da difficolta' posta il programma completo che provo ad aiutarti
Mmmm ... io posso solo dirti che ho realizzato vari logger GPS che salvano per ore ed ore la posizione su SD e non ho mai avuto problemi, ma ...
uso un solo file per accensione (il nome è legato al giorno dell'inizio registrazione).
controllo all'inizio se esiste o meno, se non esiste lo creo
lo apro, scrivo aggiungendo una riga e lo chiudo ogni tot secondi.
Da quello che descrivi potrebbe essere benissimo che usi male la memoria e quindi, per poche ore va bene, sulla lunga si corrompe e da li in poi ci sono problemi ...
... su che Arduino sei?
... fai uso della classe String?
Come dice Ducembarr, vedere il codice aiuterebbe ...
Uso formattare la scheda con Windows (FAT32). Però a sentimento direi che non sia un problema di file system... Però proverò come dici (anche se il problema è che per fare il test e vedere i risultati devo aspettare altre 10 ore...)
Probabilmente è questo il problema. Io non sono un programmatore, uso arduino come DAQ economico (e flessibile) per fare alcuni test in lab. Però non so ottimizzare il codice (anzi... non so scriverlo per bene...)
Uso spezzettare il loop() in funzioni che via via richiamo.
Ero partito usando un unico file ma dopo 9-10 ore viene corrotto, per cui perdo tutti i dati. Ho pensato allora di scrivere per tot tempo su file incrementali (60 campioni per file). In questo modo speravo di memorizzare almeno le prime n ore. Invece succede a volte che su 10 ore di funzionamento mi ritrovo con i file delle ultime 7 ore, perdendo le prime ore. Non capisco perchè.
Stamattina ho provato a memorizzare i dati su un buffer per poi scriverlo sulla SD. Ma vedo che l'arduino si riavvia... Probabilmente il codice funziona male.
Secondo me è questo il problema!
Arduino UNO rev3
Sì, scrivo un'unica stringa tipo "tempo\ttemperatura" (uso il tab).
Il fatto che l'hardware si riavvii potrebbe essere causato anche dal software? Pensavo fosse solo un problema hardware.
Il codice è abbastanza lungo (più di 300 righe). Lo posto più tardi.
Arduino UNO R3 ha pochissima SRAM, già la SD se ne mangia parecchia, per cui ... DEVI eliminare l'uso della classe String ed utilizzare le stringhe classiche del 'C' (char array) manipolandole con le funzioni che trovi in string.h che sono SEMPRE disponibili in Arduino.