fuite de mémoire et datalogguing !

Salut a tous
j'ai un problème de perte de mémoire sur mon système j'ai réussi a isoler la partie responsable m'ai je n'arrive pas a trouver la raison de cette perte de mémoire.

en gros j’utilise pour visualiser la mémoire utiliser la librairie MemorieFree.h et sur le terminal série je vois qu'a chaque fois que j’exécute mon code de dattalogguing je perd en mémoire RAM 31 octet , du coup au bout de quelque temps l'arduino plante.

je pige pas d'où ça viens!

voici mon code de dattalogging :

void DattaLog(){

  char nomfichier [13];
  sprintf(nomfichier, "%02i%02i%04i.txt", day, month, year);//affichage heure et date

  file = SD.open(nomfichier, FILE_READ);  
  if (file==false) {
    file =SD.open(nomfichier, FILE_WRITE);
    if( file==true){
      file.print(F("Fichier du : "));
      file.print(day);
      file.print(F("/"));
      file.print(month);
      file.print(F("/"));
      file.println(year);
      file.print(F("heure de lever : "));
      file.print(int(Time_ON/3600));
      file.print(F("H"));
      file.println(int(float (Time_ON)/60-(floor(float(Time_ON)/3600)*60)));
      file.print(F("heure de coucher : "));
      file.print(int(Time_OFF/3600));
      file.print(F("H"));
      file.println(int(float (Time_OFF)/60-(floor(float(Time_OFF)/3600)*60)));
      file.print(F("Duree d'eclairage : "));
      file.print((float(Time_OFF)-float(Time_ON))/3600);
      file.println(F("H"));
      file.println(F("les donnees sont au format suivant : "));
      file.println(F("temps;Temperature piece; Temperature Terra; humidite Piece "));
      file.print(temps());
      file.print(F(";"));
      file.print(temp_sonde[sonde_piece]);
      file.print(F(";"));
      file.print(temp_sonde[sonde_terra]);
      file.print(F(";"));
      file.println(HumiditePiece);
    };
  }
  else{
    file =SD.open(nomfichier, FILE_WRITE);
    if( file==true){
      long fin=file.size();
      file.seek(fin+1L);
      sprintf(Buff_afichage, "%02i:%02i:%02i", hour, min, sec);//impresion heure 
      file.print(Buff_afichage);
      file.print(F(";"));
      file.print(temp_sonde[sonde_piece]);
      file.print(F(";"));
      file.print(temp_sonde[sonde_terra]);
      file.print(F(";"));
      file.println(HumiditePiece);
    };
  };
  file.close();
  return;
}

merci :wink:

Je ne connais pas très bien la librairie SD mais je vois que tu fais 2 SD.open mais tu ne fais qu'un close.
Peut être tenter ça:

void DattaLog(){

  char nomfichier [13];
  sprintf(nomfichier, "%02i%02i%04i.txt", day, month, year);//affichage heure et date

  file = SD.open(nomfichier, FILE_READ);  
  file.close();    // au cas ou un tampon ne serait pas libéré implicitement lorsque tu fais un open juste après.
  if (file==false) {
    file =SD.open(nomfichier, FILE_WRITE);
    if( file==true){
      file.print(F("Fichier du : "));

en faisant ce que tu m'indique la seconde partie de ma fonction , a savoir , ecrire des donnée a la fin du fichier , ne marche plus , mais il n'y a plus de fuitede memoir je regarde donc ce qui peut bloquer dans la seconde partie du programe!

Bon j'y comprend rien j'ai trafiqué le code de ma fonction et maintenant sa marche mais je suis incapable de dire pourquoi!!! :astonished:
enfin merci de ton aide et voici le code de la fonction qui je pense peut servire a d'autre :wink:

void DattaLog(){

  char nomfichier [13];
  long fin;
  boolean fichierok;
  sprintf(nomfichier, "%02i%02i%04i.txt", day, month, year);//affichage heure et date
  sprintf(Buff_afichage, "%02i:%02i:%02i", hour, min, sec);//impresion heure
 
  fichierok= SD.exists(nomfichier);
  
  file =SD.open(nomfichier, FILE_WRITE);
  if(file==true){
  if (fichierok==false) {
    
      file.print(F("Fichier du : "));
      file.print(day);
      file.print(F("/"));
      file.print(month);
      file.print(F("/"));
      file.println(year);
      file.print(F("heure de lever : "));
      file.print(int(Time_ON/3600));
      file.print(F("H"));
      file.println(int(float (Time_ON)/60-(floor(float(Time_ON)/3600)*60)));
      file.print(F("heure de coucher : "));
      file.print(int(Time_OFF/3600));
      file.print(F("H"));
      file.println(int(float (Time_OFF)/60-(floor(float(Time_OFF)/3600)*60)));
      file.print(F("Duree d'eclairage : "));
      file.print((float(Time_OFF)-float(Time_ON))/3600);
      file.println(F("H"));
      file.println(F("les donnees sont au format suivant : "));
      file.println(F("temps;Temperature piece; Temperature Terra; humidite Piece "));
      file.print(Buff_afichage);
      file.print(F(";"));
      file.print(temp_sonde[sonde_piece]);
      file.print(F(";"));
      file.print(temp_sonde[sonde_terra]);
      file.print(F(";"));
      file.println(HumiditePiece);
      };
 if (fichierok==true) {
      fin=file.size();
      file.seek(fin+1L); 
      file.print(Buff_afichage);
      file.print(F(";"));
      file.print(temp_sonde[sonde_piece]);
      file.print(F(";"));
      file.print(temp_sonde[sonde_terra]);
      file.print(F(";"));
      file.println(HumiditePiece);
};
};
  file.close();
  return;
}
en faisant ce que tu m'indique la seconde partie de ma fonction , a savoir , ecrire des donnée a la fin du fichier , ne marche plus

Logique (en même temps je n'y avais pas pensé avant) en faisant file.close on perd l'état qui est testé ensuite.

Je pense que cette version (qui reprend ta 1ère version) devrait fonctionner

void DattaLog(){

  char nomfichier [13];
  sprintf(nomfichier, "%02i%02i%04i.txt", day, month, year);//affichage heure et date

  fichierok= SD.exists(nomfichier);
  
  if (fichierok==false) {
    file =SD.open(nomfichier, FILE_WRITE);
    if( file==true){
      file.print(F("Fichier du : "));
      file.print(day);
      file.print(F("/"));
      file.print(month);
      file.print(F("/"));
      file.println(year);
      file.print(F("heure de lever : "));
      file.print(int(Time_ON/3600));
      file.print(F("H"));
      file.println(int(float (Time_ON)/60-(floor(float(Time_ON)/3600)*60)));
      file.print(F("heure de coucher : "));
      file.print(int(Time_OFF/3600));
      file.print(F("H"));
      file.println(int(float (Time_OFF)/60-(floor(float(Time_OFF)/3600)*60)));
      file.print(F("Duree d'eclairage : "));
      file.print((float(Time_OFF)-float(Time_ON))/3600);
      file.println(F("H"));
      file.println(F("les donnees sont au format suivant : "));
      file.println(F("temps;Temperature piece; Temperature Terra; humidite Piece "));
      file.print(temps());
      file.print(F(";"));
      file.print(temp_sonde[sonde_piece]);
      file.print(F(";"));
      file.print(temp_sonde[sonde_terra]);
      file.print(F(";"));
      file.println(HumiditePiece);
    };
  }
  else{
    file =SD.open(nomfichier, FILE_WRITE);
    if( file==true){
      long fin=file.size();
      file.seek(fin+1L);
      sprintf(Buff_afichage, "%02i:%02i:%02i", hour, min, sec);//impresion heure 
      file.print(Buff_afichage);
      file.print(F(";"));
      file.print(temp_sonde[sonde_piece]);
      file.print(F(";"));
      file.print(temp_sonde[sonde_terra]);
      file.print(F(";"));
      file.println(HumiditePiece);
    };
  };
  file.close();
  return;
}

Merci ça marche fin de la fuite! :grin: