SD error code

Ciao a tutti,
cortesemente se mi potete aiutare su un problema nella scrittura di un file su SD, in pratica dopo un certo numero di scrittura il file viene corrotto, o in alcuni casi ricevo un messaggio di errore "error code: 0x6", non c'è una costante nell'errore, a volte capita dopo pochi minuti, a volte dopo diverse ore. Ho provato anche a cambiare la modalità SPI sostituire la SD sia di formato che di produttore.

questo è il codice

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SdFat.h>

#define ONE_WIRE_BUS 2

// SD chip select pin
const uint8_t chipSelect = 10;

SdFat sd;

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer;

unsigned long timeWait;		
int numInterval;
char ID[] = "12345";


void setup(void)
{  
  Serial.begin(19200);  
  
  sensors.begin();
  if (!sensors.getAddress(insideThermometer, 0))
     Serial.println("Unable to find address for Device 0"); 
        
  Serial.print("Init SD card...");  
  
  if (!sd.begin(chipSelect,SPI_HALF_SPEED)) { //oppure SPI_SIXTEENTH_SPEED
    sd.initErrorHalt();
   	Serial.print("error \n"); 
   
  } else {  
	Serial.print("ok \n"); 
  }
  
  numInterval = 4;
  timeWait = 120;
  
}

void GetDataLog()
{	         
        byte nlog = 1;       
		
	do {		
	  delay(timeWait*1000);  
	   
	  ofstream sdlog("datalog.txt", ios::out | ios::app);				   
			
	  sdlog << ID << "|" <<  getTemp() << endl;                  
			
	  if (!sdlog) 
	    sd.errorHalt("append failed");
             
          Serial.print(ID);Serial.println(getTemp());          
	} while(nlog++ < numInterval);		
}

float getTemp()
{  	
         sensors.requestTemperatures(); 
		 		 
         return sensors.getTempC(insideThermometer);         
}


void loop(void)
{      
  GetDataLog();  
   	
	/*GPRS
	invio log...
	*/    
}

la schield SD è posta sopra a quella del GPRS

grazie

dopo l'errore hai provato a mettere la schedina nel pc?
durante la scrittura di dati non salta mai l'alimentazione?

Non sono sicuro, ma in qualche altro post avevo letto che non è sicuro tenere il file aperto in scrittura senza mai chiuderlo.
Mi sembra che nel tuo codice non chiudi mai il file.

Quando metto la scheda nel pc, il file è illegibile, l'unico modo è riformattare la sd. Ho fatto le prove con un alimentare, e non ho mai visto sbalzi ma il risultato è lo stesso.

nid69ita:
Non sono sicuro, ma in qualche altro post avevo letto che non è sicuro tenere il file aperto in scrittura senza mai chiuderlo.
Mi sembra che nel tuo codice non chiudi mai il file.

ok, ho aggiunto al codice

sdlog.close();

faccio qualche prova e vediamo come va

Chiuderlo è sempre meglio, così svuoti anche il buffer.
Oppure puoi fare un flush() sempre per svuotare il buffer e costringere la scrittura sulla scheda dei dati in memoria (quando fai il close() viene prima fatto un flush()).

Ho fatto delle prove e ho visto che chiudendo lo stream del file aiuta, nonostante questo il problema si è ripresentato, ho notato che succede quando ho più attività da parte della shield GPRS (problemi di linea o scarsa, ripetuti tentativi di connessione)

Chiedo scusa a m_ri per non aver testato meglio i picchi di alimentazione.

durante la scrittura di dati non salta mai l'alimentazione?

Controlla anche la RAM libera.

Ho provato una shield sd che ha un traslatore di livello, e il problema non si è più presentato. Per info la shield monta un 74HC125

Grazie a tutti.

Ciao

Per inquadrare meglio, che shield SD usi? Può servire per altri utenti che magari possono risolvere con il tuo aiuto

la shield SD che ho usato adesso è questa

http://www.ladyada.net/make/logshield/

ho rimosso RTC perché non mi serviva