ESP32:Примеры/SPIFFS платы ESP32 (файловая система памяти SPI Flash)

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


SPIFFS платы ESP32 (файловая система памяти SPI Flash)

В этом руководстве мы расскажем, как использовать SPIFFS платы ESP32: как с ее помощью загружать файлы на flash-память ESP32, как считывать данные с этих файлов, а также записывать и добавлять данные к этим файлам.

Введение в SPIFFS

SPIFFS расшифровывается как «serial peripheral interface flash file system», т.е. «файловая система для flash-памяти, передающей данные через SPI». Соответственно, SPIFFS – это упрощенная файловая система, предназначенная для микроконтроллеров с flash-чипами, передающими данные по шине SPI (вроде flash-памяти ESP32).

SPIFFS обеспечивает доступ к flash-памяти примерно по тому же принципу, что и обычная файловая система ПК, но она проще и имеет ряд ограничений. Она позволяет осуществлять считывание, запись, закрытие и удаление файлов. На момент написания этой статьи SPIFFS не поддерживает директории, так что все сохраняется в одном месте (т.е. создавать папки нельзя).

Области применения SPIFFS

SPIFFS наиболее полезна для использования с ESP32 в следующих ситуациях:

  • Создание файлов для хранения настроек;
  • Постоянное хранение данных;
  • Создание файлов для хранения небольшого количества данных (вместо использования для этого карты MicroSD);
  • Хранение HTML- и CSS-файлов для создания веб-сервера.

В других руководствах (вроде этого) мы писали HTML- и CSS-код для веб-сервера прямо в скетче для IDE Arduino. Но SPIFFS дает возможность писать его в отдельный файл, а затем сохранять его в файловой системе.

Устанавливаем загрузчик SPIFFS

Создавать, сохранять и записывать данные в файлы, хранящиеся в файловой системе ESP32, можно прямо при помощи кода в скетче IDE Arduino, но это не слишком удобно.

К счастью, для IDE Arduino есть плагин, позволяющий загружать файлы прямо в файловую систему ESP32 из папки на вашем ПК. Это очень упрощает работу с файлами. Давайте его установим.

Во-первых, убедитесь, что у вас установлена самая новая версия IDE Arduino, а в нее установлен аддон для ESP32. Далее проделайте следующее:

  • Зайдите на эту страницу и скачайте архив «ESP32FS-1.0.zip»
  • Перейдите в папку, куда установлена IDE Arduino, и откройте в ней папку «tools».
  • Распакуйте скачанный в 1 пункте ZIP-архив в папку «tools». В результате должен получиться путь как на скриншоте ниже.
<home_dir>/Arduino-<version>/tools/ESP32FS/tool/esp32fs.jar
  • Наконец, перезапустите IDE Arduino.

Примечание: Дальнейшие инструкции можно найти по этой ссылке.

Чтобы проверить, успешно ли установился плагин, откройте IDE Arduino и выберите плату ESP32. Далее кликните на «Инструменты» (Tools) и проверьте, есть ли в этом меню пункт «ESP32 Sketch Data Upload».

Загружаем файлы при помощи загрузчика SPIFFS

Чтобы загрузить файлы в файловую систему ESP32, нужно сделать следующее:

  • Создайте скетч IDE Arduino и сохраните его. В демонстрационных целях можно просто сохранить пустой скетч;
  • Откройте папку скетча. Это можно сделать, кликнув в IDE Arduino на «Скетч» > «Показать папку скетча» (Sketch > Show sketch folder). В результате должна открыться директория, куда вы сохранили свой скетч.
  • Внутри этой папки создайте новую папку под названием «data».
  • Внутри папки «data» нужно поместить файлы, которые вы хотите сохранить в файловую систему ESP32. Например, создайте файл «.txt» под названием «test_example» и сохраните в нем любой произвольный текст.
  • Затем, чтобы загрузить файлы, кликните в IDE Arduino на «Инструменты» > «ESP32 Sketch Data Upload» (Tools > ESP32 Sketch Data Upload).

Примечание: При использовании некоторых ESP32-плат вам нужно будет нажать и удерживать кнопку BOOT на плате во время загрузки файлов. Ее нужно нажать, когда в мониторе порта появится сообщение «Connecting …….____……».

Если в статусной панели появилось сообщение «SPIFFS Image Uploaded», то это значит, что файлы были успешно загружены в файловую систему ESP32.

Тестируем загрузчик SPIFFS

Теперь давайте проверим, сохранился ли наш файл на файловой системе ESP32. Просто загрузите на ESP32 код ниже.

/*********
  Руи Сантос
  Более подробно о проекте на: https://randomnerdtutorials.com  
*********/

#include "SPIFFS.h"
 
void setup() {
  Serial.begin(115200);
  
  if(!SPIFFS.begin(true)){
    Serial.println("An Error has occurred while mounting SPIFFS");
               //  "При монтировании SPIFFS возникла ошибка"
    return;
  }
  
  File file = SPIFFS.open("/test_example.txt");
  if(!file){
    Serial.println("Failed to open file for reading");
               //  "Не удалось открыть файл для чтения"
    return;
  }
  
  Serial.println("File Content:");
             //  "Содержимое файла:"
  while(file.available()){
    Serial.write(file.read());
  }
  file.close();
}
 
void loop() {

}

Загрузив скетч, откройте монитор порта на скорости 115200 бод. Затем нажмите на ESP32 на кнопку EN. В результате в мониторе порта должно быть напечатано содержимое файла «.txt».

Поздравляем! Вы успешно загрузили файлы в файловую систему ESP32 при помощи плагина.

Как манипулировать файлами в файловой системе

Здесь мы расскажем, как манипулировать файлами в файловой системе SPIFFS при помощи кода для IDE Arduino. Мы научимся записывать данные в файлы, добавлять данные в файлы, считывать содержимое файлов, удалять файлы, создавать новые файлы и узнавать размер файлов. Все это будет продемонстрировано в скетче ниже.

/*********
  Руи Сантос
  Более подробно о проекте на: https://randomnerdtutorials.com  
*********/

#include "FS.h"
#include "SPIFFS.h"

// Создаем объект класса «File» для манипуляции с файлом:
File myFile;

// Путь к файлу:
const char* myFilePath = "/new_file.txt";

void setup(){
  // Включаем последовательную коммуникацию (в целях отладки):
  Serial.begin(115200);
  
  // Инициализируем SPIFFS:
  if(!SPIFFS.begin(true)){
    Serial.println("Error while mounting SPIFFS");
               //  "Ошибка при монтировании SPIFFS"
    return;
  }
  
  // Открываем файл и записываем в него данные:
  myFile = SPIFFS.open(myFilePath, FILE_WRITE);
  if (myFile.print("Example message in write mode")){
               //  "Сообщение-пример, сохраненное в режиме записи"
    Serial.println("Message successfully written");  
               //  "Сообщение успешно записано"
  }
  else{
    Serial.print("Writing message failed!!");
             //  "Запись сообщения не удалась!!"
  }
  myFile.close();

  // Добавляем данные в файл:
  myFile = SPIFFS.open(myFilePath, FILE_APPEND);
  if(myFile.print(" - Example message appended to file")){
              //  " – Сообщение-пример добавлено в файл"
    Serial.println("Message successfully appended");  
               //  "Сообщение успешно добавлено"
  }
  else{
    Serial.print("Appending failled!");  
             //  "Добавление данных не удалось!"
  }
  myFile.close();

  // Читаем содержимое файла:
  myFile = SPIFFS.open(myFilePath, FILE_READ);
  Serial.print("File content: \"");
           //  "Содержимое файла: \""
  while(myFile.available()) {
    Serial.write(myFile.read());
  }
  Serial.println("\"");   

  // Узнаем размер файла:
  Serial.print("File size: ");
           //  "Размер файла: "
  Serial.println(myFile.size());

  myFile.close();
  
  // Удаляем файл:
  if(SPIFFS.remove(myFilePath)){
    Serial.println("File successfully deleted");
               //  "Файл успешно удален"
  }
  else{
    Serial.print("Deleting file failed!");
             //  "Не удалось удалить файл!"
  }
}
void loop(){
  
}

Примечание: О более продвинутых способах манипуляции с файлами можно узнать из скетчей-примеров библиотеки «SPIFFS». В ней есть несколько функций для этого. Некоторые из них можно найти в этом скетче.

Теперь давайте разберем этот код. В нем используются библиотеки «SPIFFS» и «FS».

#include "FS.h"
#include "SPIFFS.h"

Сначала создаем объект класса «File» для манипуляции с файлом. В этом скетче он назван «myFile», но вы можете назвать его как угодно.

File myFile;

Создаем указатель на тип «const char*» для пути к файлу.

const char* myFilePath = "/new_file.txt";

В блоке setup() инициализируем монитор порта и SPIFFS.

  // Включаем последовательную коммуникацию (в целях отладки):
  Serial.begin(115200);
  
  // Инициализируем SPIFFS:
  if(!SPIFFS.begin(true)){
    Serial.println("Error while mounting SPIFFS");
               //  "Ошибка при монтировании SPIFFS"
    return;

Записываем данные в файл

Чтобы записать данные в файл, сначала при помощи метода open() открываем файл в режиме записи. Первым параметром в этом методе служит путь к файлу. Второй параметр – это значение «FILE_WRITE», с помощью которого задается открытие файла в режиме записи.

Примечание: Если файла не существует, он будет автоматически создан.

myFile = SPIFFS.open(myFilePath, FILE_WRITE);

Чтобы записать текст в файл, используем метод print() на объекте «File».

  if (myFile.print("Example message in write mode")){
               //  "Сообщение-пример в режиме записи"

Мы добавили здесь конструкцию if()… else(), чтобы проверить, действительно ли сообщение было записано в файл. Успешно записав данные в файл, закрываем его при помощи метода close().

myFile.close();

Добавляем данные в файл

Чтобы добавить данные в файл, открываем его в режиме добавления данных.

myFile = SPIFFS.open(myFilePath, FILE_APPEND);

Затем записываем данные в файл при помощи метода print().

  if(myFile.print(" - Example message appended to file")){
              //  " – Сообщение-пример добавлено в файл"

Считываем содержимое файла

Чтобы прочесть содержимое файла, открываем его в режиме чтения:

myFile = SPIFFS.open(myFilePath, FILE_READ);

Затем при помощи метода read() считываем байты из файла. Если в файле есть какие-то байты, которые можно прочесть, печатаем их в мониторе порта.

while(myFile.available()) {
Serial.write(myFile.read());
}

Узнаем размер файла

При помощи метода size() узнаем размер файла.

Serial.println(myFile.size());

Удаляем файл

Чтобы удалить файл, используем метод remove(), а в его параметре пишем путь к файлу.

SPIFFS.remove(myFilePath)

Тестируем код

Загрузив код на ESP32, открываем монитор порта на скорости 115200 бод и нажимаем на кнопку EN на ESP32. В результате в мониторе порта должно напечататься следующее:

См.также

Внешние ссылки