Création de plusieurs fichiers sur carte SD

Bonjour,

Je dois modifier mon programme d'acquisition, pour le moment le programme fait une acquisition toutes les 0,2 sec pendant 1 min (environ 300 mesures) et créer un fichier de données. J'aimerais savoir comment faire pour que je puisse créer par exemple 3 fichiers différents comportant chacun 300 mesures.
Je voudrais en gros avoir sur ma carte SD a la fin : Fichier 1 : 300 mesures ; fichier 2 : 300 mesures ; fichier 3 : 300 mesures. Donc une sorte de boucle qui me fait mes 3 fichiers avec 900 mesures puis s'arrête.

Merci a vous.

#include <SPI.h> // Pour la communication SPI
#include <SD.h>  // Pour la communication avec la carte SD
#include <Wire.h>
int e=1;
int f=1;

File Mesures;//Déclaration d'une variable de type Fichier (File)
const int sdPin = 10;//Définition de la borne de données de la carte.
float dureeAcquisition = 60;//Durée en s
unsigned long temps;//Variable temps pour gérer la durée d'acquisition.

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  SD.begin(sdPin);//Initialisation de la carte.
  pinMode(sdPin, OUTPUT);//Délcaration de l'E/S en sortie.
  }
  Mesures = SD.open("Dossier/Fichier.csv", FILE_WRITE);//
 if (!Mesures) {
    Serial.println(F("Erreur : Impossible d'ouvrir le fichier de sortie"));
    Serial.println(F("Verifiez la carte SD et appuyez sur le bouton RESET"));
    for (;;); // Attend appui sur bouton RESET
  }
  /* Ajoute l'entête CSV si le fichier est vide */
  if (Mesures.size() == 0) {
    Serial.println(F("Ecriture de l'entete txt ..."));
    Mesures.println(F("Mesure; Tension A0; Temps;"));
    Mesures.flush();
  }

  temps = millis() / 1000.0;//On relève le temps de la carte Arduino.
  while (millis() / 1000 < temps + dureeAcquisition) {
   float v_1 = analogRead(A0) * 5 / 1023.0;//Lecture de la tension aux bornes de la CTN
   
    Serial.println(dureeAcquisition-(millis() / 1000.0-temps), 0);
    //Écriture des mesures dans le fichier.
    Mesures.print(millis() / 1000.0-temps, 2);
    Mesures.print(";");
    Mesures.println(v_1, 1);
    delay(200);//Une mesure toutes les secondes.
  }
  Serial.println("Terminé");
  Mesures.close();//
}



void loop() {


}

J'ai mis en place un compteur, le problème restant que je vois pas comment faire 3 fichiers distinct, là, je fais 3 acquisition mais qui s'écrivent a la suite dans le même fichier.

Et bien, par exemple:

  • tu ouvres "fichier1"
  • tu fais les mesures
  • tu écris dans "fichier1"
  • tu fermes "fichier1"
  • tu ouvres "fichier2"
  • tu fais les mesures
  • tu écris dans "fichier2"
  • tu fermes "fichier2"
  • tu ouvres "fichier3"
  • tu fais les mesures
  • tu écris dans "fichier3"
  • tu fermes "fichier3"

Edit: il serait d'ailleurs plus logique de faire les mesures puis d'ouvrir le fichier

J'ai essayé de faire ca precedèmment et ça marche, le problème dans cette méthode c'est que j'obtiens un long programme et là on me demande de le faire 3 fois, je ferais quoi si on me demande de le faire 10 fois :confused:

Tu fais une boucle for.

C'est ce que j'ai fais pour le moment, j'ai donc un compteur et ca me va bien. Mais je vois pas comment faire pour que le programme m'ecrivent dans 3 fichiers distinct.

#include <SPI.h> // Pour la communication SPI
#include <SD.h>  // Pour la communication avec la carte SD
#include <Wire.h>
int e=1;
int f=1;
byte compteur;

File Mesures;//Déclaration d'une variable de type Fichier (File)
const int sdPin = 4;//Définition de la borne de données de la carte.
float dureeAcquisition = 60;//Durée en s
unsigned long temps;//Variable temps pour gérer la durée d'acquisition.

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  SD.begin(sdPin);//Initialisation de la carte.
  pinMode(sdPin, OUTPUT);//Délcaration de l'E/S en sortie.
  if (SD.exists("Dossier/Fichier.csv")) {
    SD.remove("Dossier/Fichier.csv");
    //Si le fichier existe déjà, on le supprime.
  }
for(compteur=0 ; compteur <3 ; compteur++) {

  Mesures = SD.open("Dossier/Fichier.csv", FILE_WRITE);//Création du fichier (nom limité à 8 caractères!!)
 if (!Mesures) {
    Serial.println(F("Erreur : Impossible d'ouvrir le fichier de sortie"));
    Serial.println(F("Verifiez la carte SD et appuyez sur le bouton RESET"));
    for (;;); // Attend appui sur bouton RESET
  }
  /* Ajoute l'entête CSV si le fichier est vide */
  if (Mesures.size() == 0) {
    Serial.println(F("Ecriture de l'entete txt ..."));
    Mesures.println(F("Mesure; Tension A0; Temps;"));
    Mesures.flush();
  }

  temps = millis() / 1000.0;//On relève le temps de la carte Arduino.
  while (millis() / 1000 < temps + dureeAcquisition) {
   float v_1 = analogRead(A0) * 5 / 1023.0;//Lecture de la tension aux bornes de la CTN
   
    Serial.println(dureeAcquisition-(millis() / 1000.0-temps), 0);
    //Écriture des mesures dans le fichier.
    Mesures.print(millis() / 1000.0-temps, 2);
    Mesures.print(";");
    Mesures.println(v_1, 1);
    delay(200);//Une mesure toutes les secondes.
  }
  Serial.println("Terminé");
  Mesures.close();//
}
}


void loop() {
  // put your main code here, to run repeatedly:

}

Tu construis le nom du fichier avec l'index de la boucle for
Ou bien tu utilises l'index de la boucle for pour aller chercher le nom du fichier dans un tableau.

Avec une boucle do while c'est jouable aussi ?

Bien sur que c'est possible.
Mais

  • pourquoi tu veux faire plus compliqué?
  • ça ne change rien à ton problème de noms de fichiers (dont fdufnews t'a donné la solution).

En réalite le problème, c'est que je suis vraiment un bon débutant sur arduino et c'est mon maître de stage qui me donne des indications, et il m'a parlé d'essayer de le faire avec la boucle do while que je connais a peu près, mais si la solution de fdufnews est plus abordable je suis preneur, cependant je n'ai pas bien saisi ce qu'il fallait faire, si possible de me donner une indication supplémentaire ? Ou un lien explicatif avec éventuellement un tuto ?

Merci a vous pour vos réponses.

Tu fais quelquechose comme ça

  for (compteur = 0 ; compteur < 3 ; compteur++) {
    char path[20];
    sprintf(path, "Dossier/Fichier%d.csv", compteur);
    if (SD.exists(path))
      SD.remove(path);   //Si le fichier existe déjà, on le supprime.

    Mesures = SD.open(path, FILE_WRITE);//Création du fichier (nom limité à 8 caractères!!)
    // ...

Merci beaucoup pour votre aide et petite question, quelle est la fonction du %d ?

%d ça veut dire de mettre la valeur du paramètre (ici compteur) dans la chaine

D'accord, je vous remercie pour votre aide et vos réponses, le programme fonctionne parfaitement !