ESP8266 Flash Dateisystem SPIFFS beispielhaft benutzen

Dieses Tutorial erklärt ausführlich das ESP8266 Flash File System abgekürzt als (SPIFFS). Es gibt zwei Möglichkeiten, Daten auf dem ESP8266 zu speichern, eine davon ist das interne EEPROM mit 512 Bytes. Das EEPROM besitzt 1 Million Schreibzyklen. Die zweite Möglichkeit ist die Verwendung von SPI Flash (64kBytes bis 15Mbyte). Neben dem ESP-01 befindet sich ein kleiner 8-Pin Chip, welcher über SPI mit ESP verbunden ist. In diesem Flash-Speicher speichert der ESP das Programm. Zusammen mit dem Programm können auch Dateien darauf abgelegt werden. Einschränkung dieses Speichers ist, dass er nur 10.000 Schreibzyklen hat.

Obwohl das Dateisystem auf dem gleichen Flash-Chip wie das Programm gespeichert ist, wird die erneute Programmierung des Programmteils den Inhalt des Dateisystems nicht verändern. Dies ermöglicht es, das Dateisystem zu verwenden, um Konfigurationsdateien oder Inhalte für den Webserver zu speichern.

Das Flashlayout ist dabei wie folgt aufgebaut:

|--------------|-------|-------------------|--|--|--|--|--|
^              ^       ^                   ^     ^
Anwendung  OTA update  Datei-System     EEPROM  WiFi-Konfiguration

Die Größe des Dateisystems hängt von der Größe des Flash-Chips ab. Abhängig von dem benutztem Board, haben Sie die folgenden Optionen für die Flash-Größe:

BoardFlash Chip Größe, in BytesDateisystem Größe, in Bytes
Generic Modul512kB64kB
Generic Modul1MB64kB, 128kB, 256kB, 512kB
Generic Modul2MB1MB
Generic Modul4MB3MB
Adafruit HUZZAH4MB1MB, 3MB
NodeMCU 0.94MB1MB, 3MB
NodeMCU 1.04MB1MB, 3MB

Eine Anleitung wie Sie die Größe des Flash Speichers ermitteln können finden Sie hier.

Beispielcode um Text in eine Datei im Dateisystem zu schreiben und wieder auszulesen:

#include <ESP8266WiFi.h>
#include <FS.h>   //Include File System Headers
 
const char* filename = "/file.txt";
 
  
void setup() {
  delay(1000);
  Serial.begin(9600);
  Serial.println();
 
  //Initialize File System
  if(SPIFFS.begin())
  {
    Serial.println("SPIFFS Initialisierung....OK");
  }
  else
  {
    Serial.println("SPIFFS Initialisierung...Fehler!");
  }
 
  //Format File System
  if(SPIFFS.format())
  {
    Serial.println("Datei-System formatiert");
  }
  else
  {
    Serial.println("Datei-System formatiert Error");
  }
 
  //Erstellung einer neuen Datei und Beispielhaftes füllen der Datei
  //w=Öffnen mit Schreibzugtriff auf die Datei
  File f = SPIFFS.open(filename, "w");
  
  if (!f) {
    Serial.println("Oeffnen der Datei fehlgeschlagen");
  }
  else
  {
      //Write data to file
      Serial.println("Schreibe Daten in die Datei");
      f.print("Dies ist Beispielinhalt....");
      f.close();  //Schließen der Datei
  }
}
 
void loop() {
  int i;
  
  //Lesen des Dateiinhaltes 
  File f = SPIFFS.open(filename, "r");
  
  if (!f) {
    Serial.println("Oeffnen der Datei fehlgeschlagen");
  }
  else
  {
      Serial.println("Lesen des Dateiinhaltes:");
      //Data from file
      for(i=0;i<f.size();i++) //Read upto complete file size
      {
        Serial.print((char)f.read());
      }
      f.close();  //Schließen der Datei
      Serial.println("");
      Serial.println("Datei geschlossen");
  }
  delay(5000);
}

Mit dem “Seriellen Monitor” der Arduino-IDE kann die Ausführung des Programmes nachvollzogen werden:

Weitere Funktionen der “FS”-Bibliothek sind hier beschrieben.