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

Il faut sortir la définition de la fonction filename en dehors de la loop : je l'ai même carrément enlevée car elle ne sert plus...

// 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 = "AnaBell";       // nom du reseau de config
const char* password = "12345678";  // 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();
}

void setup()  // xxxxxxxxxxxxxxxxxxxxxxxxxxx SETUP xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
{
  Serial.begin(115200);
  matrix.begin();
  matrix.setTextWrap(false);     // choix du texte qui tourne en boucle
  pinMode(ONBOARD_LED, OUTPUT);  // led interne

  // Définition du Wifi en mode Station
  WiFi.mode(WIFI_STA);
  delay(1000);
  Serial.println("\n");
  if (!wm.autoConnect(ssid, password))       // Test d'auto-connexion
    Serial.println("Erreur de connexion.");  // Si pas de connexion
  else
    Serial.println("Connexion etablie !");  // Si connexion
  Serial.println();
  Serial.print("Nom du reseau WiFi: ");
  Serial.println(ssid);
  Serial.print("Adresse IP de la page web: ");
  Serial.println(WiFi.localIP());
  serveur.on("/", handle_root);
  serveur.begin();
  Serial.println("Le serveur web est en fonction.");
  configTime(decalage * 3600, 0, "fr.pool.ntp.org");  //serveurs NTP france
  Serial.print("Attente date et heure");
  while (time(nullptr) <= 100000) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println();
  Serial.println("Pret.");
  // Verif carte SD
  Serial.print("Initialisation de la carte SD...");
  if (!SD.begin(5)) {  //  CS du lecteur de carte branché à GPIO5
    Serial.println("echec!");
    while (1)
      ;
  }
  Serial.println("reussie");
  // fin SD



  // ftp
#define WIFI_SSID ssid
#define WIFI_PASS password

  char ftp_server[] = "fxxxxfr";
  char ftp_user[] = "axxxxxxxxt";
  char ftp_pass[] = "0xxxxxxxxx";

  // you can pass a FTP timeout and debbug mode on the last 2 arguments
  ESP32_FTPClient ftp(ftp_server, ftp_user, ftp_pass, 5000, 2);
  //fin ftp

  // debut prog ftp
  //WiFi.begin( WIFI_SSID, WIFI_PASS );
  Serial.println("Connecting Wifi...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  ftp.OpenConnection();

  // Get directory content
  ftp.InitFile("Type A");
  String list[128];
  ftp.ChangeWorkDir("/Mesures/");
  ftp.ContentList("", list);
  Serial.println("\nDirectory info: ");
  for (int i = 0; i < sizeof(list); i++) {
    if (list[i].length() > 0)
      Serial.println(list[i]);
    else
      break;
  }

  // Make a new directory
  //ftp.InitFile("Type A");
  //ftp.MakeDir("my_new_dir");

  // Create the new file and send the image
  //ftp.ChangeWorkDir("my_new_dir");
  //ftp.InitFile("Type I");
  //ftp.NewFile("octocat.jpg");
  //ftp.WriteData( octocat_pic, sizeof(octocat_pic) );
  //ftp.CloseFile();

  // Create the file new and write a string into it
  ftp.InitFile("Type A");
  ftp.NewFile("hello_world.txt");
  ftp.Write("Hello World");
  ftp.CloseFile();
  ftp.CloseConnection();

  // fin prog FTP




  digitalWrite(2, HIGH);  //allume led ESP en fin setup
}


// xxxxxxxxxxxxxxxxxxxxxxxxx   LOOP   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void loop() {
  // Variation intensité Leds

  lightReading = analogRead(lightPin);
  lightReading = lightReading + 170;
  ledBrightness = lightReading / 17;
  if (ledBrightness <= 10) ledBrightness = 1;
  matrix.setBrightness(ledBrightness);

  // Calcul du niveau en dB(a)

  float voltageValue;
  int dbValue;     // nombres entier pour sonometre
  float dbValTxt;  // nombres à décimale pour fichier SD
  voltageValue = ((analogRead(SoundSensorPin) / 4094.0) * VREF) + 0.82;
  dbValue = (voltageValue * 35);   //converti le voltage en decibel
  dbValTxt = (voltageValue * 35);  //converti le voltage en decibel

  // DEBUT PROG MATRICE LEDS

  // couleur des leds en fonction du niveau dB
  matrix.fillScreen(0);                              //  efface ecran
  matrix.setTextColor(matrix.Color(200, 200, 200));  // blanc
  if (dbValue >= 50)
    matrix.setTextColor(matrix.Color(0, 200, 0));  // jaune
  if (dbValue >= 70)
    matrix.setTextColor(matrix.Color(200, 200, 0));  // vert
  if (dbValue >= 80)
    matrix.setTextColor(matrix.Color(255, 100, 0));  // orange
  if (dbValue >= 90)
    matrix.setTextColor(matrix.Color(255, 0, 0));  // rouge

  // petits carracteres pour dB sur 2 lignes
  matrix.setTextSize(1);
  matrix.setCursor(25, 0);
  matrix.print("d");
  matrix.setCursor(25, 9);
  matrix.print("B");

  // affichage du niveau en grands carracteres pour sup 100
  if (dbValue >= 100) matrix.fillScreen(0);
  if (dbValue >= 100) m = -2;
  else m = 0;
  matrix.setCursor(m, 1);
  matrix.setTextSize(2);
  matrix.print(dbValue);

  // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx     104 dB
  if (dbValue == 104) {
    matrix.setTextSize(1);
    matrix.fillScreen(0);
    matrix.setTextColor(matrix.Color(255, 0, 0));
    for (int x = 31; x >= -81; x -= 1) {
      matrix.setCursor(x, 9);
      matrix.print("Dose max/jour");
      matrix.setCursor(1, 1);
      if (dbValue == 104)  // vraiment utile ??
        matrix.print("104dB");
      matrix.show();
      delay(80);
      matrix.fillScreen(0);
    }
    matrix.setCursor(1, 1);
    matrix.print("104dB");
    matrix.show();
    delay(500);

    matrix.setCursor(2, 9);
    matrix.print("1m22s");
    matrix.show();
    delay(5000);
  }
  // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx     105 dB
  if (dbValue == 105) {
    matrix.setTextSize(1);
    matrix.fillScreen(0);
    matrix.setTextColor(matrix.Color(255, 0, 0));
    for (int x = 31; x >= -81; x -= 1) {
      matrix.setCursor(x, 9);
      matrix.print("Dose max/jour");
      matrix.setCursor(1, 1);
      if (dbValue == 105) matrix.print("105dB");
      matrix.show();
      delay(80);
      matrix.fillScreen(0);
    }
    matrix.setCursor(1, 1);
    matrix.print("105dB");
    matrix.show();
    delay(500);

    matrix.setCursor(4, 9);
    matrix.print("1min");
    matrix.show();
    delay(5000);
  }
  // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx     106 dB
  if (dbValue == 106) {
    matrix.setTextSize(1);
    matrix.fillScreen(0);
    matrix.setTextColor(matrix.Color(255, 0, 0));
    for (int x = 31; x >= -81; x -= 1) {
      matrix.setCursor(x, 9);
      matrix.print("Dose max/jour");
      matrix.setCursor(1, 1);
      if (dbValue == 106) matrix.print("106dB");
      matrix.show();
      delay(80);
      matrix.fillScreen(0);
    }
    matrix.setCursor(1, 1);
    matrix.print("106dB");
    matrix.show();
    delay(500);

    matrix.setCursor(3, 9);
    matrix.print("49sec");
    matrix.show();
    delay(5000);
  }
  // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx     107 dB
  if (dbValue == 107) {
    matrix.setTextSize(1);
    matrix.fillScreen(0);
    matrix.setTextColor(matrix.Color(255, 0, 0));
    for (int x = 31; x >= -81; x -= 1) {
      matrix.setCursor(x, 9);
      matrix.print("Dose max/jour");
      matrix.setCursor(1, 1);
      if (dbValue == 107) matrix.print("107dB");
      matrix.show();
      delay(80);
      matrix.fillScreen(0);
    }
    matrix.setCursor(1, 1);
    matrix.print("107dB");
    matrix.show();
    delay(500);

    matrix.setCursor(3, 9);
    matrix.print("41sec");
    matrix.show();
    delay(5000);
  }
  // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx     108 dB
  if (dbValue == 108) {
    matrix.setTextSize(1);
    matrix.fillScreen(0);
    matrix.setTextColor(matrix.Color(255, 0, 0));
    for (int x = 31; x >= -81; x -= 1) {
      matrix.setCursor(x, 9);
      matrix.print("Dose max/jour");
      matrix.setCursor(1, 1);
      if (dbValue == 108) matrix.print("108dB");
      matrix.show();
      delay(80);
      matrix.fillScreen(0);
    }
    matrix.setCursor(1, 1);
    matrix.print("108dB");
    matrix.show();
    delay(500);

    matrix.setCursor(3, 9);
    matrix.print("35sec");
    matrix.show();
    delay(5000);
  }
  // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx     109 dB
  if (dbValue == 109) {
    matrix.setTextSize(1);
    matrix.fillScreen(0);
    matrix.setTextColor(matrix.Color(255, 0, 0));
    for (int x = 31; x >= -81; x -= 1) {
      matrix.setCursor(x, 9);
      matrix.print("Dose max/jour");
      matrix.setCursor(1, 1);
      if (dbValue == 109) matrix.print("109dB");
      matrix.show();
      delay(80);
      matrix.fillScreen(0);
    }
    matrix.setCursor(1, 1);
    matrix.print("109dB");
    matrix.show();
    delay(500);

    matrix.setCursor(3, 9);
    matrix.print("23sec");
    matrix.show();
    delay(5000);
  }
  // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx     110 dB
  if (dbValue == 110) {
    matrix.setTextSize(1);
    matrix.fillScreen(0);
    matrix.setTextColor(matrix.Color(255, 0, 0));
    for (int x = 31; x >= -81; x -= 1) {
      matrix.setCursor(x, 9);
      matrix.print("Dose max/jour");
      matrix.setCursor(1, 1);
      if (dbValue == 110) matrix.print("110dB");
      matrix.show();
      delay(80);
      matrix.fillScreen(0);
    }
    matrix.setCursor(1, 1);
    matrix.print("110dB");
    matrix.show();
    delay(500);

    matrix.setCursor(3, 9);
    matrix.print("20sec");
    matrix.show();
    delay(5000);
  }

  delay(500);  // temps d'affichage du sonometre
  matrix.show();
  matrix.fillScreen(0);
  // FIN DE PROG MATRICE LEDS
  // Mise à jour du fichier sur la carte SD
  int nouvelleMesure;   // necessaire à
  time_t heureMesure;   // la carte Sd
  struct tm* timeinfo;  // et pour la page web
  nouvelleMesure = dbValTxt;

  if ((millis() - derniereMesure) >= delaiEnSecondes * 1000)  // nouvelle toute les 1 secondes
  {
    Serial.print(dbValTxt, 2);   // aide a la prog
    Serial.println(" dB(a)");    // avec visu
    Serial.print(voltageValue);  // dans le moniteur
    Serial.println(" volts");    // Serie

    time(&heureMesure);  // indique l'heure
    timeinfo = localtime(&heureMesure);
  }

  char message[100];
  sprintf(message, "%d-%d-%d;%d:%d:%d;%.2f; \n",
          timeinfo->tm_mday, timeinfo->tm_mon + 2, timeinfo->tm_year + 1900, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, dbValTxt);

  char filename[22];
  strftime(filename, sizeof(filename), "/mesures_%Y-%m.csv", timeinfo);
  Serial.print("Verif nom de fichier : ");
  Serial.println (filename);

  appendFile(SD, filename, message);
}

Comme ça, chez moi, ça compile bien.

J'ai commenté deux lignes au début qui (à mon avis) ne servent à rien :

//#include "ESP8266FtpServer.h"
//FtpServer ftpSrv;

et ajouté un print pour voir si le nom du fichier créé est bien celui qui est attendu :

  Serial.print("Verif nom de fichier : ");
  Serial.println (filename);

Si ça marche, tu pourras les enlever.
A+!