Go Down

Topic: W5100 et carte SD, ecriture à la suite bloque (Read 674 times) previous topic - next topic

lolo81

Jan 10, 2013, 01:40 pm Last Edit: Jan 10, 2013, 04:34 pm by lolo81 Reason: 1
Bonjour,
dans mon programme je voudrai enregistrer les valeurs toutes les X secondes au format csv dans la carte SD.
La partie écriture en CSV ne me cause pas de problème mais c'est plutôt l'écriture dans le fichier de la carte SD qui me bloque.
Lors du démarrage dans le setup j'arrive à créer un fichier dans la carte avec une première ligne puis dans la boucle loop une seconde ligne.
Mon problème est que je n'arrive pas à écrire de 3eme ligne, la fonction "Enregistrement_carte_SD" fonctionne car je vois les valeur dans le moniteur mais pas de 3eme ligne.
J'ai mis      pinMode(10,OUTPUT);  digitalWrite(10,HIGH); dans la fonction car dans mon programme je désactive la carte SD pour accéder à ma page HTML.
Si quelqu'un a une idée du problème, merci d'avance pour son aide.
Mon setup:

Code: [Select]
void setup()   {
   //----initialise connexion série
 Serial.begin(9600);

   //***************** initialisation de la carte SD **************************************

 Serial.println("Initialisation de la SD card...");
      pinMode(10,OUTPUT);
    digitalWrite(10,HIGH); // Active la carte SD
 
 test=SD.begin(brocheSDCardSelect); // initialisation de la carte SD avec broche 4 en tant que CS - renvoie true/false

 if (test!=true) { // si initialisation n'est pas réussie
   Serial.println("Echec initialisation!"); // message port Série
 }
 else { // si initialisation réussie
   Serial.println("Initialisation reussie !"); // message port Série

   //----- affiche le contenu du répertoire

   root = SD.open("/"); // ouvre la SD Card à la racine
   Serial.println("Repertoire racine ouvert !");
   if(root)
   {
     if(SD.exists("test.txt"))//Teste si le fichier est présent dans la carte SD
     {
       int EvoNomFichier = 1; //Valeur permettant d'incrémenter le nom du fichier

       sprintf(fileName,"%04s%02d%04s","test_",EvoNomFichier,".txt");  //  %d pour un int
       if (SD.exists(fileName)) //Teste si le nouveau nom existe
       {
         while (SD.exists(fileName))  //Tant que le fichier existe dans la SD on l'incrémente
         {      
           EvoNomFichier ++;
           sprintf(fileName,"%04s%02d%04s","test_",EvoNomFichier,".txt");  //  %d pour un int  %s pour un string c'est un tableau
         }//Fin de la boucle While                          
         file = SD.open(fileName, FILE_WRITE); // ouvre le fichier en écriture
         FileOK= true;
       }
       else // Pas de nouveau fichier donc on le créer.
       {
         file = SD.open(fileName, FILE_WRITE); // ouvre le fichier en écriture
         Serial.println(fileName);
         FileOK= true;
       }
     }
     else
     {
       file = SD.open("test.txt", FILE_WRITE); // ouvre le fichier en écriture
       sprintf(fileName,"%04s%04s","test",".txt");
       FileOK= true;
     }
     file.println("test ecriture");
     file.close(); // ferme le fichier
     Serial.println("Fin enregistrement !");  
     Serial.println("Fermeture fichier !");
     delay(500);
   }
 } //Fin initialisation réussie
}


Le loop

Code: [Select]

void loop()
{
 //*********************Recup de L'heure dans le DS1307 **************
   RTC.get(rtc,true); // set the RTC
   Heure = rtc[2];
   Minute =  rtc[1];

    Serial.print(Heure);
    Serial.print(":");
    Serial.println(Minute);
    ///////////////////////// TOUTE LES xx MINUTES ///////////////////////////////////
         if (root)
       {
         Serial.println(DelaisRecSondes);
           if(DelaisRecSondes>= 58)
           {
             DelaisRecSondes=0;
           }
           
           if (Minute> DelaisRecSondes+1)
           {  
           Enregistrement_carte_SD();    
           }
            else
           {
           pinMode(4, OUTPUT); //Active le W5100
           EcritureSD = false;
           }
       }
       delay(2000);
}


La fonction:

Code: [Select]

void Enregistrement_carte_SD()
{
    pinMode(10,OUTPUT);
    digitalWrite(10,HIGH); // Active la carte SD

     Serial.print("fileName = ");
     Serial.println(fileName); //contrôle du nom de fichier(pour le debug)
     file = SD.open(fileName, FILE_WRITE); //ouverture en écriture du fichier
     n_Valeur_Mesure ++        //incrémentation de la valeur à écrire
     file.println(n_Valeur_Mesure); //Ecriture de la valeur
     file.println();                //saut de ligne
     file.close();                  // Fermeture du fichier
     Serial.println(n_Valeur_Mesure); //Contrôle valeur (pour débogage)
     DelaisRecSondes = Minute;    //Incrémentation pour boucle dans le Loop
}


Débutant mais acharné!!

lolo81

J'ai trouvé l'origine du probleme, le tableau "FileName" me servant à stocker le nom du fichier varie en ajoutant un espace ou en modifiant un caractère,
ex:
test.tx[font=Verdana]u[/font] puis test.tx[font=Verdana]v[/font] .
J'ai modifié le code pour limiter les écritures, reduis le tableau à 9 ettester le nom du fichier sur le moniteur, mais c'est pareil.
La fonction:
Code: [Select]

void Rec_carte_SD()
{
                pinMode(10,OUTPUT);
                digitalWrite(10,HIGH); // Active la carte SD
                Serial.print("fileName = ");               
                      if(SD.exists(fileName))//Teste si le fichier est présent dans la carte SD
                        {
                        file = SD.open(fileName, FILE_WRITE); //ouverture en ecriture du fichier
                         Serial.println("fichier OK");
                          Serial.print(fileName);
                        }
                      else
                      {
                        Serial.println("fichier HS");
                        Serial.print(fileName);
                      }

                n_Valeur_Mesure ++;       //incrementation de la valeur à ecrire
                file.println(n_Valeur_Mesure); //Ecriture de la valeur
                file.println();                //saut de ligne
                file.close();                  // Fermeture du fichier
                Serial.println(n_Valeur_Mesure); //Contrôle valeur (pour debogage)
                EcritureSD = false;
}


Loop:
Code: [Select]

          if (root)
        {
          Serial.println(DelaisRecSondes);
            //if (((Minute == 25) ||(Minute == 26)||(Minute == 27)||(Minute == 27))&&(EcritureSD == false))
            if(Minute == 59)
            {
              DelaisRecSondes=0;
            }
           
            if ((Minute> DelaisRecSondes+1)&&(EcritureSD))
            { 
            Rec_carte_SD();
            DelaisRecSondes = Minute;
            }
             else
            {
            pinMode(4, OUTPUT); //Active le W5100
            EcritureSD = true;
            }
             
        }
        delay(2000);


Une idée?

Débutant mais acharné!!

Heloderma-kris

bon j'ai pas proceder comme toi et je ne trouve pas ton ereure mais voisi ce que j'ai fait comme fonction pour datalogger des variable si ça peut t'aider a trouver ton probléme:
Code: [Select]

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);
      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);
    };
  };
  file.close();
  return;
}

ps: dans ton code j'ai pas trouver comment tu te placer a la fin de ton fichier avant d'ecrire ta nouvelle ligne .

lolo81

Bonsoir Heloderma-kris,
Ne trouvant pas le problème dans mon code, j'ai repris le tiens que j'ai adapté au mien.
Merci pour ton aide!!
Bonne soirée.
Débutant mais acharné!!


Go Up