Checking write on SDcard with 2 leds

Hi,
I'm using a dataloger program for save date (RTC) and values of my sensors on SDcard. It works.

Now I would like checking write on SDcard with 2 leds:
If write on SDcard is ok, I blink green led.
If it's not ok, I blink red led.

/*
           Stockage des valeurs de temperature dans un fichier texte avec fonction d'horodatage
            
        */

        #include <Wire.h>
        #include <SD.h>
        #include <RTClib.h>

        // Declaration des pin utilisées
        const char pin_chipSelect = 10;                            //10 est la pin utilisée par le shield mémoire pour le signal ChipSelect
        const char pin_capteur0 = 0;                                //Numéro de la pin où est relié le capteur 0
	const char pin_capteur1 = 1;                        //Numéro de la pin où est relié le capteur 1
	const char pin_capteur2 = 2;                        //Numéro de la pin où est relié le capteur 2
	const char pin_capteur3 = 3;                        //Numéro de la pin où est relié le capteur 3 en question
	int pin_led_verte = 6;                             //Numéro de la pin où est relié la LED verte
    	int pin_led_rouge = 7;                             //Numéro de la pin où est relié la LED rouge
	

        // Declaration des variables générales
        const unsigned long F_refresh = 10000;           //Entrez la fréquence de rafraichissement des capteurs, en millisecondes
        RTC_DS1307 RTC;
        File fichier;
        String datastring;

        void setup()
        {
         
          Serial.begin(57600);                                     //Initialisation de la liaison série
		  
      	  Serial.print("Initialisation des LEDs..."); 
     		pinMode(pin_led_verte, OUTPUT);
		pinMode(pin_led_rouge, OUTPUT);
		digitalWrite(pin_led_verte, LOW);
		digitalWrite(pin_led_rouge, LOW);

          Serial.print("Initialisation de la SD card...");
         
          pinMode(pin_chipSelect, OUTPUT);                         // Mettre la pin en output
         Wire.begin();
           RTC.begin();                            
           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(pin_chipSelect))                           // Vérification de la présence de la SD card
            {                         
              Serial.println("Carte fausse ou absente");
              return;                                              // Si problème, sortir et bloquer l'exécution
            }
         
          Serial.println("Carte OK.");
         
          datastring = "\nReleve et horodatage des valeurs du capteur, selon horloge RTC\n---------\n ";
         
          fichier = SD.open("hydro1.txt", FILE_WRITE);               // Ouverture du fichier en mode Ecriture.

          if (fichier)                                             // Si le fichier existe déja, on écrira à la suite des données présentes.
            { 
              fichier.println(datastring);
              fichier.close();
              Serial.println(datastring);              // dupliquer la donnée sur port série
            }
           
          else                                                     //Si problème à l'ouverture, alors signaler l'erreur
            {                                                       
                Serial.println("erreur d'ouverture du fichier durant la configuration");        	  
            }
         
        }

        void loop()
        {
          delay(F_refresh);
         
          DateTime moment = RTC.now();         //Init de l'objet temporel
          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 sensor0 = analogRead(pin_capteur0);           // lire la valeur du capteur 0 
	  int sensor1 = analogRead(pin_capteur1);             // lire la valeur du capteur 1 
	  int sensor2 = analogRead(pin_capteur2);            // lire la valeur du capteur 2 
	  int sensor3 = analogRead(pin_capteur3);            // lire la valeur du capteur 3 

          //float HIH = ((sensor*(5.0 / 1024) - 0.826) / 0.0315);
          float HIH0 = sensor0 * 0.155009921 - 26.222222222;          // conversion voltage en %hydro
	  float HIH1 = sensor1 * 0.155009921 - 26.222222222;          // conversion voltage en %hydro
          float HIH2 = sensor2 * 0.155009921 - 26.222222222;          // conversion voltage en %hydro
          float HIH3 = sensor3 * 0.155009921 - 26.222222222;          // conversion voltage en %hydro

          String tempAsString0, tempAsString1 ,tempAsString2 ,tempAsString3;
          char tempo0[10], tempo1[10], tempo2[10], tempo3[10];
          dtostrf(HIH0,1,2,tempo0);
          tempAsString0 = String(tempo0);     //Changement float en string 

	  dtostrf(HIH1,1,2,tempo1);   
          tempAsString1 = String(tempo1);     //Changement float en string 

	  dtostrf(HIH2,1,2,tempo2);
          tempAsString2 = String(tempo2);     //Changement float en string 
		 
	  dtostrf(HIH3,1,2,tempo3);
          tempAsString3 = String(tempo3);     //Changement float en string 
          
          datastring += ("\t Capteur0 = ");            // préalablement remplie avec les données temporelles
          datastring += String(tempAsString0);
	  datastring += ("\t Capteur1 = ");            // préalablement remplie avec les données temporelles
          datastring += String(tempAsString1);
	  datastring += ("\t Capteur2 = ");            // préalablement remplie avec les données temporelles
          datastring += String(tempAsString2);
	  datastring += ("\t Capteur3 = ");            // préalablement remplie avec les données temporelles
          datastring += String(tempAsString3);
          
          fichier = SD.open("hydro1.txt", FILE_WRITE);
          
          if (fichier)
            {
           digitalWrite(pin_led_verte, HIGH);
          delay(1000);
          digitalWrite(pin_led_verte, LOW);

              fichier.println(datastring);
              fichier.close();
              Serial.println(datastring);                 // dupliquer la donnée sur port série
            }
          else {

         digitalWrite(pin_led_rouge, HIGH);
          delay(1000);
          digitalWrite(pin_led_rouge, LOW);

                Serial.println("erreur d'ouverture du fichier");

                }
         
          datastring =0;
        }
  • If there is no SDcard, the red led blink >> GOOD
    but if I insert after my SDcard, the red led blink always.... And the program don't works properly. The frequency between two reading, normally 10sec it's not respected.

  • If there is SDcard connected, the first time the red led blink one time >> NOT GOOD, WHY?
    but after it's OK, the green led blink and values of sensors are saved >> GOOD
    Now if I remove SDcard, the green led blink always... and the frequency between two reading, (normally 10sec) it's not respected.

Someone can help me? I would like to be sure that values of sensors are recorded on SDcard and to be inform with a problem on SDcard (PAcces problem with SDcard, full SDcard etc...).

Thank you!

Your sketch won't detect a reinserted card.
This is the place where you notice if a card is inserted

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

Unfortunately, the standard SD library does not allow to repeat the SD.begin() after you detect a missing card until a card is present again.

Is reset an option for you?

#include <avr/wdt.h>
void resetArduino()
{
	noInterrupts();
	wdt_enable(WDTO_15MS);
	while(1); // wait to die and be reborn....
}

I modified SD.cpp a bit, instead ( but don't have that code available right now )

Ok thank you for your answer.
I do not prefer use reset option. I would not treat the case of reinserted card.

Simply, It's possible to have green led blink if other test it's OK and red led blink if there is an error?
I have tested this:

if (!SD.begin(pin_chipSelect))                           // Vérification de la présence de la SD card
            {                         
              Serial.println("Carte fausse ou absente");
		  digitalWrite(pin_led_rouge, HIGH);
          delay(1000);
          digitalWrite(pin_led_rouge, LOW);
              return;                                              // Si problème, sortir et bloquer l'exécution
            }
         
          Serial.println("Carte OK.");
		  digitalWrite(pin_led_verte, HIGH);
          delay(1000);
          digitalWrite(pin_led_verte, LOW);

If there is no SDcard I have this message "Carte fausse ou absente" But no blinked of red led. Why?

Thanks

 return;                                              // Si problème, sortir et bloquer l'exécution

What do you mean by "bloquer l'exécution" ?
French is not the problem, but you just skip the rest of setup and start loop as usual...