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.
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
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
14 Reacties
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
@ 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
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
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
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
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:
/*
Diese Skizze testet, ob die EEPROM-Einstellungen der IDE mit der Hardware übereinstimmenESP8266 CheckFlashConfig von Markus Sattler
*/
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
“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
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
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
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
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
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
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
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