ESP8266 - Souborový systém SPIFFS

Zápisník experimentátora

Hierarchy: ESP8266

Mikrokontrolér ESP8266 umožňuje ukládat data pomocí souborového systému SPIFFS. Údaje jsou ukládány do interní Flash paměti. Flash paměť je rozdělena na několik bloků. Do každého bloku lze uložit údaje, aniž byly ovlivněny ostatní bloky. Mikrokontrolér se nejčastěji prodává na desce, kde se nacházejí 4 MB Flash. Paměť je rozdělena na oblasti.

  • Program
  • OTA
  • SPIFFS
  • EEPROM
  • Konfigurace WiFi

V nastavení velikosti Flash si můžete vybrat velikost, která se má na souborový systém SPIFFS rezervovat.

  • Žádná - od verze jádra 2.5.0.
  • 1 MB
  • 2 MB
  • 3 MB

Jednotlivé položky se od sebe liší pouze velikostí. Při prvním nastavení velikosti a spuštění programu v mikrokontroléru se souborový systém inicializuje, což trvá několik sekund. Při každé změně nastavení se znovu inicializuje. Soubory se zachovají. Je rozumné si předem promyslet, kolik místa budete potřebovat a nastavit to podle toho.

Použité součástky

Toto je jednoduchý projekt, proto nám bude stačit některá deska s mikrokontrolérem ESP8266, kterou lze přímo připojit do USB. Abyste se vyhnuli případnému zkratu, můžete desku zastrčit do breadboardu.

  • ESP8266 {linkESP8266}
  • Breadboard {linkBreadBoard}

Informace o nastavení SPIFFS

Můžete vyzkoušet následující program, který vám vypíše základní údaje o vaší SPIFFS.

#include <FS.h>

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

  bool res = SPIFFS.begin();
  Serial.print("SPIFFS.begin() = ");
  Serial.println(res);

  if (res) {
    FSInfo fs_info;
    SPIFFS.info(fs_info);

    Serial.print("fs_info.totalBytes = ");
    Serial.println(fs_info.totalBytes);
    Serial.print("fs_info.usedBytes = ");
    Serial.println(fs_info.usedBytes);
    Serial.print("fs_info.blockSize = ");
    Serial.println(fs_info.blockSize);
    Serial.print("fs_info.pageSize = ");
    Serial.println(fs_info.pageSize);
    Serial.print("fs_info.maxOpenFiles = ");
    Serial.println(fs_info.maxOpenFiles);
    Serial.print("fs_info.maxPathLength = ");
    Serial.println(fs_info.maxPathLength);
  }
}

void loop() {
}

Výsledek bude vypadat takto.

SPIFFS.begin() = 1
fs_info.totalBytes = 957314
fs_info.usedBytes = 0
fs_info.blockSize = 8192
fs_info.pageSize = 256
fs_info.maxOpenFiles = 5
fs_info.maxPathLength = 32

Základní objekty SPIFFS

Souborový systém používá následující objekty a třídy.

  • SPIFFS - Tento globální objekt zabezpečuje základní ovládání souborového systému SPIFFS.
  • File - Pokud chcete pracovat s obsahem souboru, požádáte SPIFFS pomocí funkce open o jeho vytvoření nebo otevření. Funkce má dva parametry, název souboru a mód na jeho otevření. Módy jsou kompatibilně s funkcí fopen jazyka C.
  • Dir - Pokud chcete pracovat s adresáři, požádáte SPIFFS o obsah adresáře pomocí funkce openDir. SPIFFS ve skutečnosti žádné adresáře nezná, ale pokud v názvu souboru budete používat znak /, je možné simulovat práci s adresáři. Na celou cestu k souboru ale můžete použít maximálně 31 znaků.

Několik základních operací se SPIFFS

Napsal jsem příklad, který ukáže použití několika základních operací. SPIFFS poskytuje více funkcí, toto je ale základ prakticky každé práce se soubory. Vytvoření souboru, přečtení obsahu souboru, vymazání souboru a zobrazení seznamu souborů v adresáři.

#include <FS.h>

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

  bool res = SPIFFS.begin();
  Serial.print("SPIFFS.begin() = ");
  Serial.println(res);

  if (res) {
    testCreate();
    printFiles();
    printExample();
    testDelete();
    printFiles();
  }
}

void loop() {
}

void testCreate() {
  Serial.println(__FUNCTION__);
  // create file
  File f = SPIFFS.open("example.txt", "w");
  if (!f)
    Serial.println("File 'example.txt' open failed.");
  else {
    f.println("abc");
    f.println("def");
    f.println("ghi");
    f.close();
  }
}

void printFiles() {
  Serial.println(__FUNCTION__);
  Dir dir = SPIFFS.openDir("");
  while (dir.next()) {
    Serial.print(dir.fileName());
    Serial.print(" - ");
    Serial.println(dir.fileSize());
  }
}

void printExample() {
  Serial.println(__FUNCTION__);
  File f = SPIFFS.open("example.txt", "r");
  if (!f)
    Serial.println("File 'example.txt' open failed.");
  else {
    while (f.available())
      Serial.write(f.read());
    f.close();
  }
}

void testDelete() {
  Serial.println(__FUNCTION__);
  SPIFFS.remove("example.txt");
}

Výstup z programu vypadá takto.

printFiles
example.txt - 15
printExample
abc
def
ghi
testDelete
printFiles

Nahrání souborů do SPIFFS

Soubory můžete do SPIFFS nahrát i z vašeho disku. Potřebujete si na to nainstalovat plugin ESP8266FS. Musíte si ho stáhnout z Internetu z adresy https://github.com/esp8266/arduino-esp8266fs-plugin/releases/download/0.3.0/ESP8266FS-0.3.0.zip.

  • V adresáři se svými programy vytvořte adresář tools a rozbalte do něj obsah staženého ZIP souboru. Celá cesta k souboru musí vypadat takto <home_dir>/Arduino/tools/ESP8266FS/tool/esp8266fs.jar.
  • Potom restartuje Arduino IDE.
  • V adresáři se svým programem vytvořte adresář data a nahrajte do něj všechny soubory.
  • Použijte příkaz menu Tools/ESP8266 Sketch Data Upload. Nahrávání souborů do ESP8266 bude trvat dost dlouho.

Po nahrání souborů si můžete obsah SPIFFS zkontrolovat pomocí následujícího programu. Program obsahuje také vzorový adresář data s jedním souborem example.txt. Na výpisu si všimněte, že soubor bude uložen do SPIFFS jako /example.txt.

#include <FS.h>

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

  bool res = SPIFFS.begin();
  Serial.print("SPIFFS.begin() = ");
  Serial.println(res);

  if (res) {
    printFiles();
    printExample();
  }
}

void loop() {
}

void printFiles() {
  Serial.println(__FUNCTION__);
  Dir dir = SPIFFS.openDir("");
  while (dir.next()) {
    Serial.print(dir.fileName());
    Serial.print(" - ");
    Serial.println(dir.fileSize());
  }
}

void printExample() {
  Serial.println(__FUNCTION__);
  File f = SPIFFS.open("/example.txt", "r");
  if (!f)
    Serial.println("File '/example.txt' open failed.");
  else {
    while (f.available())
      Serial.write(f.read());
    f.close();
  }
}

Zdrojový kód

Zdrojový kód se nachází na serveru GitHub.


21.05.2019


Menu