Pages: [1]   Go Down
Author Topic: W5100 et carte SD, ecriture à la suite bloque  (Read 598 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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:
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
}

« Last Edit: January 10, 2013, 10:34:35 am by lolo81 » Logged

Débutant mais acharné!!

Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.txu puis test.txv .
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:
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:
          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?

Logged

Débutant mais acharné!!

Region ile de france.
Offline Offline
Sr. Member
****
Karma: 3
Posts: 402
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 .
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Débutant mais acharné!!

Region ile de france.
Offline Offline
Sr. Member
****
Karma: 3
Posts: 402
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

si ça a marché tand mieux alors ! smiley-wink
Logged


Pages: [1]   Go Up
Jump to: