Inserire i dati nella memoria flash dell'ESP

Salve e benvenuti al nostro contributo di oggi.

 

I moduli ESP sono molto popolari. Abbiamo mostrato in passato quanto sia facile connettersi al Wi-Fi, visualizzare siti Web e commutare relè.

Tuttavia, una funzione molto utile è quella di inserire i dati nella memoria flash dell'ESP. Questo ti permette di caricare i file a cui possiamo accedere in un secondo momento con il nostro Sketch. In alternativa, per archiviare le informazioni ancora disponibili dopo un riavvio.

Caricare file in ESP

Abbiamo bisogno dello strumento "ESP8266FS" - un'estensione che si integra nell'IDE di Arduino. Aggiunge la voce "ESP8266 Sketch Data Upload" nel menu Strumenti. 

In primo luogo, scarichiamo lo strumento dalla pagina GitHub di ESP8266:

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

Creiamo una cartella denominata "strumenti" nella stessa cartella dei nostri schizzi Arduino. In genere, si trova in "C:-Users"<username>-Documents-Arduino".

Decomprimere il file .zip scaricato e copiare la cartella ESP8266FS alla directory "tools". Alla fine, avremo "C:-Users"<username>-Documents-Arduino-tools-ESP8266FS-tool-esp8266fs.jar".

Ora riavviiamo l'IDE di Arduino e facciamo un nuovo schizzo. Chiamo questo esempio "ESP Data Test". Ora dobbiamo salvare questo schizzo.

Passeremo ora alla cartella appena creata "C:-Users"<Username>Documents-Arduino-ESP-Data-Test" e creeremo la cartella "data". Tutti i file memorizzati qui verranno caricati nella memoria flash dell'ESP non appena eseguiamo il caricamento. 

Creo un nuovo file di testo chiamato test.txt, scrivo una coppia di righe di testo in esso e lo salvo nella nuova cartella "data".

Io uso un ESP8266-01S con adattatore USB, quindi ho impostato le seguenti opzioni in Strumenti:

  • Scheda: "Modulo Generico ESP8266"
  • Dimensione flash: "1M (64K SPIFFS)
  • Velocità di caricamento: "115200" 
  • Porta: "COMx" - selezionare la porta COM

Se non si conosce la dimensione della memoria del modulo, c'è un suggerimento alla fine dell'articolo su come determinarlo. 

Come test, ora cerchiamo di caricare lo schizzo vuoto (solo void setup() e void loop()) all'ESP. Per il mio ESP, è necessario assicurarsi che la modalità di programmazione sia abilitata.

Se tutto questo ha funzionato, possiamo provare a caricare il contenuto della cartella "dati" sul ESP. Per questo andiamo a "Strumenti" -> "ESP8266 Sketch Data Upload".

"SPIFFS Uploading Image..." viene visualizzato nell'IDE ... e dopo un breve periodo di tempo: "SPIFFS Image Uploaded":

 

Se si verifica un errore a questo punto ("Caricamento SPIFFS non riuscito!"), probabilmente perché l'ESP non è più in modalità di programmazione. Basta scollegare e ricollegare la connessione USB, assicurandosi che la modalità di programmazione sia attivata.

Utilizzare SPIFFS nello schizzo 

Per utilizzare SPIFFS nello schizzo, includiamo la libreria FS.h:

#include "FS.h"

 

Ora abbiamo i seguenti comandi:

Oggetto file system (SPIFFS)

SPIFFS.begin()

Monta il file system SPIFFS. Deve sempre essere eseguito prima di tutti gli altri comandi. Restituisce true se il montaggio ha funzionato, in caso contrario "false".

SPIFFS.format()

Formatta (elimina) il file system. Restituisce true se la formattazione ha avuto esito positivo.

SPIFFS.open(percorso, modalità)

Apre un file. Come "percorso" specificano il nome del file incluso il percorso assoluto (ad esempio "/nome cartella/test.txt"). "mode" indica il tipo di accesso. Può includere le seguenti opzioni: "r", "w", "a", "r", "w", "a"

  • "r" Apre il file per la lettura. Il file deve esistere
  • "w" Crea un nuovo file senza contenuto. Se esiste un file con lo stesso nome, il suo contenuto viene eliminato e il file viene visto come un nuovo file vuoto.
  • "a" Aggiunge dati al file ("aggiunta"). I dati vengono aggiunti alla fine del file. Se il file non esiste, ne viene creato uno nuovo.
  • "r" Apre un file per la lettura e la scrittura. Il file deve esistere.
  • "w" Crea un file vuoto per la lettura e la scrittura.
  • "a" Apre un file da leggere e da allegare.
Viene restituito un oggetto file. Per verificare che un file possa essere aperto correttamente, è consigliabile utilizzare un operatore booleano:
Il file f : SPIFFS.open("/test.txt", "w");
if (!f)
Serial.println("apertura file non riuscita");
}

SPIFFS.exists(percorso)

Restituisce "true" se il percorso esiste, in caso contrario "false".

SPIFFS.openDir(percorso)

Apre la directory specificata. Restituisce un oggetto "dir".

SPIFFS.remove(percorso)

Elimina il percorso specificato. Restituisce un valore "true" se l'eliminazione ha avuto esito positivo.

SPIFFS.rename(pathFrom, pathTo)

Rinomina un file da "pathFrom" a "PathTo". Il percorso deve essere assoluto. Restituisce true se la ridenominazione ha avuto esito positivo.

 

Struttura delle informazioni del file system

FS_INFO FSInfo;
SPIFFS.info (fs_info);

Riempie la struttura FSInfo con informazioni sul file system. Restituisce un valore "true" in caso di esito positivo, altrimenti "false".

Struttura:

struct FSInfo
size_t totalbyte;
size_t usedBytes;
size_t blockSize;
size_t pageSize;
size_t maxOpenFiles;
size_t maxPathLength;
};

 

Oggetto Directory (Dir)

L'oggetto "Dir" ci permette di indirizzare i file all'interno di una directory utilizzando i metodi "next()", "filename()" e "openFile(mode)".

Dir : SPIFFS.openDir("/data");
while (dir.next())
Serial.print(dir.fileName());
Il file f - dir.openFile("r");
Serial.println(f.size());
}

dir.next() è "true" purché trovi i file nella directory. Deve essere chiamato prima di "fileName" o "openFile".

"openFile" accetta l'argomento "mode", che è uguale a spiFFS.open.

 

Oggetto File (file) 

SPIFFS.open e dir.openFile restituiscono un oggetto "file". Si tratta di un oggetto flusso e supporta tutte le funzioni, ad esempio readbytes, findUntil, parseInt, println e tutti gli altri metodi di flusso.

Tuttavia, ci sono anche alcuni che sono specifici per l'oggetto file (file).

file.seek(offset, modalità)

Funziona come la funzione fseek in C. La posizione corrente si sposta come segue, a seconda del valore di "mode":

    • SeekSet -> Position è impostato su byte "offset" dall'inizio
    • SeekCur -> la posizione corrente viene spostata da byte "offset"
    • SeekEnd -> Position è impostato su byte "offset" dalla fine del file
Restituisce true se la posizione può essere impostata.

 

file.position()

Riflette la posizione corrente all'interno del file come valore in byte

file.size()

Restituisce la dimensione del file in byte.

file.name();

Restituisce il nome del file come "const char". Può essere memorizzato in una stringa utilizzando "Nome stringa file.name();".

file.close()

Chiude il file.

 

Caso di studio

Ora scriviamo un piccolo schizzo per testare il tutto: vogliamo emettere il nostro file di testo "test.txt" che abbiamo creato all'inizio e riempito con poche righe di testo sul monitor seriale.

 

 

#include "FS.h" Qui integriamo la biblioteca richiesta

Vuoto Installazione() {   Seriale.Iniziare(9600); Abilita uscita seriale   Ritardo(1000); Breve pausa in modo da avere il tempo di aprire il Monitor Seriale.      SPIFFS.Iniziare(); Montaggio del file system   file D = SPIFFS.Aperto( "/test.txt", "r"); Apri file per la lettura   Se (!D) {     Seriale.println("Apertura file non riuscita");   }   Stringa Dati = D.Readstring(); Lettura del contenuto del file di testo in corso...   Seriale.println("Contenuto del file aperto:");   Seriale.println(Dati); // ... e riemesso   D.Vicino(); Chiudiamo il file
}
Vuoto Ciclo() {
}

 

Dopo il caricamento, l'output verrà visualizzato sul monitor seriale:

 

Bonus Suggerimento: Quanto è grande la memoria flash del mio ESP 8266?

A seconda del modulo ESP8266 in uso, la dimensione della memoria flash può variare. Anche se è possibile cercare il foglio dati utilizzando l'etichetta sul chip, per essere sicuri che ci sia un piccolo schizzo che controlla le dimensioni, la velocità e la modalità del modulo. Lo schizzo è disponibile su https://github.com/esp8266/Arduino/tree/master/libraries/esp8266/examples/CheckFlashConfig

Basta caricare questo schizzo e impostare il monitor seriale a 115200 baud, vedremo la dimensione del chip.

 

 

 

Spero che ti sia piaciuto il nostro post sul blog oggi e ha incoraggiato la tua creatività. D'ora in poi, è possibile utilizzare la funzione SPIFFS del tuo ESP per memorizzare ad esempio moduli di testo HTML, per memorizzare i dati del sensore in modo permanente e molto altro ancora.

Siamo molto felici di lode, critiche e suggerimenti per il nostro blog.

Il tuo 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

Post di blog consigliati

  1. Installa ESP32 ora dal gestore del consiglio di amministrazione
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - Programmazione ESP tramite WLAN