Besoin de dater un fichier sur carte SD (annéemois.txt)

Bonjour à tous, j'ai reussi à "coder" 90 % de mon projet qui consiste en collecter des données seconde par seconde, les stocker sur une carte SD.
le controleur esp est connecté au web et il devra exporter le fichier SD sous forme annéemois.txt (ou csv) via ftp pour que les données puissent etre exploités par l'accés à une page web.

mais je bloque sur la création du fichier et son changement de nom tout les mois, (202305.txt puis 202306.txt)

j'ai déjà dans mon code la bibliotheque time.h pour horodater les données dans le fichier.

voici la partie du code qui me pose problème:

`// creation fichier horadatage
String filename(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("echec à l'obtention de l'heure !");
    return "";
  }
  char timeString[10];
  strftime(timeString, sizeof(timeString), "%Y-%m", &timeinfo);
  Serial.println(timeString);
  String filename = "/mesures_" + String(timeString) +".csv";
  writeFile(SD, filename, "Hello ");
  return filename; 
}`

comme je vous l'ai dit je suis hyper débutant et j'hésite même dans la position de ces lignes , doivent elle etre dans le setup ?

dans le setup j'ai cette erreur :
Compilation error: a function-definition is not allowed here before '{' token

qui renvoi à la première ligne du code.

merci pour vos conseils je fais de mon mieux pour être clair.

Salut.
On ne définit pas une fonction à l'intérieur d'une autre fonction, bien que certains compilateurs le permettent.
Place la plutôt avant le setup().

ok je l'ai mi avant le setup et l'erreur est : Compilation error: cannot convert 'String' to 'const char*'

C'est pas facile d'aider avec juste un petit morceau de code.
Le message d'erreur que tu donnes est tronqué, on ne sait pas quelle ligne est fautive. C'est peut-être le writeFile qui plante ?

Tu peux utiliser strftime pour créer directement le nom du fichier :

char timeString[22];
strftime(timeString, sizeof(timeString), "/mesures_%Y-%m.csv", timeinfo);

Je ne sais pas s'il faut &timeinfo ou timeinfo : teste les deux...

https://cplusplus.com/reference/ctime/strftime/

EDIT : je déplace dans la section principale.

`// creation fichier horadatage


String filename(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("echec à l'obtention de l'heure !");
    return "";
  }
  char timeString[22];
strftime(timeString, sizeof(timeString), "/mesures_%Y-%m.csv", &timeinfo);

  
  Serial.println(timeString);
  String filename = "/mesures_" + String(timeString) +".csv";
  writeFile(SD, filename, "Hello ");
  return filename; 
}`

et c'est bien write file qui plante ( la ligne est surligné en rouge)

voilà l'erreur : Compilation error: cannot convert 'String' to 'const char*'

D'accord, mais où est défini le reste ? SD, c'est quoi ?
C'est pour éviter ce genre de perte de temps que je te dis qu'il faut fournir le code en entier.

Ici, timeString contient maintenant le nom du fichier en entier, plus besoin de faire ça :
String filename = "/mesures_" + String(timeString) +".csv";

Bonjour,

Il faut que tu convertisses la String en const char *
writeFile(SD, filename.c_str(), "Hello ");

SD c'est ma carte SD et j'essai d'écrire "hello" pour tester
je veux bien TOUT envoyer mais c'est hyper brouillon avec des lignes // pour faire des essais , et en tout ça fait presque 500 lignes...

tu veux que j'envoie tout ce qui y'a avant le setup?

ok j'ai supprimé la ligne qui etait en "double" .....filename = " /mesures....

et ça me donne ça comme erreur : Compilation error: cannot convert 'String ()()' to 'const char '

je poste le code avant le setup :


// BIBLIOTHEQUES ET CONSTANTES
 
 #include "Arduino.h" // lib arduino
 // debut prog FTP
 #ifdef ESP8266       // utilisation lib esp8266 pour le FTP
 #include <ESP8266WiFi.h> 
 #elif defined ESP32
 #include <WiFi.h>
 #include "SPIFFS.h"
 #endif
 #include "ESP8266FtpServer.h"
 FtpServer ftpSrv;  
 // fin ftp

 #include <WiFiClient.h> 
 #include <ESP32_FTPClient.h>
 
 #include <WiFiManager.h>  // Utilisation de la librairie WiFiManager.h
 #include <Adafruit_NeoMatrix.h> // Biblio matrice Leds
 #include "FS.h"// bibliothèques pour le lecteur de carte SD:
 #include <SPI.h>// bibliothèques pour le lecteur de carte SD:
 #include <SD.h>// bibliothèques pour le lecteur de carte SD:
 #include "WiFi.h"// bibliothèques pour la communication WiFi
 #include <WebServer.h>// bibliothèques pour la communication WiFi
 #include <time.h> // bibliothèque pour l'affichage de la date et de l'heure

 #define ONBOARD_LED  2
 #define SoundSensorPin 39  // entrée sig analogique carte son 39(A3),
 #define VREF 5.0   // voltage ref entrée carte son

 int lightPin = 36;// entrée analogique pour lecture lumiere ambiante
 int lightReading;// var pour luminosité
 int ledBrightness;// var pour luminosité
 int m; // m variable pour decaler l'affichage qd 100 dB ou Sup  
 int x;// x variablepour texte defilant

 Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32,16,22,  
 // 32 nb de colonne, 16 nb de ligne, pin sortie 22
  NEO_MATRIX_BOTTOM  + NEO_MATRIX_RIGHT  +  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,  NEO_GRB + NEO_KHZ800);

 // constantes
 WiFiManager wm;   // Définition du nom du WifiManager = wm
 const char* ssid = "AXXXXXX";  // nom du reseau de config
 const char* password = "1XXXXXX";  // Mot de passe 
 const int delaiEnSecondes = 1; // secondes entre deux mesures consécutives
 const int decalage = 1;  // la valeur dépend de votre fuseau horaire.

 unsigned long derniereMesure;  // derniere fois qu'une mesure a été prise
 int nb_de_donnees = 0; // nombre de données déjà stockées dans mesures et dateHeure
 
  WebServer serveur(80);
   void handle_root() 
   {   }

// ajout d'information sur le fichier dans la carte SD
    void appendFile(fs::FS &fs, const char * path, const char * message) {
    Serial.printf("Ecriture dans le fichier: %s\n", path);
    File file = fs.open(path, FILE_APPEND);
    if (!file) {
    Serial.println("Echec de l'ouverture du fichier");
    return;
  }
    if (file.print(message)) {
    Serial.println("Modification du fichier reussie.");
  } 
    else { Serial.println("Echec de la modification du fichier");
  }
    file.close();
 }

void writeFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Writing file: %s\n", path);

    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("Failed to open file for writing");
        return;
    }
    if(file.print(message)){
        Serial.println("File written");
    } else {
        Serial.println("Write failed");
    }
    file.close();
}

// creation fichier horadatage


String filename(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("echec à l'obtention de l'heure !");
    return "";
  }
  char timeString[22];
strftime(timeString, sizeof(timeString), "/mesures_%Y-%m.csv", &timeinfo);

  
  Serial.println(timeString);
  //String filename = "/mesures_" + String(timeString) +".csv";
  writeFile(SD, filename, "Hello ");
  return filename; 
}

je viens d'essayer : Compilation error: request for member 'c_str' in 'filename', which is of non-class type 'String()'

Soit tu fais ce que propose @kamill, soit tu fais ça :

strftime(timeString, sizeof(timeString), "/mesures_%Y-%m.csv", &timeinfo);
writeFile(SD, timeString, "Hello ");
return String(timeString);

c_str() est bien un membre de la class String.
Peut être que l'erreur est du au fait que la variable filename porte le même nom que la fonction.

super lesept ! j'ai plus d'erreur..... maintenant je vais tester !

mince voilà autre choses!

Connecting......................................

A fatal error occurred: Failed to connect to ESP32: No serial data received.
For troubleshooting steps visit: Troubleshooting - ESP32 - — esptool.py latest documentation
Failed uploading: uploading error: exit status 2

je vais chercher sur le site ce que ça peut etre et je reviens pour vous donner des nouvelles :frowning:

c'est bizare ça ne me le fait que sur l'esp qui me sert aux tests de squetch...
il ne veux plus se connecter avec l'IDE

Tu as changé de câble?
Sinon c'est peut-être que l'ESP a cramé... :thinking:

mes 2 autres esp fonctionnent mais plus celui là..... cramé ? c'est possible ? c'est vrais que je le transporte sans trop le protéger .... (électricité statique? avec un frottement)

dès que j'ai pu avancer je reviens vers vous et j'effacerais ces posts hors sujet, bon week end !

Pas besoin d'effacer, ça comporte de l'information.
En général les cartes ESP32 sont assez robustes mais c'est possible que si tu les portes sans précaution, ça abime un composant

L'ESP reste injoignable...... il doit être HS a cause d'un manque de précaution de ma part.
je vais en commander 1 autre pour continuer à faire mes essais .

En attendant j'ai téléchargé les modifications dans un autre ESP et il n'y a aucun fichier qui se crée sur la carte SD .......