Sla gegevens op in het flashgeheugen van de ESP

Hallo en welkom bij onze bijdrage vandaag.

 

De ESP modules zijn erg populair. We hebben in het verleden laten zien hoe gemakkelijk het is om verbinding te maken met de Wi-Fi, websites weer te geven en relais te schakelen.

Echter, een zeer nuttige functie is om gegevens in het flash-geheugen van de ESP. Hiermee u bestanden uploaden die we later kunnen openen met onze Sketch. Of om informatie op te slaan die nog beschikbaar is na een herstart.

Bestanden uploaden naar ESP

We hebben de tool "ESP8266FS" nodig - een extensie die integreert in de Arduino IDE. Het voegt de vermelding "ESP8266 Sketch Data Upload" toe in het menu Extra. 

Eerst downloaden we de tool van de ESP8266 GitHub pagina:

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

Laten we een map met de naam "tools" maken in dezelfde map als onze Arduino-schetsen. Normaal gesproken bevindt het zich onder "C:-Users"<username>-Documents-Arduino".

Het gedownloade zip-bestand uitpakken en de map kopiëren ESP8266FS naar de map 'gereedschappen'. Aan het einde hebben we "C:-Users"<username>-Documents-Arduino-tools-ESP8266FS-tool-esp8266fs.jar".

Laten we nu de Arduino IDE herstarten en een nieuwe schets maken. Ik noem dit voorbeeld "ESP Data Test". We moeten deze schets nu bewaren.

We navigeren nu naar de nieuw gemaakte map 'C:-Users'<Gebruikersnaam>-Documents-Arduino-ESP-Data-Test" en maken daar de map 'gegevens'. Alle bestanden die hier worden opgeslagen, worden geüpload naar het flashgeheugen van het ESP zodra we de upload uitvoeren. 

Ik maak een nieuw tekstbestand genaamd test.txt, schrijf er een paar regels tekst in en sla het op in de nieuwe map 'data'.

Ik gebruik een ESP8266-01S met USB-adapter, dus stel ik de volgende opties onder Tools:

  • Bord: "Generieke ESP8266 Module"
  • Flash Size: "1M (64K SPIFFS)
  • Uploadsnelheid: "115200" 
  • Poort: "COMx" - selecteer uw COM-poort

Als u de geheugengrootte van uw module niet weet, is er aan het einde van het artikel een tip over hoe u deze bepalen. 

Als test proberen we nu de lege schets (alleen lege setup() en void loop()) naar het ESP te laden. Voor mijn ESP moet ik ervoor zorgen dat de programmeermodus is ingeschakeld.

Als dit alles heeft gewerkt, kunnen we proberen om de inhoud van de map "gegevens" op het ESP te laden. Hiervoor gaan we naar "Tools" -> "ESP8266 Sketch Data Upload".

"SPIFFS Uploading Image..." verschijnt in de IDE ... en na een korte tijd verschijnt: "SPIFFS Image Geüpload":

 

Als er op dit moment een fout optreedt ("SPIFFS Upload failed!"), is dit waarschijnlijk omdat het ESP niet meer in de programmeermodus staat. Koppel de USB-verbinding eenvoudig los en sluit deze opnieuw aan, zodat de programmeermodus wordt geactiveerd.

SPIFFS gebruiken in Schets 

Om SPIFFS in de schets te gebruiken, nemen we de bibliotheek FS.h op:

#include "FS.h"

 

Nu hebben we de volgende commando's:

Object filesystem (SPIFFS)

SPIFFS.begin()

Monteert het SPIFFS-bestandssysteem. Moet altijd worden uitgevoerd voordat alle andere commando's. Retourneert waar als de berg werkte, anders "vals".

SPIFFS.formaat()

Hiermee wordt het bestandssysteem (verwijderd) (verwijderd). Geeft als resultaat true als de opmaak is geslaagd.

SPIFFS.open(pad, modus)

Hiermee opent u een bestand. Als "pad" geven ze de bestandsnaam op, inclusief het absolute pad (bijvoorbeeld "/mapnaam/test.txt"). "modus" geeft het type toegang aan. Kan de volgende opties bevatten: 'r', 'w', 'a', 'r+', 'w+', 'a+'.

  • "r" Opent het bestand voor het lezen. Het bestand moet bestaan
  • "w" Maakt een nieuw bestand zonder inhoud. Als er een bestand met dezelfde naam bestaat, wordt de inhoud ervan verwijderd en wordt het bestand gezien als een nieuw leeg bestand.
  • "a" Voegt gegevens toe aan het bestand ("toevoegen"). De gegevens worden toegevoegd aan het einde van het bestand. Als het bestand niet bestaat, wordt een nieuw bestand gemaakt.
  • "r+" Opent een bestand voor lezen en schrijven. Het bestand moet bestaan.
  • "w+" Maakt een leeg bestand voor lezen en schrijven.
  • "a+" Opent een bestand om te lezen, evenals om te bevestigen.
Er wordt een bestandsobject geretourneerd. Als u wilt controleren of een bestand met succes kan worden geopend, u het beste een Booleaanse operator gebruiken:
Bestand f = SPIFFS.open("/test.txt", "w");
als (!f)
Serial.println("bestand geopend is mislukt");
}

SPIFFS.exists(pad)

Geeft als resultaat 'waar' als het pad bestaat, anders 'onwaar'.

SPIFFS.openDir(pad)

Hiermee opent u de opgegeven map. Geeft als resultaat een "dir"-object.

SPIFFS.remove(pad)

Hiermee verwijdert u het opgegeven pad. Geeft als resultaat een 'true' als de verwijdering is gelukt.

SPIFFS.hernoeming (pathFrom, pathTo)

De naam van een bestand wijzigen van 'pathFrom' naar 'PathTo'. Het pad moet absoluut zijn. Geeft als resultaat een true als de naam van de naam is geslaagd.

 

Bestandssysteeminfostructuur

FSInfo fs_info;
SPIFFS.info (fs_info);

Hiermee vult u de FSInfo-structuur in met informatie over het bestandssysteem. Geeft als resultaat een "waar" op succes, anders een "false".

Structuur:

struct FSInfo
size_t totalbytes;
size_t gebruikteBytes;
size_t blockSize;
size_t pageSize;
size_t maxOpenFiles;
size_t maxPathLength;
};

 

Directoryobject (Dir)

Met het object 'Dir' kunnen we bestanden in een map richten met de methoden 'next()', 'filename()' en "openFile(mode)".

Dir dir = SPIFFS.openDir("/data";
(dir.next())
Serial.print(dir.fileName());
Bestand f = dir.openFile("r");
Serial.println(f.size());
}

dir.next() is "waar" zolang het bestanden in de map vindt. Het moet worden aangeroepen vóór "fileName" of "openFile".

"openFile" neemt de "modus" argument, dat is hetzelfde als spiFFS.open.

 

Bestandsobject (bestand) 

SPIFFS.open en dir.openFile retourneert een "bestand" object. Dit is een streamobject en ondersteunt alle functies zoals readbytes, findUntil, parseInt, println en alle andere streammethoden.

Er zijn echter ook enkele die specifiek zijn voor het bestandsobject (bestand).

file.seek(offset, mode)

Werkt als de fseek functie in C. De huidige positie verschuift als volgt, afhankelijk van de waarde van "modus":

    • SeekSet -> Positie is ingesteld op het 'compenseren' van bytes vanaf het begin
    • SeekCur -> huidige positie wordt verplaatst door 'offsetbytes'
    • SeekEnd -> Positie is ingesteld op bytes 'compenseren' vanaf het einde van het bestand
Geeft als resultaat true als de positie kan worden ingesteld.

 

bestand.positie()

Geeft de huidige positie in het bestand weer als een waarde in bytes

bestand.grootte()

Geeft als resultaat de bestandsgrootte in bytes.

file.name();

Geeft als resultaat de bestandsnaam als 'const char*'. Kan worden opgeslagen in een tekenreeks met de naam 'Tekenreeks = file.name();'.

bestand.sluiten()

Hiermee sluit u het bestand.

 

Casestudy

Nu schrijven we een kleine schets om het hele ding te testen: we willen ons tekstbestand "test.txt" uitvoeren dat we aan het begin hebben gemaakt en gevuld met een paar regels tekst op de seriële monitor.

 

 

#include "FS.h" Hier integreren we de vereiste bibliotheek

Void Setup() {   Seriële.Beginnen(9600); Seriële uitvoer inschakelen   Vertraging(1000); Korte pauze, zodat we tijd hebben om de Seriële Monitor te openen.      SPIFFS (SPIFFS).Beginnen(); Filesystem mount   Bestand V = SPIFFS (SPIFFS).Open( "/test.txt", "r"); Bestand openen om te lezen   Als (!V) {     Seriële.println('bestand geopend is mislukt');   }   Tekenreeks Gegevens = V.Leestekenreeks(); Het lezen van de inhoud van het tekstbestand...   Seriële.println("Inhoud van het geopende bestand:");   Seriële.println(Gegevens); // ... en opnieuw uitgegeven   V.Sluiten(); We sluiten het bestand
}
Void Lus() {
}

 

Na het uploaden wordt de uitvoer weergegeven op de seriële monitor:

 

Bonus Tip: Hoe groot is het flash geheugen van mijn ESP 8266?

Afhankelijk van welke ESP8266-module u gebruikt, kan de grootte van het flashgeheugen variëren. Hoewel u zoeken naar het gegevensblad met behulp van het label op de chip, om er zeker van te zijn is er een kleine schets die de grootte, snelheid en modus van uw module controleert. De Sketch is beschikbaar op https://github.com/esp8266/Arduino/tree/master/libraries/esp8266/examples/CheckFlashConfig

Upload deze schets en stel de seriële monitor in op 115200 baud, we zullen de grootte van de chip zien.

 

 

 

Ik hoop dat je graag onze blog post vandaag en moedigde uw creativiteit. Vanaf nu u de SPIFFS-functie van uw ESP gebruiken om bijvoorbeeld HTML-tekstmodules op te slaan, sensorgegevens permanent op te slaan en nog veel meer.

We zijn erg blij met lof, kritiek en suggesties voor onze blog.

De jouwe Markus Neumann

Esp-8266Grundlagen software

14 Kommentare

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

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Aanbevolen blog berichten

  1. Installeer ESP32 nu van de raad van bestuur
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP Programmeren via Wi-Fi