EPS32 приклад використання SPIFFS

Один із моїх пет-проєктів — керований блок живлення на базі ESP32 з веб-інтерфейсом (GitHub репозиторій https://github.com/vshcryabets/Esp32AdjPsu). До цього я створював прості веб-сторінки безпосередньо в коді на C++. Однак у цьому проєкті я зрозумів, що так працювати далі неможливо — потрібно відокремити код прошивки від коду веб-застосунку. Найчастіше для цього використовують SPI Flash File System (SPIFFS) (офіційна документація https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/storage/spiffs.html). SPIFFS дозволяє зберігати дані у вигляді окремих файлів, які можна як читати, так і записувати.

Який розмір має SPIFFS? Давайте поглянемо на типове розподілення flash-пам’яті у випадку 4 МБ флешу (https://github.com/espressif/arduino-esp32/blob/master/tools/partitions/default.csv):
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x140000,
app1,     app,  ota_1,   0x150000,0x140000,
spiffs,   data, spiffs,  0x290000,0x160000,
coredump, data, coredump,0x3F0000,0x10000,

Під SPIFFS виділено трохи більше третини пам’яті, а саме 0x160000 = 1408 КБ.

Оскільки я використовую PlatformIO, інструкція буде для цього середовища. У корені проєкту створимо папку data:

 

А в ній створимо файл index.html з ось таким змістом:

<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
</head>
<body>
   <h1>Тестова сторінка з ESP32 SPIFFS</h1>
</body>
</html>

Тестовий скетч:

#include 
#include 
#include 

WebServer server(80); // це наш http сервер

void handle_OnIndex()
{
  // перевіримо ща такий файл у нас є
  if (SPIFFS.exists("/index.html")) {
    // відкриваємо та передаємо зміст файлу у відповідь
    File file = SPIFFS.open("/index.html", "r");
    server.streamFile(file, "text/html");
    file.close();
  } else {
    server.send(404, "text/plain", "File Not Found");
  }
}

void setup() {
  Serial.begin(9600);
  
  if(!SPIFFS.begin(true)){
    Serial.println("SPIFFS failed");
    return;
  }
  // під'єднаємось до Wifi мережі
  WiFi.begin("wifiname", "wifipassword");

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.print("Connected ");
  Serial.println(WiFi.localIP());
  server.on("/index.html", handle_OnIndex);
  server.begin();
}
 
void loop() {
  server.handleClient();
}
Заливаємо скетч на ESP32. Далі зберемо образ SPIFFS. У PlatformIO для цього використовуються спеціальні команди. Відкрийте PlatformIO Terminal і виконайте команду:
pio run --target buildfs

або використайте меню PlatformIO

Після завершення створення образу в консолі має з’явитися напис SUCCESS. Це означає, що образ SPIFFS готовий до заливки.

Щоб залити образ на ESP32, виконайте команду:
pio run --target uploadfs

Або знову такиж це можна зробити через меню: 


 

Важливо: 

- SPIFFS можна перезбирати та заливати стільки разів, скільки потрібно. Це не впливає на головну прошивку. 

- Переконайтеся, що розмір образу не перевищує виділений у таблиці розділів обсяг (у цьому випадку 1408 КБ).

Коментарі

Популярні дописи з цього блогу

Огляд DC-DC Step-down Buck перетворювачів

ESP8266 модуль з OLED екраном (HW-364A)

Модуль PD тригер IP2721 на 15 та 20 вольт