Envoi fichier texte: nécessité ou non d'une carte SD?

bonjour tout le monde,

je souhaite transmettre (depuis un client ftp/nanoesp32) un petit fichier texte comprenant la date et une variable numérique:
est-il possible de l'envoyer directement, ou bien faut-il créer le fichier, l'enregistrer sur une carte mémoire externe, puis l'envoyer?
Cordialement
b-g-jp

Bonjour

la carte SD n’est pas indispensable, le fichier peut être enregistré dans la mémoire Flash en utilisant l’un des systèmes de fichiers disponibles pour ESP32 : Spiffs ou LIttleFS, des exemples sont disponibles ainsi que des tutoriels

merci, avec ces indications je vais pouvoir avancer dans le bon sens

quelle bibliothèque FTP utilisez vous ? généralement on peut balancer directement un buffer mémoire, donc pas besoin de fichier du tout.

par exemple (avec une API plus ou moins proche de celle de votre bibliothèque)

  char buffer[128];
  snprintf(buffer, sizeof(buffer),
           "%04d-%02d-%02d %02d:%02d:%02d | Tension=%.2f V\n",
           annee, mois, jour, heure, minute, seconde, tension);

  ftp.OpenConnection(ftpServer, ftpUser, ftpPass, 21);
  ftp.AppendFile("/data/mesures.txt");
  ftp.WriteData((uint8_t*)buffer, strlen(buffer));
  ftp.CloseFile();
  ftp.CloseConnection();

ça rajouterait à la fin du fichier /data/mesures.txt la ligne fabriquée avec le buffer (date, heure, mesure de la tension)


PS: ne postez pas les questions techniques dans la catégorie "Le bar". J'ai déplacé votre post pour cette fois. Merci

je n'ai pas encore choisi de client ftp, domaine que je n'ai pas encore exploré, mais qui m'est nécessaire pour l'évolution d'une réalisation opérationnelle (envoi de valeurs d'un compteur par mail) vers un stockage des valeurs sur un serveur ftp externe
Je vais étudier votre suggestion

PS: merci d'avoir déplacé mon post, créé un peu trop vite dans celui des trois sous-forums le moins inadapté...

je suis bien sûr preneur de tout conseil concernant le client ftp, qui peut être basique

Je n’ai pas de reco particulière, je n’ai pas cette carte mais prenez une simple pour ESP32 ça devrait le faire

ok, je vais tester et rendrai compte
Belle soirée

j'ai essayé d'adapter les suggestions de J-M-L avec les bibliothèques utilisées dans mon projet:
Arduino, WiFi, WiFiClientSecure, SPIFFS, FTPClient et time, mais sans beaucoup de réussite: j'arrive bien à créer un fichier sur un serveur ftp avec un nom fixe, mais n'arrive pas à ajouter au nom la date, ni à écrire dans ce fichier la valeur du compteur - de coupures d'une barrière IR- que ce soit avec buffer, ou avec String (counter), qui produisent chaque fois des erreurs de compilation...
Bref, je patine... en rond, et suis preneur de toute piste

le programme en cours de test:
(merci d'avance pour toute idée)

#include <Arduino.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <SPIFFS.h>
#include <FTPClient.h>
#include <time.h>

#define WIFI_SSID "xxxxxxxxxx"
#define WIFI_PASSWORD "xxxxxxxxxx"

#define FTP_SERVER_ADDRESS    "xxxxxxxxxx"
#define FTP_SERVER_PORT       21
#define FTP_USER_NAME         "xxxxxxxxxx"
#define FTP_USER_PASSWORD     "xxxxxxxxxx"

WiFiClientSecure ssl_client;

const int buttonPin = 2; // sortie du relais IR (état haut = faisceau coupé) 
const int resetPin = 3;
int counter = 0;
int buttonState = 0;      // état du relais IR (Haut ou Bas)
int lastButtonState = 0;  // dernier état du relais IR

boolean compteurAun = false;

const char* timezone = "CET-1CEST,M3.5.0,M10.5.0/3";

const int task1Hour = 20;
const int task1Minute = 0;
const int task2Hour = 20;
const int task2Minute = 30;
int lastRunDayTask1 = -1;
int lastRunDayTask2 = -1;

unsigned long lastNTPUpdate = 0;
const unsigned long ntpSyncInterval = 60 * 60 * 1000;

void syncTime() {
  Serial.print("synchro horloge NTP");
  configTime(0, 0, "pool.ntp.org", "time.nist.gov");
  time_t now = time(nullptr);
  while (now < 24 * 3600) {
    delay(100);
    now = time(nullptr);
  }
  Serial.println(" ok");
  setenv("TZ", timezone, 1);
  tzset();
  lastNTPUpdate = millis();
}

void setup() {
Serial.begin(115200);
Serial.println("\n");

WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(300);
}
Serial.println();
Serial.println("connecté IP: " + WiFi.localIP().toString());

WiFiClient tcp_client,passive_tcp_client;
FTPClient ftp_client(&tcp_client,&passive_tcp_client);
if (ftp_client.open(FTP_SERVER_ADDRESS,FTP_SERVER_PORT,FTP_USER_NAME,FTP_USER_PASSWORD))Serial.println("ok");
else Serial.println("ko");

Serial.print("création fichier: ");
char text_to_write[]="test\n";
if (ftp_client.write_file("test.txt",(uint8_t*) text_to_write,strlen(text_to_write)+1)) Serial.println("ok");
else Serial.println("ko");

delay (2000);

Serial.print("Append to file: ");
char text_to_append[]= "texte detest\n";
if (ftp_client.append_file("test.txt",(uint8_t*) text_to_append,strlen(text_to_append)+1)) Serial.println("ok");
else Serial.println("ko");

ssl_client.setInsecure();
syncTime();
pinMode(buttonPin, INPUT);
pinMode(resetPin, INPUT);
bool buttonPressed = false;  // flag la coupure IR
}

void loop() {
  int buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    counter++;
    Serial.println(counter);
    delay(2000);
  }

 lastButtonState = buttonState;
 
    time_t now = time(nullptr);
  struct tm timeinfo;
  localtime_r(&now, &timeinfo);
 
  if (millis() - lastNTPUpdate > ntpSyncInterval) syncTime();

  delay(1000);
}

avec ce code le "texte de test" créé dans le fichier est en caractères chinois... :thinking:

si vous faites +1 vous prenez le caractère nul de fin de chaîne. Vous ne voulez pas l'envoyer, vous voulez juste envoyer votre texte avec le \n qui va faire le passage à la ligne - sinon votre fichier destination aura plein de caractères nuls disséminés à chaque fin de ligne


avec ça dans le setup, vous ne touchez pas la variable globale

ça sera viré par le compilateur.


idem votre client FTP

est local à au setup...

il y a du ménage à faire... (je suis toujours sur mon tel donc je ne peux pas tester pour le moment)

merci pour ces remarques, bien prises en compte

bonsoir à tous,
je poste le code du projet en ayant pris en compte les remarques de J-M-L, mais sans arriver à un code exploitable qui permettrait de créer un fichier sur un ftp distant lorsque l'heure de cette tâche sera détectée dans loop
Merci d'avance pour toute suggestion

#include <Arduino.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <SPIFFS.h>
#include <FTPClient.h>
#include <time.h>

#define WIFI_SSID "xxxxxxxxxx"
#define WIFI_PASSWORD "xxxxxxxxxx"

#define FTP_SERVER_ADDRESS    "xxxxxxxxxx"
#define FTP_SERVER_PORT       21
#define FTP_USER_NAME         "xxxxxxxxxx"
#define FTP_USER_PASSWORD     "xxxxxxxxxx"

WiFiClientSecure ssl_client;

const int buttonPin = 2; // sortie du relais IR (état haut = faisceau coupé) 
const int resetPin = 3;
int counter = 0;
int buttonState = 0;      // état du relais IR (Haut ou Bas)
int lastButtonState = 0;  // dernier état du relais IR

boolean compteurAun = false;

const char* timezone = "CET-1CEST,M3.5.0,M10.5.0/3";

const int task1Hour = 20;
const int task1Minute = 0;
int lastRunDayTask1 = -1;

unsigned long lastNTPUpdate = 0;
const unsigned long ntpSyncInterval = 60 * 60 * 1000;

void syncTime() {
  Serial.print("synchro horloge NTP");
  configTime(0, 0, "pool.ntp.org", "time.nist.gov");
  time_t now = time(nullptr);
  while (now < 24 * 3600) {
    delay(100);
    now = time(nullptr);
  }
  Serial.println(" ok");
  setenv("TZ", timezone, 1);
  tzset();
  lastNTPUpdate = millis();
}

WiFiClient tcp_client,passive_tcp_client;
FTPClient ftp_client(&tcp_client,&passive_tcp_client);
if (ftp_client.open(FTP_SERVER_ADDRESS,FTP_SERVER_PORT,FTP_USER_NAME,FTP_USER_PASSWORD))Serial.println("ok");
else Serial.println("ko");

Serial.print("création fichier: ");
char text_to_write[]="test\n";
if (ftp_client.write_file("test.txt",(uint8_t*) text_to_write,strlen(text_to_write))) Serial.println("ok");
else Serial.println("ko");

Serial.print("Append to file: ");
char text_to_append[]= "texte de test\n";
if (ftp_client.append_file("test.txt",(uint8_t*) text_to_append,strlen(text_to_append))) Serial.println("ok");
else Serial.println("ko");

void dailyTask1() {
Serial.println(counter);
// code pour création/FTP fichier avec date et valeur counter
}

void setup() {
Serial.begin(115200);
Serial.println("\n");

WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(300);
}
Serial.println();
Serial.println("connecté IP: " + WiFi.localIP().toString());

ssl_client.setInsecure();
syncTime();
pinMode(buttonPin, INPUT);
pinMode(resetPin, INPUT);

}

void loop() {
  int buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    counter++;
    Serial.println(counter);
    delay(2000);
  }

 lastButtonState = buttonState;
 
    time_t now = time(nullptr);
  struct tm timeinfo;
  localtime_r(&now, &timeinfo);
 
 if (timeinfo.tm_hour == task1Hour && timeinfo.tm_min == task1Minute && lastRunDayTask1 != timeinfo.tm_mday) {
    dailyTask1();
    lastRunDayTask1 = timeinfo.tm_mday;
  }

  if (millis() - lastNTPUpdate > ntpSyncInterval) syncTime();

  delay(1000);
}

bool buttonPressed = false;  // flag la coupure IR