Stockage de données dans une mémoire flash d 'ESP

Bonjour et bienvenue à notre contribution d’aujourd’hui.

 

Les modules ESP sont très populaires. Nous avons montré dans le passé combien il est facile de se connecter au Wi-Fi, afficher des sites Web, et passer des relais.

Cependant, une fonction très utile est de mettre des données dans la mémoire flash de l’ESP. Cela vous permet de télécharger des fichiers auxquels nous pouvons accéder plus tard avec notre croquis. Ou pour stocker des informations qui sont encore disponibles après un redémarrage.

Télécharger des fichiers sur ESP

Nous avons besoin de l’outil "ESP8266FS" - une extension qui s’intègre dans l’IDE Arduino. Il ajoute l’entrée "ESP8266 Sketch Data Upload" dans le menu Tools. 

Tout d’abord, nous téléchargeons l’outil à partir de la page ESP8266 GitHub:

https://github.com/esp8266/arduino-esp8266fs-plugin/releases/download/0.1.3/ESP8266FS-0.1.3.zip

Créons un dossier nommé "outils" dans le même dossier que nos croquis Arduino. Normalement, il est situé sous "C:-Users"-lt;username -gt;-Documents-Arduino".

Décompressez le fichier .zip téléchargé et copiez le dossier ESP8266FS à l’annuaire des "outils". À la fin, nous aurons "C:-Users" -lt;username-gt;-Documents-Arduino-tools-ESP8266FS-tool-esp8266fs.jar".

Maintenant, nous allons redémarrer l’IDE Arduino et faire un nouveau croquis. J’appelle cet exemple "ESP Data Test". Nous devons maintenant enregistrer ce croquis.

Nous allons maintenant naviguer vers le dossier nouvellement créé "C:-Users" -lt;Username-gt;-Documents-Arduino-ESP-Data-Test" et de créer le dossier "données" là-bas. Tous les fichiers stockés ici seront téléchargés sur la mémoire flash de l’ESP dès que nous effectuerons le téléchargement. 

Je crée un nouveau fichier texte appelé test.txt, j’écris une paire de lignes de texte dedans et je l’enregistre dans le nouveau dossier "data".

J’utilise un ESP8266-01S avec adaptateur USB, donc j’ai défini les options suivantes sous Outils:

  • Conseil d’administration: "Generic ESP8266 Module"
  • Flash Taille: "1M (64K SPIFFS)
  • Vitesse de téléchargement: "115200" 
  • Port: "COMx" - sélectionnez votre port COM

Si vous ne connaissez pas la taille de la mémoire de votre module, il ya un conseil à la fin de l’article sur la façon de le déterminer. 

Comme un test, nous essayons maintenant de charger l’esquisse vide (seulement la configuration vide () et la boucle vide()) à l’ESP. Pour mon ESP, je dois m’assurer que le mode de programmation est activé.

Si tout cela a fonctionné, nous pouvons essayer de charger le contenu du dossier "données" sur l’ESP. Pour cela, nous allons à "Tools" -gt; "ESP8266 Sketch Data Upload".

"SPIFFS Uploading Image..." apparaît dans l’IDE ... et après un court laps de temps apparaît: "SPIFFS Image téléchargée":

 

Si une erreur se produit à ce stade ("SPIFFS Upload échoué!"), c’est probablement parce que l’ESP n’est plus en mode de programmation. Déconnectez et reconnectez simplement la connexion USB, en veillant à ce que le mode de programmation soit activé.

Utilisez SPIFFS dans Sketch 

Afin d’utiliser SPIFFS dans le croquis, nous incluons la bibliothèque FS.h:

#include "FS.h"

 

Maintenant, nous avons les commandes suivantes:

Objet De système de fichiers (SPIFFS)

SPIFFS.begin ()

Monte le système de fichiers SPIFFS. Doit toujours être exécuté avant toutes les autres commandes. Retourne vrai si la monture a fonctionné, sinon "faux".

SPIFFS.format ()

Formats (supprime) le système de fichiers. Rendements vrais si le formatage a été un succès.

SPIFFS.open (chemin, mode)

Ouvre un fichier. En tant que « chemin », ils spécifient le nom du fichier, y compris le chemin absolu (p. ex. «/nom de dossier/test.txt »). "mode" indique le type d’accès. Peut inclure les options suivantes : "r", "w", "a", "r", "w", "a".

  • "r" ouvre le fichier pour la lecture. Le fichier doit exister
  • "w" Crée un nouveau fichier sans contenu. Si un fichier du même nom existe, son contenu est supprimé et le fichier est considéré comme un nouveau fichier vierge.
  • "a" Annexe des données au fichier ("appendice"). Les données sont jointes à la fin du fichier. Si le fichier n’existe pas, un nouveau est créé.
  • "r" ouvre un fichier pour la lecture et l’écriture. Le fichier doit exister.
  • "w" Crée un fichier vide pour la lecture et l’écriture.
  • "a" ouvre un fichier à lire, ainsi qu’à joindre.
Un objet de fichier est retourné. Pour vérifier qu’un fichier pourrait être ouvert avec succès, il est préférable d’utiliser un opérateur Boolean :
Fichier f - SPIFFS.open ("/test.txt", "w");
si (!f)
Serial.println ("fichier ouvert échoué");
}

SPIFFS.exists (chemin)

Retourne "vrai" si le chemin existe, sinon "faux".

SPIFFS.openDir (chemin)

Ouvre le répertoire spécifié. Retourne un objet "dir".

SPIFFS.remove (chemin)

Supprime le chemin spécifié. Retourne un "vrai" si la suppression a été réussie.

SPIFFS.rename (pathFrom, pathTo)

Rebaptise un fichier de "pathDe" à "PathTo". Le chemin doit être absolu. Retourne un vrai si le changement de nom a été un succès.

 

Structure d’information de système de fichiers

fs_info FSInfo;
SPIFFS.info (fs_info);

Remplit la structure FSInfo d’informations sur le système de fichiers. Retourne un "vrai" sur le succès, sinon un "faux".

Structure:

Struct FSInfo
size_t totaloctets;
size_t utiliséBytes;
size_t blockSize;
size_t pageSize;
size_t maxOpenFiles;
size_t maxPathLength;
};

 

Objet d’annuaire (Dir)

L’objet "Dir" nous permet d’aborder les fichiers dans un répertoire en utilisant les méthodes "next()", "filename()" et "openFile(mode)".

Dir dir - SPIFFS.openDir ("/données");
tandis que (dir.next())
Serial.print (dir.fileName);
Fichier f - dir.openFile ("r");
Serial.println (f.size);
}

dir.next() est "vrai" tant qu’il trouve des fichiers dans l’annuaire. Il doit être appelé avant "fileName" ou "openFile".

"openFile" prend l’argument "mode", qui est le même que spiFFS.open.

 

Objet de fichier (fichier) 

SPIFFS.open et dir.openFile retournent un objet "fichier". Il s’agit d’un objet de flux et prend en charge toutes les fonctions telles que readbytes, findUntil, parseInt, println, et toutes les autres méthodes de flux.

Cependant, il ya aussi certains qui sont spécifiques à l’objet de fichier (fichier).

file.seek (offset, mode)

Fonctionne comme la fonction fseek en C. La position actuelle change comme suit, selon la valeur du « mode » :

    • SeekSet -gt; Position est définie pour "compenser" octets dès le début
    • SeekCur - position actuelle est déplacée par "offset" octets
    • SeekEnd -gt; Position est définie pour "compenser" octets à partir de la fin du fichier
Rendement vrai si la position pouvait être définie.

 

file.position()

Reflète la position actuelle dans le fichier comme une valeur dans les octets

fichier.size()

Retourne la taille du fichier dans les octets.

file.name();

Renvoie le nom du fichier sous le nom de « const char ». Peut être stocké dans une chaîne à l’aide de "Nom de chaîne file.name);".

file.close()

Ferme le fichier.

 

Étude de cas

Maintenant, nous écrivons un petit croquis pour tester le tout: nous voulons sortir notre fichier texte "test.txt" que nous avons créé au début et rempli de quelques lignes de texte sur le moniteur de série.

 

 

#include "FS.h" Ici, nous intégrons la bibliothèque requise

Vide Configuration() {   Série.Commencer(9600); Activer la sortie en série   Retard(1000); Courte pause afin que nous ayons le temps d’ouvrir le Serial Monitor.      SPIFFS SPIFFS.Commencer(); Montage de système de fichiers   Fichier Q = SPIFFS SPIFFS.Ouvert( "/test.txt", "r"); Fichier ouvert pour la lecture   Si (!Q) {     Série.println("fichier ouvert échoué");   }   String Données = Q.Lirestring(); Lecture du contenu du fichier texte...   Série.println("Contenu du fichier ouvert:");   Série.println(Données); // ... et réédité   Q.Proche(); Nous fermons le fichier
}
Vide Boucle() {
}

 

Après le téléchargement, la sortie apparaîtra sur le moniteur de série :

 

Astuce Bonus: Quelle est la taille de la mémoire flash de mon ESP 8266?

Selon le module ESP8266 que vous utilisez, la taille de la mémoire flash peut varier. Bien que vous puissiez rechercher la feuille de données à l’aide de l’étiquette sur la puce, pour être sûr qu’il ya un petit croquis qui vérifie la taille, la vitesse et le mode de votre module. Le Croquis est disponible sur https://github.com/esp8266/Arduino/tree/master/libraries/esp8266/examples/CheckFlashConfig

Il suffit de télécharger cette esquisse et de définir le moniteur de série à 115200 baud, nous verrons la taille de la puce.

 

 

 

J’espère que vous avez aimé notre blog aujourd’hui et a encouragé votre créativité. Dorénavant, vous pouvez utiliser la fonction SPIFFS de votre ESP pour stocker par exemple des modules texte HTML, pour stocker les données des capteurs en permanence, et bien plus encore.

Nous sommes très heureux de louanges, de critiques et de suggestions pour notre blog.

Le vôtre Markus Neumann

Esp-8266Grundlagen software

14 commentaires

Adele

Adele

https://github.com/esp8266/arduino-esp8266fs-plugin/releases/download/0.5.0/ESP8266FS-0.5.0.zip
löst das SPIFFS Error: esptool not found! – Problem

Bernd Albrecht

Bernd Albrecht

@ Tom: Bitte der Anleitung folgen, die Max dankenswerterweise am 30. März hier “geposted” hat.
(Ein Bild mit den Einstellungen habe ich per Email gesendet.)
@ all: Einer unserer Blogger wird das Thema, die Fragen und Anregungen erneut aufgreifen.
Zieldatum für Veröffentlichung Mitte Juli 2020

Tom

Tom

Hallo Zusammen,
Funktioniert das Flashen von SPIFFS beim “D1 Mini NodeMcu mit ESP8266-12F WLAN Modul für Arduino” nicht.
Ich habe das nun genau nach Anleitung gemacht und bleibe leider bei genau dieser Meldung “SPIFFS Upload failed!” hängen. Den D1 Mini muss man ja nicht extra in den Programmiermodus bringen soweit mir das bekannt ist, oder? Auf jeden Fall finde ich keine Lösung um den Fehler zu beseitigen. Im Anschluss habe ich den gesamten LOG aus dem Arduino IDE kopiert. Vielleicht hat jemand noch eine Idee woran es liegen könnte.
-—————————————————————————————————————————————-
esptool.py v2.8
Serial port COM3
Connecting….
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: ec:fa:bc:59:3f:98
Uploading stub…
Running stub…
Stub running…
Changing baud rate to 460800
Changed.
Configuring flash size…
Auto-detected Flash size: 4MB
Compressed 259824 bytes to 190276…

Writing at 0×00000000... (8 %)
Writing at 0×00004000... (16 %)
Writing at 0×00008000... (25 %)
Writing at 0×0000c000… (33 %)
Writing at 0×00010000... (41 %)
Writing at 0×00014000... (50 %)
Writing at 0×00018000... (58 %)
Writing at 0×0001c000… (66 %)
Writing at 0×00020000... (75 %)
Writing at 0×00024000... (83 %)
Writing at 0×00028000... (91 %)
Writing at 0×0002c000… (100 %)
Wrote 259824 bytes (190276 compressed) at 0×00000000 in 4.3 seconds (effective 482.7 kbit/s)…
Hash of data verified.

Leaving…
Hard resetting via RTS pin…
[SPIFFS] data : C:\Users\Thomas Schmid\Documents\Arduino\D1-Mini-WebserverV4b\data
[SPIFFS] size : 2024
[SPIFFS] page : 256
[SPIFFS] block : 8192
/Test.txt

[SPIFFS] upload : C:\Users\THOMAS~1\AppData\Local\Temp\arduino_build_524988/D1-Mini-WebserverV4b.spiffs.bin
[SPIFFS] address : 0×200000
[SPIFFS] reset : —before default_reset —after hard_reset
[SPIFFS] port : COM3
[SPIFFS] speed : 921600
[SPIFFS] python : python.exe
[SPIFFS] uploader : C:\Users\Thomas Schmid\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\tools\upload.py

SPIFFS Upload failed!

Danke im Voraus für Eure Hilfe

Gruß Tom

steve

steve

Hallo,
danke für die sehr guten Anleitungen.
Aber wie könnte man als nächstes die entstandene SPIFFS-Datei “test.txt” per SFTP zu aaaaa.bplaced.net (user: bbbbb; passwort: ccccc) hochladen. Beim Raspi funktionierte es mit curl…. oder ncftp…. .

steve

Max

Max

Wer Probleme mit SPIFFS Error: esptool not found! hat tauscht sein ESP8266FS aus.
ESP8266FS-0.5.0.zip
https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html#uploading-files-to-file-system

Peter

Peter

Hallo, sehr schönes Tool, beim Kopieren des Codes zeigten sich aber doch viele Tipp-Fehler. Nach Korrektur der (meisten) Fehler sieht es so aus:

/*
ESP8266 CheckFlashConfig von Markus Sattler

Diese Skizze testet, ob die EEPROM-Einstellungen der IDE mit der Hardware übereinstimmen

*/

void setup (void)
{
Serial.begin(115200);
}

void loop ()
{

uint32_t realSize = ESP.getFlashChipRealSize(); uint32_t ideSize = ESP.getFlashChipSize(); FlashMode_t ideMode = ESP.getFlashChipMode(); Serial.printf (“Flash-Real-ID:% 08X \n”, ESP.getFlashChipId ()); Serial.printf (“Flash-Realgröße:% u Bytes \n \n”, realSize); Serial.printf (“Flash-Ide-Größe:% u Bytes \n”, ideSize); Serial.printf (“Flash-Ide-Geschwindigkeit:% u Hz \n”, ESP.getFlashChipSpeed()); Serial.printf (“Flash-Ide-Modus:% s \n”, (ideMode == FM_QIO? “QIO”: ideMode == FM_QOUT? “QOUT”: ideMode == FM_DIO? “DIO”: ideMode == FM_DOUT? "DOUT " : “UNBEKANNT”)); if (ideSize != realSize) { Serial.println (“Flash-Chip-Konfiguration falsch! \ N”); } else { Serial.println (“Flash Chip Konfiguration ok. \ N”); } delay(5000);

}

O.Wenzel

O.Wenzel

“Soweit so gut, funktioniert das.
Nur wie kann ich die Datei jetzt wieder Zeilenweise auslesen?
Bzw. wie kann ich den Inhalt der Datei wieder in Variablen einlesen?”
*************************
das würde mich auch brennend interessieren, alle Versuche mit array’s , f.seek(3, fs::SeekEnd); etc. führen zu keinem Ergebnis !

Äd Franzis

Äd Franzis

Lieben Dank, für die Info.

Mal eine Frage: Kann man nur Text-Dateien speichern (also Type char) oder lassen sich auch Messwerte direkt als Integer ablegen. Char ist halt sehr Daten-hungrig.
Ich konnte leider kein entsprechendes Beispiel finden.

/Äd

Matthias

Matthias

Hallo,
die Fehlermeldung:“SPIFFS Error: esptool” lässt einen Fehler mit dem Setup vermuten und hat nichts mit dem hier zur Verfügung gestellten Code und der Erklärung der Funktionsweise zu tun (danke dafür).
Gruß Matthias

Detlef

Detlef

vom September 20, 2019

Hallo,
gibt es denn jetzt eine Lösung für den Fehler
SPIFFS Error: esptool not found!
Ich habe das gleiche Problem aber noch keine Lösung gefunden.
wo ist die Lösung ????

Klaus

Klaus

Hallo,
gibt es denn jetzt eine Lösung für den Fehler
SPIFFS Error: esptool not found!
Ich habe das gleiche Problem aber noch keine Lösung gefunden.
Danke.

Andreas Engelmann

Andreas Engelmann

Hallo Herr Neumann,
Danke für den Beitrag. Das Thema Flash wird bei den meisten Tutorials garnicht behandelt. Auch die Informationen zur Flashgrösse gehen meist unter.
Grade für HTML-Seiten für einen Server auf dem ESP32/8266 ist das prima.
Lieber Torsten, ich habe neulich ein schönes Zitat bei " Microkontroller.net "gelesen:
“Wer schnelle Lösungen sucht sollte nicht programmieren”.
Jedes Proggramm ist eine Herausforderung . Nim sie an und finde die Lösung.
Dann kannst du sagen: “Das habe ich programmiert”.
Viel Spaß beim Basteln.
Andreas

Torsten

Torsten

Wie üblich funktioniert der ganze Kram nur nach tausenden Suchen….
Ich bekomme immer wieder: SPIFFS Error: esptool not found!
Ist und bleibt schlicht Bastelkram,

Christian

Christian

Hallo!

Soweit so gut, funktioniert das.
Nur wie kann ich die Datei jetzt wieder Zeilenweise auslesen?
Bzw. wie kann ich den Inhalt der Datei wieder in Variablen einlesen?

Danke

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Messages de blogs recommandés

  1. Installez maintenant ESP32 via l'administrateur de la carte
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA-Over the Air-ESP Programmation par WiFi

Produits recommandés