[resolu] utilisation du data logging ADA1141

Bonjour ,
pour recadrer le problème:
j’utilise un shield ADA1141 de Adafruit pour enregister mes valeurs en temps réel
jusqu’ici tout marche pour enregistrer deux évènements différents "PARTIE 1"ET “PARTIE 2” dans le code pour se repérer.

par contre je voudrais insérer de l’horodatage pour la "partie 3 " celle qui est en “Commentaire” et là ça ne marche plus à chaque fois j’ai mon message d’erreur:
“erreur d’ouverture du fichier”

je bloque…pourtant je fais la même chose
Une idée ??

merci

void setup() 
{
   Serial.begin(9600);
   
   Wire.begin();                               // Initialisation de l'interface I2C pour l'horloge DS 1307     
   RTC.begin();                                // Initilisation de l'horloge
   Serial.println("Initialisation de la carte SD");
  
   if (! RTC.isrunning())
  {
// Si la RTC n'est pas configurée, le faire avec les valeurs de l'ordinateur au moment de la compilation

    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

  if (!SD.begin(ChipSelect))                  // Vérification de la présence de la carte SD
  {                         
    Serial.println("Carte invalide ou absente");
    return;                                   // Si problème, sortir et bloquer l'exécution
  }
  Serial.println("Carte presente");

  datastring = "\nLecture des donnees du capteur et horodatage\n---------\n ";

  fichier = SD.open("log.txt", FILE_WRITE);  // Ouverture du fichier en écriture.

  if (fichier)                                // Si le fichier existe, on écrit les données à la suite
  {
    fichier.println(datastring);
    fichier.close();
    Serial.println(datastring);            // Affichage des données sur le port série (facultatif)
  }
  else                                        // Signale un éventuel problème d'ouverture de fichier
  {                                                       
    Serial.println("Erreur d'ouverture du fichier");
  }
   
   //dht.begin();
   pinMode(led_verte, OUTPUT); //definie les led comme des sorties
   pinMode(led_rouge, OUTPUT);
   pinMode(led_bleu, OUTPUT);
   pinMode(6, OUTPUT); //definie la broche 6 comme une sortie pour le relais de la pompe
   pinMode(7, OUTPUT); //definie la broche 7 comme une sortie pour le buzzer
   pinMode(3, INPUT); //definie la broche 3 comme une entrée pour le boutonM
   pinMode(4, INPUT); //definie la broche 4 comme une entrée pour le boutonL
   
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
   DateTime moment = RTC.now();   //Initialisation de l'objet temporel
   
    m=(moment.minute());
    s=(moment.second());
    
   etatboutonM=digitalRead(boutonM);
   etatboutonL=digitalRead(boutonL);
   if (m ==0 && s == 0)
   {
    digitalWrite(led_rouge, LOW);
    
    ValeurcapteurH = analogRead(capteurH);    
              
    Serial.print("Hum dans le sol = " ); //affichage sur ordi                      
    Serial.println(ValeurcapteurH);
    
       
//PARTIE 1
    
     // condition du relais pour une autorisation de 2 secondes:
      if (analogRead(capteurH)<=200)  //////////////////////////////////////////////////////////////////////////////////////
      { 
        digitalWrite(6, HIGH); //pompe on
        digitalWrite(7, HIGH); //buzzer on
        digitalWrite(led_rouge, HIGH);
        digitalWrite(led_verte, LOW);
        Serial.println("arrosage auto pendant 2s");
  

        datastring=String(moment.day(),DEC);
        datastring+='/';
        datastring+=String(moment.month(),DEC);
        datastring+='/';
        datastring+=String(moment.year(),DEC);
        datastring+=',';
        datastring+=String(moment.hour(),DEC);
        datastring+=':';
        datastring+=String(moment.minute(),DEC);
        datastring+=':';
        datastring+=String(moment.second(),DEC);
       
        int capteurH = analogRead(ValeurcapteurH);                    // lire la valeur du capteur et la mettre dans la chaine de caractères
       
        datastring += ("\t ,Arr Auto,");            // préalablement remplie avec les données temporelles
        datastring += String(ValeurcapteurH);
       
        fichier = SD.open("log.txt", FILE_WRITE);
       
        if (fichier)
          {
           
            fichier.println(datastring);
           
            fichier.close();
           
            Serial.println(datastring);                 // dupliquer la donnée sur port série
          }
        else {
              Serial.println("erreur d'ouverture du fichier");
              }
       
        datastring =0;
        delay(2000);
        digitalWrite(6, LOW); //pompe off
        digitalWrite(7, LOW); //buzzer off 
      }
//PARTIE 2
      if (analogRead(capteurH)>200)  ////////////////////////////////////////////////////////////////////////////
      {
      digitalWrite(6, LOW);  //pompe off
      digitalWrite(led_verte, HIGH);
      digitalWrite(led_rouge, LOW);
      
        datastring=String(moment.day(),DEC);
        datastring+='/';
        datastring+=String(moment.month(),DEC);
        datastring+='/';
        datastring+=String(moment.year(),DEC);
        datastring+=',';
        datastring+=String(moment.hour(),DEC);
        datastring+=':';
        datastring+=String(moment.minute(),DEC);
        datastring+=':';
        datastring+=String(moment.second(),DEC);
       
        int capteurH = analogRead(ValeurcapteurH);                    // lire la valeur du capteur et la mettre dans la chaine de caractères
       
        datastring += ("\t ,Enr Auto,");            // préalablement remplie avec les données temporelles
        datastring += String(ValeurcapteurH);
       
        fichier = SD.open("log.txt", FILE_WRITE);
       
        if (fichier)
          {
           
            fichier.println(datastring);
           
            fichier.close();
           
            Serial.println(datastring);                 // dupliquer la donnée sur port série
          }
        else {
              Serial.println("erreur d'ouverture du fichier");
              }
       
        datastring =0;
      
      }
    
    delay(1010); }           //delai 1010ms pour etre sur que la seconde "0" soit bien finie
// PARTIE 3             
//pompe en mode manuel    //////////////////////////////////////////////////////////////////////////////////////////////////////
if (etatboutonM==HIGH && d==0){
      digitalWrite(6, HIGH); //pompe on 
      digitalWrite(led_bleu, HIGH);
      Serial.println("arrosage manuel");
      
//        datastring=String(moment.day(),DEC);
//        datastring+='/';
//        datastring+=String(moment.month(),DEC);
//        datastring+='/';
//        datastring+=String(moment.year(),DEC);
//        datastring+=',';
//        datastring+=String(moment.hour(),DEC);
//        datastring+=':';
//        datastring+=String(moment.minute(),DEC);
//        datastring+=':';
//        datastring+=String(moment.second(),DEC);
//       
//        int capteurH = analogRead(ValeurcapteurH);                    // lire la valeur du capteur et la mettre dans la chaine de caractères
//       
//        datastring+= ("\t ,Arr Manu,");            // préalablement remplie avec les données temporelles
//        datastring+= String(ValeurcapteurH);
//       
//        fichier = SD.open("log.txt", FILE_WRITE);
//       
//        if (fichier)
//          {
//           
//            fichier.println(datastring);
//           
//            fichier.close();
//           
//            Serial.println(datastring);                 // dupliquer la donnée sur port série
//          }
//        else {
//              Serial.println("erreur d'ouverture du fichier");
//              }
//       
//        datastring =0;
      
      
      d=d+1;}
     
if (etatboutonM==LOW && d==1){
     digitalWrite(6, LOW); //pompe off
     digitalWrite(led_bleu, LOW);
     d=0;}
     
else{} 

// affichage des valeurs en mode manuel    ///////////////////////////////////////////////////////////////////////////////////// 
 if (etatboutonL==HIGH && e==0){
     ValeurcapteurH = analogRead(capteurH);
     Serial.println("lire la valeur d'Hum dans le sol");
     Serial.print("Hum dans le sol = " ); //affichage sur ordi                      
     Serial.println(ValeurcapteurH);

     e=e+1;}
if (etatboutonL==LOW && e==1){
     e=0;}      
else{} 




}

Est ce quelqu'un voit l'erreur que je fais ?
je n'arrive pas à determiner si l'erreur vient de mon horloge temps réel (ce que je crois) que je sollicite par les même variables ou si l'erreur vient de l'écriture sur ma carte SD ........?

merci pour votre aide

Bon ben la seule solution que j'ai trouvé c'est de créer une fonction "horodatage" que je rappelle tout au long de mon programme ...
je vois pas tres bien la différence à part d'aléger le code mais comme ça , ça fonctionne.

Salut,

Sans trop analyser le code, je pense que le problème est justement le poids de ton code en terme de RAM. La lib SD est gourmande, et en plus tu utilises des String (pas bien !!). Petite astuce pour grapiller de la RAM, dans des cas comme ça :

Serial.println("Initialisation de la carte SD");

ou bien

datastring += ("\t ,Arr Auto,");

utilise la fonction F() qui force l'écriture dans la flash, car avec l'écriture précédente toutes les chaînes de caractères sont considérées comme variables, donc stockées en RAM. Ecrire donc plutôt :

Serial.println(F("Initialisation de la carte SD"));
datastring += (F("\t ,Arr Auto,"));

Le fait justement de faire appel à des fonctions plutôt qu'à répéter quasiment le même code permet justement d'éviter ces répétitions qui ont dû surcharger ta RAM

Et bannir bien évidemment les String au profit des tableaux de char :wink:

Merci pour ton commentaire B@tto
je vais m'en souvenir....

lien sur le sujet :

http://mchobby.be/wiki/index.php?title=Arduino_Memoire_Optimiser_SRAM

Bonjour,

+1 Problème de RAM.

Solution simple : ne pas garder en RAM une string juste pour le plaisir, surtout pour l'écrire d'un coup par la suite et ne plus l'utiliser.
Dans ce cas autant écrire directement dans le fichier les données sans passer par une string intermédiaire.

Autre chose, pose toi la question suivante : qu'est ce qu'il se passe à chaque fois que tu écrases "datastring" en lui affectant une nouvelle String directement ?
Indice : "fuite mémoire".

Les String c'est jolie, c'est pratique, mais sans un ramasse miette (sauce Java) ou des pointeurs intelligents (sauce C++ 2011) c'est un coupe gorge à ne pas utiliser.