IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

ArduinoNVS ou Preferences - impossible de stocker des String de 80 octets [Arduino ESP32]


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut ArduinoNVS ou Preferences - impossible de stocker des String de 80 octets
    Bonjour à tous.
    N'ayant pas trouvé la solution pour stocker des fichiers de 80 octets sur SPIFFS ou avec LittleFS, j'ai tenté de le faire dans un premier temps en vain avec la librairie ArduinoNVS puis avec Preferences.
    Dans ces deux derniers cas, il parait impossible de stocker plus de 8 octets: l'enregistrement se passe bien mais à la relecture le fichier est vide.
    La routine d'enregistrement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Preferences pref;
     
    //*********Enregistrement en NVS d'un programme complet (10 manip de 8 octets) 6x => Px   x=0 a* 9
    case '6':{
          String tempo="";
          char nFic[3];
          nprog = ci(com[1]); //numero de programme  Conversion ASCII en Numérique
          if(!(nprog>=0 && nprog<=9)) afficErreurs(prg);
          else{                
            nFic[0]= 'P'; nFic[1]=com[1]; nFic[2]='\0';   //numero de fic Px avec x=0 à 9
            for(int i=0;i<80;i++){
             tempo += pg[nprog][i];     //char pg[10][80];   10 programmes de 8*10 manips
            }
            int size = pref.putString(nFic,tempo);   //dans le fichier Px on enregistre tout le programme x
            lcd.clear();lcd.print(size); delay(2000); lcd.clear();
          }
        }
        break;
    Le résultat indique bien le nombre d'octets enregistré.
    Mais à la relecture, l'enregistrement est vide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //****affichage memoire programmee x *****
        case '5':{
          String tempo="";
          char prog[3];
          prog[0]='P'; prog[1]= com[1]; prog[2]='\0';
          tempo = pref.getString(prog,"");
          for(i=0;i<10;i++){
            lcd.clear(); lcd.print(String(prog) + " " + String(i));
            lcd.setCursor(0,1); lcd.print(tempo.substring(i*8,i*8+8));    //affichage par 8 octets
            delai('s',2);
          }
        }
        break;
    Si quelqu'un a une idée pour ce problème.

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Citation Envoyé par mormic Voir le message
    N'ayant pas trouvé la solution pour stocker des fichiers de 80 octets sur SPIFFS
    pourtant ce n'est pas très compliqué. Voici un exemple de code qui crée un ficher avec les lignes numérotées de 0 à 9 suivies d'une valeur aléatoire puis relecture de ce fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include <SPIFFS.h>
     
    const char * nomFichier = "/test.txt";
    File fichier;
     
    void setup() {
      Serial.begin(115200);
     
      if (!SPIFFS.begin(true)) {
        Serial.println("Erreur lors de l'initialisation de SPIFFS");
        return;
      }
     
      // Écriture dans un fichier
      fichier = SPIFFS.open(nomFichier, FILE_WRITE);
      if (!fichier) {
        Serial.println("Erreur lors de l'ouverture du fichier en écriture");
        return;
      }
      Serial.println("--------------------");
      Serial.println("ECRITURE");
     
      for (int i = 0; i < 10; i++) {
        int v = random(100);
        fichier.print(i);
        fichier.write('\t');
        fichier.println(v);
     
        Serial.print(i);
        Serial.write('\t');
        Serial.println(v);
      }
     
      fichier.close();
     
      Serial.println("--------------------");
     
      // relecture du fichier
      Serial.println("RELECTURE");
      fichier = SPIFFS.open(nomFichier, FILE_READ);
      if (!fichier) {
        Serial.println("Erreur lors de l'ouverture du fichier en lecture");
        return;
      }
     
      while (fichier.available()) Serial.write((char) fichier.read());
      fichier.close();
      Serial.println("--------------------");
    }
     
    void loop() {}

    sur mon ESP32 je vois



    --------------------
    ECRITURE
    0 22
    1 12
    2 40
    3 59
    4 81
    5 24
    6 48
    7 87
    8 66
    9 2
    --------------------
    RELECTURE
    0 22
    1 12
    2 40
    3 59
    4 81
    5 24
    6 48
    7 87
    8 66
    9 2
    --------------------

  3. #3
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Bonsoir Jay M
    Je dois avoir un ESP32 spécial car cela ne fonctionne pas.
    Je fais pratiquement la même chose que vous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    const char *nFichier = "/P3.txt";
            File fic;
            fic = SPIFFS.open(nFichier, FILE_WRITE);
            if(!fic){
              afficErreurs(msg12);      //affiche erreur ouverture fichier
              return;
            }
            fic.print(pg[nprog]);        //tableau de char *
            fic.close();
    Et je ne passe même pas le stade de l'ouverture du fichier, j'affiche directement le message d'erreur!

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Comment est configuré votre ESP dans l’ide? Avez vous mis une partition SPIFFS?

    Nom : spiffs.jpg
Affichages : 247
Taille : 304,4 Ko

  5. #5
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Mon IDE est VSCode. Mon fichier platformio.ini:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [env:esp32doit-devkit-v1]
    platform = espressif32
    board = esp32doit-devkit-v1
    board_build.partitions = huge_app.csv
    framework = arduino
    lib_deps = 
    	enjoyneering/LiquidCrystal_I2C@^1.4.0
    	fbiego/ESP32Time@^2.0.4
    	me-no-dev/ESP Async WebServer@^1.2.3
    	me-no-dev/AsyncTCP@^1.1.1
    En outre je charge déjà dans le SPIFFS 3 fichiers de configuration de serveur: index.html, style.css, code.js (qui se trouvent dans le répertoire 'data' du projet).

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    OK vous avez donc une partition SPIFFS de 1Mo

    vous avez bien mis dans le setup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if (!SPIFFS.begin(true)) {
        Serial.println("Erreur lors de l'initialisation de SPIFFS");
        return;
      }
    (le true formatera la partition SPIFFS si pas trouvée)

  7. #7
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Bonjour Jay M; je vous souhaite une bonne année 2024 en vous remerciant de l'aide que vous apportez à ce groupe.

    Pour mon problème, oui j'ai bien mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)){
        lcd.println(msg0);         //"SPIFFS Mount Failed"
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define FORMAT_SPIFFS_IF_FAILED true

  8. #8
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Bonjour JAY M; je vous souhaite une bonne année 2024 en vous remerciant de l'aide que vous apportez à ce groupe.

    Pour mon problème, oui j'ai bien mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)){
        lcd.println(msg0);         //"SPIFFS Mount Failed"
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define FORMAT_SPIFFS_IF_FAILED true

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    et donc au begin() ça plante ?

  10. #10
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    non ce n'est pas au begin que ça plante, c'est lorsque j'essaie d'ouvrit le fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    File fic = fs.open(dir, "FILE_WRITE");
      if(!fic){
    dir étant par exemple char[8] = "/P4.txt"

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    et si vous faites un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    File fic = fs.open("P4.txt", "FILE_WRITE");
      if(!fic){
    sans le / devant ?

    est-ce que vous fermez bien tous les autres fichiers ouverts ? faudrait voir tout le code

  12. #12
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    j'ai essayé un peu tout en vain;
    j'ai aussi vérifié que tous les fichiers étaient bien fermés après ouverture.
    Mais ce matin, j'ai un peu avancé : j'ai préchargé tous les fichiers dont j'ai besoin avec un contenu bidon dans le SPIFFS avec le "run task platformio: upload filesystem image.
    (P0.txt à P9.txt). Maintenant, cela ne plante plus à la demande d'ouverture du fichier, ce qui parait logique; l'affichage indique bien la prise en compte de la commande, par contre, le fichier n'est pas modifié; donc c'est toujours impossible d'écrire quelque chose dans le SPIFFS.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //***************** Ecriture SPIFFS **********************************
    void ecritureFichier(fs::FS &fs, const char *dir, const char *message){
      File fic = fs.open(dir,FILE_WRITE, true);
      if(!fic){
        afficErreurs(msg1);    //"Pas de fichier"
        ok=false;
        return;
      }
     ok = (fic.print(message))? true:false;
      fic.close();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
        //*********Enregistrement en SPIFFS d'un programme horaire complet (10 manip de 8 octets) 6x => Px   x=0 a* 9
        case '6':{
          nprog = ci(com[1]); //numero de programme
          char nFic[8]; sprintf(nFic,"/P%c.txt%c",com[1],'\0');
          if(!(nprog>=0 && nprog<=9)) afficErreurs(prg);
          else{               
            ecritureFichier(SPIFFS,nFic,pg[nprog]);      //pg= 10 programmes de 8 x 10 manips
            if(ok){
              String tempo;                    
              for(i=0;i<80;i++){
                tempo += pg[nprog][i]; 
              }
              lcd.clear();lcd.print(tempo.substring(0,16)); delai('s',2);
              afficMsgLcd(0,1,msg2,DURAFF);
            }
          }
        }
        break;
    Je ne comprends toujours pas pourquoi je n'arrive pas à enregistrer de façon dynamique dans le SPIFFS

  13. #13
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Après avoir changé d'ESP32 et écrit un petit programme de test, j'ai enfin réussi à écrire jusqu'à 80 caractères dans un fichier SPIFFS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <arduino.h>
    #include <FS.h>
    #include <SPIFFS.h>
     
    #define FORMAT_SPIFFS_IF_FAILED true
     
    bool go = true;
     
    void ecritFichier(fs::FS &fs, const char *dir, const char *message){
      Serial.printf("%s\n\r",message);  
      File fic=fs.open(dir,"w");
      int lg = fic.print(message);
      fic.close();  
      Serial.print("Nb caracteres: "); Serial.println(lg);
     
    }
     
    void litFichier(fs::FS &fs, const char *dir){
      String tempo ="";
      Serial.printf("%s\n\r",dir);
      File fic=fs.open(dir,"r");
      if(!fic || fic.isDirectory()){
        Serial.println("Erreur lecture du fichier");
        fic.close();
        return;
      }
      else{
        while(fic.available()){
          tempo+=(char)fic.read();     
        }
        Serial.println(tempo);
      }
      fic.close();
    }
     
    void setup() {
      Serial.begin(9600);
      Serial.setTimeout(3000);
      if(!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED))
        Serial.println("SPIFFS  MOUNT FAILED");
    }
    /*pour écrire: Wnxxxxxxxxxxx  n => n° de fichier > "Pn.txt"
                   x => caractères écrits en SPIFFS 
    **
    pour lire: Rn > lecture du fichier Pn en SPIFFS
    */
    void loop() {
      String tempo=""; char dir[8];
      if(Serial.available() >0){
        tempo = Serial.readStringUntil(13);
        tempo += '\0';
        if(tempo.charAt(0)=='W'){     //pour Write
          Serial.printf(" [%s]\n\r", tempo.c_str());
          sprintf(dir,"/P%c.txt%c",tempo.charAt(1),'\0');
          int lg = tempo.length();
          char msg[lg];
          for(int i=0; i<lg-2; i++){
            msg[i] = tempo.charAt(i+2);
          }
          ecritFichier(SPIFFS,dir,msg);
        }
        else if(tempo.charAt(0)=='R'){    //pour Read
          sprintf(dir,"/P%c.txt%c",tempo.charAt(1),'\0');
          litFichier(SPIFFS,dir);
        }
      }
    }
    Je vais maintenant essayer d'intégrer cela dans mon prog principal.

  14. #14
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    l'autre ESP devait avoir un souci de flash alors...

  15. #15
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Non parce que j'ai chargé ce petit programme dans mon ESP32 d'origine (AZ-Delivery) et il fonctionne bien! Je n'y comprends plus rien.
    Malheureusement je ne peux pas monter le deuxième ESP32 (sans marque) sur mon circuit car il ne démarre pas malgré un appui sur 'RST' ou 'BOOT'. Sûrement un problème avec la pin EN.
    Ce qui est pénible avec ces ESP32, c'est qu'ils ne réagissent pas tous pareil: une fois il faut mettre un condo sur la pin EN, une autre fois il mettre un condo + une résistance. Pour le 'upload', des fois ça se charge sans rien faire, des fois il faut appuyer sur le 'BOOT', etc, etc...
    Avec une plaquette d'essais, c'est relativement facile de faire toutes ces manips, mais lorsque le circuit électronique est fait, cela devient plus délicat de bricoler.
    Avec mon AZ-Delivery monté sur mon circuit imprimé, le 'upload' plante systématiquement. Il faut que je le démonte de son support pour que la puce se charge! Pas facile pour la mise au point. De plus, depuis quelques temps, le monitoring Serial ne fonctionne plus; je suis obligé d'envoyer les messages vers le LCD. Pas pratique!
    Voilà, je commence vraiment à être dépité avec ce projet. j'y ai passé des heures et des heures sans avancé d'un iota à cause de cette impossibilité de charger mes config horaires dans le SPIFFS.
    Je vais être obligé de mettre un carte SD pour faire le job, mais cela va encore être des jours de galère.

    Quoiqu'il en soit, je vous remercie pour le temps que vous avez passé à essayer de m'aider.
    Bien cordialement
    Michel

  16. #16
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    c'est sûr que si le PCB est déjà fait et que vous utilisez un montage "maison" ça peut être galère...

    bon courage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Stocker des strings dans une liste
    Par TitomTommy dans le forum Général Python
    Réponses: 5
    Dernier message: 14/06/2018, 14h53
  2. Stocker des options
    Par koolkris dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 11/02/2005, 16h00
  3. Stocker des infos en local
    Par manu00 dans le forum Bases de données
    Réponses: 6
    Dernier message: 05/06/2004, 22h47
  4. [debutant][JNI]Stocker des objet pour les rappeler plus tard
    Par Celenor dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 28/03/2004, 01h28
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo