Créer un nouveau fichier donnees.csv à chaque redemarge de l 'arduino

Bonjour, J ai besoin de votre aide si possible . Merci
Je viens de développer un dataloger pour detercter les ouvertures d’une porte et les enregistrer sur un fichier .CSV (donnees.csv) dans une carte micro sd .

J’utilise un module pour microsd et des un detecteur magnétiques de l ouverture de porte .

Je voudrai si possible creer un nouveau fichier donnee.csv à chaque redermarage de l’ arduino.

Avoir un fichier pour chaque fois que je redemare l arduino.

Exemple :
donnees1.csv
donnees2.csv
donnees3.csv
.
.
.
donneesn.csv

Voici le code :

//  Library :
#include <SPI.h>
#include <SD.h>

#define CS_PIN 10
File monFichier;

// this constant won't change:
const int buttonPin = 2; // the pin that the pushbutton is attached to

const int doorPin = 3; // the pin that the pushbutton is attached to

const int ledPinbutton = 7; // the pin that the LED is attached to

const int ledPindoor = 8; //

// Variables will change:

int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button

int buttonPushCounter = 0; // counter for the number of button presses

int doorState = 0;         // current state of the Door A
int lastdoorState = 0;     // previous state of the Door A

//  Function Setup 

int Operation = 0; //

int DOCounter = 0;   // counter for the number of Door Opened

unsigned long Dtemps = 0; //  Duration of the operation
unsigned long SDtemps = 0; // Duration of the operation in second

unsigned long DtimeO = 0; // Exact time the door is opened
unsigned long SDtimeO = 0; // Exact time the door is opened in seconds

unsigned long DtimeC = 0; // Exact time the door is closed
unsigned long SDtimeC = 0; // Exact time the door is Closed in seconds

unsigned long DOtime = 0; // Door Previous opening time
unsigned long SDOtime = 0; // Door Previous opening time in seconds

unsigned long DOTotaltime = 0; // Cumulative time of all Door openings
unsigned long SDOTotaltime = 0; // Cumulative time of all Door openings in seconds

void setup() {
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the door pin as a input:
  pinMode(doorPin, INPUT); 
  
  // initialize the LED as an output:
  pinMode(ledPinbutton, OUTPUT);
  // initialize the LED as an output:
  pinMode(ledPindoor, OUTPUT);
  
  // initialize serial communication:
  Serial.begin(9600);
  Serial.println( " Starting the program: Hello ... ");
  Serial.println(" ");

 //

   Serial.print("Initialisation de la carte SD en cours ...");

  if (!SD.begin()) {
    Serial.println("L'initialisation de la carte SD a echoue !");
    return;
  }
  Serial.println("L'initialisation de la carte SD a reussie !");

  monFichier = SD.open("donnees.csv", FILE_WRITE);
  if (monFichier) 
  {   
    monFichier.println("Ouverture,T.Ouverture,T. Fermeture,Durée,D. Cumulée,%");
    monFichier.close();    
  } 
 
  
} //void setup

void loop() {
  
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    
    // save the current state as the last state, for next time through the loop
    lastButtonState = buttonState;
    
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      buttonPushCounter++;
    
     } //if (buttonState == HIGH)
   } //if (buttonState != lastButtonState)
  
 
  // First Press  
      if (buttonPushCounter % 2 == 1) {
        
        //turn LED BUTTON ON:
        digitalWrite(ledPinbutton, HIGH);
        //
        Operation = (buttonPushCounter+1)/2;
        //
        Dtemps = millis(); 
        SDtemps = 0.001 * Dtemps; // Expression of time in seconds

        // Display Function Loop Turn on device

       
      // DOOR  ***************************************
      
         // read the pushbutton input pin:
       doorState = digitalRead(doorPin);
          // compare the DoorState to its previous state
          if (doorState != lastdoorState) {
   
            if (doorState == LOW) {// if the door A is Open
              // turn LED DOOR A ON:
              digitalWrite(ledPindoor, HIGH);
              //
              DOCounter++;
              DtimeO = millis();
              SDtimeO = 0.001 * DtimeO;// Expression of time in seconds
              
              //Display Function Loop Door Open
            
     
            } //if (doorState == LOW)

            else { // door A is closed
          
              // turn LED DOOR OFF:
              digitalWrite(ledPindoor, LOW);
              //
              DtimeC = millis();
              SDtimeC = 0.001 * DtimeC;// Expression of time in seconds
              //  
              DOtime = DtimeC - DtimeO;
              SDOtime = 0.001 * DOtime; // Expression of time in seconds
              //
              DOTotaltime = DOTotaltime + DOtime; 
              SDOTotaltime = 0.001 * DOTotaltime; // Expression of time in seconds
           
              // Display Function Loop Door Close

              // 
              String sOperation = String (Operation);
              String sDOCounter = String (DOCounter);
              String sSDtimeO = String (SDtimeO);
              String sSDtimeC = String (SDtimeC);
              String sSDOtime = String (SDOtime);
  
              // On met en forme la donnée au formar csv, c'est-à dire chaque paramètre séparé par une virgule.
              String donnee = sOperation + "," + sDOCounter + "," + sSDtimeO + "," + sSDtimeC + "," + sSDOtime;

              // On enregistre la donnée 
              monFichier = SD.open("donnees.csv", FILE_WRITE); //Maximum 8 caractères avant le .csv
              if (monFichier) {   
                        monFichier.println(donnee);
                        monFichier.close();    
               } 
               else {
                        Serial.println("Impossible d'ouvrir le fichier");
               } 


             
            } //else

        }//if (doorState != lastdoorState)
        
         // save the current state as the last state, for next time through the loop
       lastdoorState = doorState;
        
        // DOOR ****************************************   
       
      } // if (buttonPushCounter % 2 == 1)
  
    
   // Second Press  
   if (buttonPushCounter % 2 == 0) { 
     
       // turn LED BUTTON OFF:
       digitalWrite(ledPinbutton, LOW);
       // turn LED DOOR A OFF:
       digitalWrite(ledPindoor, LOW);

       // Display Function Loop Turn off device
      
       
     } //(buttonPushCounter % 2 == 0)
 
 delay(10);
        
} //void loop

Merci pour votre aide.

vous créez un fichier au démarrage nommé compteur.txt par exemple ( la deuxième fois au redémarrage, il ne sera pas recréé car il existera, il ouvrira donc le fichier existant). Il suffira donc d'incrémenter une variable et de le mettre à jour dans le fichier compteur.txt et de s'en servir pour concaténer votre deuxième nom de fichier pour les logs.

Autre solution: mettre la valeur du compteur en EEprom

Autre solution:

  • mettre le compteur à 0
  • tant que donnees.cvs existe, incrémenter compteur
  • ouvrir donnees.cvs

Une remarque:
donnees1.csv
donnees2.csv
donnees3.csv
.
.
.
donneesn.csv
ne fonctionne que pour 9 fichiers 1 à 9, a cause du nom en 8+3. Pour avoir plus de fichiers:

  • commencer à 0 (10 fichiers)
  • utiliser des lettres au lieu des chiffres (26 fichiers)
  • utiliser un nom sur 6 lettres (100 fichiers de 0 à 99)
  • utiliser un nom sur 5 lettres (1000 fichiers)…

Je voudrai si possible creer un nouveau fichier donnee.csv à chaque redermarage de l' arduino.

On peut savoir pourquoi? (c'est possible d'ouvrir un fichier en mode 'ajout à la fin')

vileroi:
Autre solution:

  • mettre le compteur à 0
  • tant que donnees.cvs existe, incrémenter compteur
  • ouvrir donnees.cvs

Une remarque:
donnees1.csv
donnees2.csv
donnees3.csv
.
.
.
donneesn.csv
ne fonctionne que pour 9 fichiers 1 à 9, a cause du nom en 8+3. Pour avoir plus de fichiers:

  • commencer à 0 (10 fichiers)
  • utiliser des lettres au lieu des chiffres (26 fichiers)
  • utiliser un nom sur 6 lettres (100 fichiers de 0 à 99)
  • utiliser un nom sur 5 lettres (1000 fichiers)…

Merci Beaucoup cette solution me paraît très logique, Pouviez-vous m 'aider sur le code je suis débutant je ne maitrise pas bien le code arduino.

Voici une partie du code que je commence à écrire.

// SSD Lib
#include <SPI.h>
#include <SD.h>
#define CS_PIN 10
File monFichier;

int compt = 0;

void setup() {

var = 0;
while(SD.exists(donnees(compt))){  

  compt = compt+1; // incrémente Compt
}

// put your setup code here, to run once:
Serial.print("Initialisation de la carte SD en cours ...");

   if (!SD.begin()) {
    Serial.println("L'initialisation de la carte SD a echoue !");  
    return;
    }
    Serial.println("L'initialisation de la carte SD a reussie !");
    
    monFichier = SD.open("donnees(compt).csv", FILE_WRITE);
    if (monFichier) {   
    monFichier.println("Ouverture,T.Ouverture,T. Fermeture,Durée,D. Cumulée,%");
    monFichier.close();    
    } 
}

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

}

Merci beaucoup

Faut lire un tuto sur le C et les chaînes de caractère ça ne marche pas comme Python

Et Regardez du côté de sprintf() pour fabriquer le nom du fichier