Go Down

Topic: ESP32 pb avec SPIFFS  (Read 881 times) previous topic - next topic

rjnc38

Apr 11, 2019, 11:25 am Last Edit: Apr 11, 2019, 11:27 am by rjnc38
Bonjour,
pour des projets futurs je commence par tester SPIFFS OTA et les outils IDE sketch data upload et  esp8266FTPserver sur un D1 mini avec 4Mo dont 2Mo configurés en Spiffs ( IDE 1.8.8 )
je télécharge ce sketch
Code: [Select]
#ifdef ESP8266
#include <ESP8266WiFi.h>
#elif defined ESP32
#include <WiFi.h>
#include "SPIFFS.h"
#endif
#include <ArduinoOTA.h>
#include <FS.h> // FOR SPIFFS
#define FTP
#include <ESP8266FtpServer.h>  // https://github.com/nailbuster/esp8266FTPServer
#define ssid      "....."       // WiFi SSID
#define password  "....."  // WiFi password
IPAddress ip(192, 168, 0, 221);
IPAddress gateway(192, 168, 0, 254);
IPAddress subnet(255, 255, 255, 0);
IPAddress dns(192, 168, 0, 254);
const static String espName = "esp.txt";
const static String ideName = "ide.txt";
const static String ftpName = "ftp.txt";
File f;

#ifdef FTP
FtpServer ftpSrv;   //set #define FTP_DEBUG in ESP8266FtpServer.h to see ftp verbose on serial
#endif

void setup(void) {
  Serial.begin(115200);
  WiFi.config(ip, dns, gateway, subnet);
  WiFi.begin(ssid, password);
  Serial.println(F("demarrage ESP"));

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  Serial.println (F( "debut OTA" ));
  ArduinoOTA.setHostname("ESPtest"); // on donne une petit nom a notre module
  ArduinoOTA.begin(); // initialisation de l'OTA

  /////FTP Setup, ensure SPIFFS is started before ftp;  /////////
#ifdef ESP32       //esp32 we send true to format spiffs if cannot mount
  if (SPIFFS.begin(true)) {
#elif defined ESP8266
  if (SPIFFS.begin()) {
#endif
    Serial.println("SPIFFS ouvert!");
    #ifdef FTP
    ftpSrv.begin("esp32", "esp32");   //username, password for ftp.  set ports in ESP8266FtpServer.h  (default 21, 50009 for PASV)
    Serial.println("FTP demarre!");
    #endif
  }
  f = SPIFFS.open(espName, "r");
  if (!f) espinit(); // il existe pas on le crée avec une ligne
  else espwrite(); // il existe on rajoute une ligne
  espread();
  delay(10);


  f = SPIFFS.open(ideName, "r");
  if (!f) Serial.println("ide.txt not found!");
  else  Serial.println("ide.txt opened!");
  f.close();
  delay(10);


  f = SPIFFS.open(ftpName, "r");
  if (!f) Serial.println("ftp.txt not found!");
  else  Serial.println("ftp.txt opened!");
  f.close();
  delay(10);

}
void loop(void) {
  ArduinoOTA.handle();

  #ifdef FTP
  ftpSrv.handleFTP();        //make sure in loop you call handleFTP()!!
  #endif

}


//--------------------------------------- S/P fichier ESP -----------------------------------------------------
void espinit() {
  f = SPIFFS.open(espName, "w");
  if (!f) {
    Serial.println(F("Please wait 30 secs for SPIFFS to be formatted"));
    SPIFFS.format();
    Serial.println(F("Spiffs formatted"));
    f = SPIFFS.open(espName, "w");
    Serial.println(F("esp.txt crée"));
    f.close();
  }
  else espwrite();

} //---------------------------------- fin  espinit()--------------------------------------------------------------

void espwrite() {
  Serial.println(F("====== Ecriture fichier esp.txt ========="));
  f = SPIFFS.open(espName, "a");
  f.println( "test esp");
  Serial.print(F("esp.txt modifie : "));
  Serial.print(f.size());
  Serial.println(F(" bytes"));
  f.close();
}//---------------------------------- fin  espwrite()--------------------------------------------------------------

void espread() {
  Serial.print(F("Lecture fichier esp.txt : "));
  f = SPIFFS.open(espName, "r");
  Serial.print(f.size());
  Serial.println(F(" bytes"));
  while (f.available()) {
    //Lets read line by line from the file
    String line = f.readStringUntil('\n');
    Serial.println(line);
  }
  f.close();
} //------------------------------------------------- fin espread()-----------------------------------------------

dans mon dossier j'ai fais un sous-dossier data dans lequel j'ai mis un fichier ide.txt qui contient juste "test ide"
je télécharge le sketch puis par l'outil IDE le contenu de data (donc le fichier ide.txt)
je démarre l'esp et la console me dit qu'il modifie esp.txt mais ne trouve pas ide.txt et ftp.txt
par FileZilla je me connecte en FTP à l'esp32 je retrouve bien mon fichier ide.txt et je peux y rajouter (pas toujours car le ftp est capricieux) un fichier ftp.txt mais je ne vois pas le fichier esp.txt
je démarre l'esp et la console me dit qu'il modifie esp.txt mais ne trouve pas ide.txt et ftp.txt
l'OTA fonctionne très bien

j'en déduit que je suis dans deux zones distincts de la Spiffs  (fichiers IDE & FTP / fichier ESP) mais je ne vois pas ou est mon erreur ....


J-M-L

#1
Apr 11, 2019, 12:46 pm Last Edit: Apr 11, 2019, 12:48 pm by J-M-L
essayez avec un '/' en début de nom de fichier (et au lieu de faire des static String utilisez des char *)
Code: [Select]
const char* espName = "/esp.txt";
const char* ideName = "/ide.txt";
const char* ftpName = "/ftp.txt";
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

rjnc38

Bingo JML : le "/" fait tout

pour les String je vais les enlever petit a petit mais il est vrai qu'on trouve plein de tuto avec, pour les "hardeux" comme moi c'est plus simple et sur ESP on a un peu de place mémoire ... 

encore merci bcp

dbrion06

La grosse critique des Strings tels qu'ils sont utilisés par l'Arduino et ses dérivés ne réside pas dans la consommation mémoire, mais dans la fragmentation (un PC /RPi a les mécanismes de ramasse miettes.. pas un avr/esp) qui fonctionne comme une fuite mémoire (un cauchemar pour les PC, qui ont des traqueurs de telles fuites ), pouvant faire tourner en bourrique au bout de semaines de fonctionnement en apparnace satisfaisant (un temps bien plus long que les temps de mise au point classiques)

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

rjnc38

bon ça marche mais il y a un mais ...
imaginons un projet ou il y a un fichier de paramètres (transmis par l'outil IDE au début) et un fichier de log de mesures rempli lors du fonctionnement
si on veut faire une évolution du fichier de paramètres l'outil IDE va écraser le fichier de log, c'est pour cela que j'essayais le FTP mais avec FilleZilla ça fonctionne une fois sur dix et encore (il crée bien le fichier mais ne transfère pas le contenu) ....

comment feriez vous ?

PS le projet en vu : un pèse ruche identifiées par RFID à partir d'un simple pèse bagage hacké

 

hbachetti

#6
Apr 12, 2019, 10:19 am Last Edit: Apr 12, 2019, 02:50 pm by hbachetti
Quote
si on veut faire une évolution du fichier de paramètres l'outil IDE va écraser le fichier de log
Un fichier de log n'est pas fait pour être envoyé mais plutôt être récupéré par le PC.

FTP : tu as trouvé quelque chose qui marche ? moi non.

Éventuellement, j'ai développé une solution à base de serveur HTTP pour récupérer des logs.

arduino-esp8266-et-esp32-une-librairie-logger

Le code se trouve sur bitbucket : https://bitbucket.org/henri_bachetti/mpp-console-logger.git

voir l'exemple ESP32-spiffs-http-server

Cet exemple utilise un logger avec des fichiers tournants sur SPIFFS, et les fichiers sont récupérables / visualisables par HTTP.

Je ne sais pas si tu disposes d'une solution pour renseigner les logs, mais ce que j'ai développé est inspiré de PYTHON et peut être intéressant pour ton cas.
Sinon, si seule la partie récupération et affichage des logs t'intéresse, tu peux te servir (regarde handleLogs()).

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

hbachetti

Je me pose quand même la question de l'alimentation.
Un ESP32 visible en permanence sur le réseau consomme pas mal.
Je ne sais pas ce que tu as prévu pour la ruche ?
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

rjnc38

alors pour être un peu plus précis sur le projet : pour un apiculteur le poids (et son évolution) d'une ruche est le critère le plus important après l'observation de la planche d'envol

la méthode classique est de passer derrière chaque ruche et de la soupeser et au doigt mouillé dire "c'est bon elle va pouvoir passer l'hiver" ou "il faut que je les aide a faire des réserves"; Plus précis c'est papier crayon et pèse bagage et remplir un tableau pour voir l'évolution

le projet est donc un outil portable, autonome, rechargeable pour identifier la ruche (rfid) et mémoriser la date et le poids sur une période de 3 ou 4 mois avec un petit afficheur qui me donne les 4 dernière mesures pour que je puisse décider de nourrir ou pas la ruche
Après on peu envisager de restituer ces mesures sous une forme de graphique quand on retourne à la maison mais pas forcement d'archiver ces mesures sur une base de données ...
donc pas question de faire une ruche informatisée comme mon premier projet

hbachetti

#9
Apr 12, 2019, 02:50 pm Last Edit: Apr 12, 2019, 02:51 pm by hbachetti
Oups, je m'aperçois que j'ai copié collé n'importe quoi en quote dans mon post #6. C'est corrigé.

OK, je vois mieux. Donc ce n'est pas un montage destiné à rester sous la ruche en permanence.
Cela poserait certainement un problème de portée WIFI.

Il y a suffisamment de place dans le système de fichiers SPIFFS pour stocker pas mal de données.
Sinon, sur une SD il y en a encore plus.

Rien ne s'oppose donc à développer un serveur HTTP sur l'ESP32 qui expose les résultats sur une page WEB avec graphiques (des objets HighCharts par exemple).

Dans ce cas, les fichiers log ne sont pas vraiment nécessaires, sauf pour éventuellement les sauvegarder quelque part.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

icare

Bonjour,
Il y a un article intéressant sur le sujet dans Hackable n°28 page 30.
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

Go Up