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+!