ESP8266 - Súborový systém SPIFFS

Zápisník experimentátora

Hierarchy: ESP8266

Mikrokontrolér ESP8266 umožňuje ukladať údaje pomocou súborového systému SPIFFS. Údaje sú ukladané do internej Flash pamäte. Flash pamäť je rozdelená na niekoľko blokov. Do každého bloku možno uložiť údaje bez toho, aby boli ovplyvnené ostatné bloky. Mikrokontrolér sa najčastejšie predáva na doske, kde sa nachádzajú 4 MB Flash. Pamäť je rozdelená na oblasti.

  • Program
  • OTA
  • SPIFFS
  • EEPROM
  • Konfigurácia WiFi

V nastavení veľkosti Flash si môžete vybrať veľkosť, ktorá sa má na súborový systém SPIFFS rezervovať.

  • Žiadna - od verzie jadra 2.5.0.
  • 1 MB
  • 2 MB
  • 3 MB

Jednotlivé položky sa od seba líšia iba veľkosťou. Pri prvom nastavení veľkosti a spustení programu v mikrokontroléri sa súborový systém inicializuje, čo trvá niekoľko sekúnd. Pri každej zmene nastavenia sa znovu inicializuje. Súbory sa zachovajú. Je rozumné si dopredu premyslieť, koľko miesta budete potrebovať a nastaviť to podľa toho.

Použité súčiastky

Toto je jednoduchý projekt, preto nám bude stačiť niektorá doska s mikrokontrolérom ESP8266, ktorú je možné priamo pripojiť do USB. Aby ste sa vyhli prípadnému skratu, môžete dosku zastrčiť do breadboardu.

  • ESP8266 {linkESP8266}
  • Breadboard {linkBreadBoard}

Informácia o nastavení SPIFFS

Môžete vyskúšať nasledovný program, ktorý vám vypíše základné údaje o vašej 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ýsledok bude vyzerať 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

Súborový systém používa nasledovné objekty a triedy.

  • SPIFFS - Tento globálny objekt zabezpečuje základné ovládanie súborového systému SPIFFS.
  • File - Pokiaľ chcete pracovať s obsahom súboru, požiadate SPIFFS pomocou funkcie open o jeho vytvorenie alebo otvorenie. Funkcia má dva parametre, názov súboru a mód na jeho otvorenie. Módy sú kompatibilne s funkciou fopen jazyka C.
  • Dir - Pokiaľ chcete pracovať s adresármi, požiadate SPIFFS o obsah adresára pomocou funkcie openDir. SPIFFS v skutočnosti žiadne adresáre nepozná, ale pokiaľ v názve súboru budete používať znak /, je možné simulovať prácu s adresármi. Na celú cestu k súboru ale môžete použiť maximálne 31 znakov.

Niekoľko základných operácií so SPIFFS

Napísal som príklad, ktorý ukáže použitie niekoľkých základných operácií. SPIFFS poskytuje viac funkcií, toto je ale základ prakticky každej práce so súbormi. Vytvorenie súboru, prečítanie obsahu súboru, vymazanie súboru a zobrazenie zoznamu súborov v adresári.

#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 vyzerá takto.

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

Nahratie súborov do SPIFFS

Súbory môžete do SPIFFS nahrať aj z vášho disku. Potrebujete si na to nainštalovať plugin ESP8266FS. Musíte si ho stiahnuť z Internetu z adresy https://github.com/esp8266/arduino-esp8266fs-plugin/releases/download/0.3.0/ESP8266FS-0.3.0.zip.

  • V adresári so svojimi programami vytvorte adresár tools a rozbaľte do neho obsah stiahnutého ZIP súboru. Celá cesta k súboru musí vyzerať takto <home_dir>/Arduino/tools/ESP8266FS/tool/esp8266fs.jar.
  • Potom reštartuje Arduino IDE.
  • V adresári so svojim programom vytvorte adresár data a nahrajte do neho všetky súbory.
  • Použite príkaz menu Tools/ESP8266 Sketch Data Upload. Nahrávanie súborov do ESP8266 bude trvať dosť dlho.

Po nahratí súborov si môžete obsah SPIFFS skontrolovať pomocou nasledujúceho programu. Program obsahuje aj vzorový adresár data s jedným súborom example.txt. Na výpise si všimnite, že súbor bude uložený do SPIFFS ako /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 sa nachádza na serveri GitHub.


08.02.2019


Menu