datalogger quelques problèmes débutant

Bonjour à tous !

Alors après pas mal d'heure de recherche à n'en plus voir le temps passer, je me retourne vers vous pour trouver un peu d'aide ! :slight_smile:

Pour commencer, mon niveau en informatique/electronique: j'ai commencé il y a deux semaines par la lecture d'un tuto sur le langage C, j'ai eu un peu de temps pour enchaîner sur les ajouts du C++. Et j'ai lu pas mal d'exemple de code et de sujet sur des forums par rapport aux Arduinos.

Niveau matériel je travail sur un datalogger, j'ai donc un Uno Rev 3 avec le shield adafruit datalogger (shield composé d'un port SD, un RTC avec une alim 3.3V stab et une pile pour le RTC.)

Mon but est de pouvoir enregistré l'heure et la date d'évènements sur ma carte SD, et ça marche ! Mais voilà j'aimerais pouvoir enlever la carte et continuer le déroulement de ces évènements pour ensuite revenir avec la carte SD, récupérer les données intermédiaires avant de reprendre l'enregistrement normalement. J'ai donc tenté de réaliser un buffer, l'intérêt étant moindre j'y ai quand même passé un temps fou (oublions pas que je débute ! :slight_smile: juste par pur défi de réussir ce buffer ! Sauf que maintenant il fonctionne bien, mais pas exactement. J'ai plusieurs problèmes :

Le premier : au bout de 4 évènements enregistrés, ensuite il ne me fait que des sauts de lignes et ne m'enregistre plus l'heure et la date. En diminuant la taille de mon String j'arrive à enregistré 9 lignes, ensuite que des sauts de ligne sauf le 13 ! La ligne 13 il m'écrit bien l'heure et la date avant de resauter juste des lignes ... Là j'y comprend pas grand chose !

Le deuxième : Les enregistrements se produisent correctement, j'enlève la carte, j'enregistre - de 9 évènements, je remet la carte, au prochain event le buffer enregistre les évènements sur la carte SD mais pas ce nouvel évènement, et je n'arrive pas à jouer avec ma fonction pour qu'il enregistre ce nouvel évent aussi. Mais pire, à ce stade, l'enregistrement sur la carte ne se fait plus qu'un event sur 2.

Voilà mon code, composé du code exemple d'adafruit et de diverses choses que j'ai pu trouver et remodeler, j'ai essayé de faire au plus claire donc si vous avez des conseils je suis preneur.
(je n'ai pas inclus le void setup et d'autres choses avant pour essayer de garde l'essentiel pour mon problème, s'il faut tout le code je le rajouterais :slight_smile:

/* Déclare le buffer qui stockera une ligne du fichier, ainsi que les deux pointeurs key et value */
String buffer[32];
int indx = 0;    // index pointing to the buffer current position

const int chipSelect = 10; // SD CHIPSELECT
Sd2Card card; //SD CARD TEST
RTC_DS1307 RTC;   // define the Real Time Clock object
File logfile;     // the logging file


void loop() 
{
    DateTime now;
/*CONDITION SAVE SWITCH DATALOGGER */
 if(digitalRead (zelioPLCpin) == HIGH) // IMPULSION MANOEUVRE
  {
      delay(500); // maintien impulsion 
      if(digitalRead (zelioPLCpin) == HIGH)  //START ACQUISITION DONNEE
        {
          digitalWrite(greenLEDpin, HIGH);
          now = RTC.now();     // fetch the time
          
   // String tma("Switch at ");                               // COMPO STRING DATE
      String tmb(now.year(), DEC);
        String tmc(now.month(), DEC);
            String tmd(now.day(), DEC);
                String tme(now.hour(), DEC);
                    String tmf(now.minute(), DEC);
                         String tmg(now.second(), DEC);
    String tmp = tme + ":" + tmf + ":" + tmg + " " + tmd + "/" + tmc + "/" + tmb;
          buffer[indx] = tmp ; 
          indx++;
          
           #if ECHO_TO_SERIAL 
          Serial.println(tmp); 
          #endif // ECHO_TO_SERIAL          
         
  /* SI CARTE SD PRESENTE ALORS BUFFER */ 
         if(card.init(SPI_HALF_SPEED, chipSelect)) // TEST  
          {
           int back_indx = 0;
           while(back_indx<indx) // writing from the older stored value to the newer
            {
           #if ECHO_TO_SERIAL              
              Serial.println(buffer[back_indx]);
          #endif // ECHO_TO_SERIAL 
              logfile.println(buffer[back_indx]);
              back_indx++;
            }
            indx=0;
          }
    digitalWrite(greenLEDpin, LOW);       
    delay(2000);  // delai min entre deux datalog
   }
  }
  
  // ------------ FLUSH TO DISK SD CARD --------------
  if ((millis() - syncTime) < SYNC_INTERVAL) return; 
  syncTime = millis(); 
    
  // blink LED to show we are syncing data to the card & updating FAT! 
  digitalWrite(redLEDpin, HIGH); 
  logfile.flush(); 
  digitalWrite(redLEDpin, LOW); 
}

Voilà, si vous avez des suggestions ce serait sympa !

Merci bye !

Yann Volcolm

Juste pour la chaîne String, elle est faite ainsi car je n'arrivais pas à y inclure directement mes fonctions ou d'autres choses dedans sans avoir une erreur à la compil. Et pour le test "si carte SD présente alors buffer", je n'ai pas trouve d'autres choses pour tester la présence de ma carte SD et pour qu'elle soit aussi réinitialisé quand je l'insère à nouveau sans avoir à faire un reset de la carte.
Merci