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

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 35347 статей для сайта.

Контакты:

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


Pixel Art Mini Meow Animated.gif Черновик


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
Esp32fs spiffs arduino tools folder 1.PNG
  • Наконец, перезапустите IDE Arduino.

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

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

Esp32 arduino scetch data upload 1.PNG

Загружаем файлы при помощи загрузчика 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 arduino scetch data upload 1.PNG

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

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

Esp32 spiffs image uploaded 1.PNG

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

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

  1. /*********
  2.   Руи Сантос
  3.   Более подробно о проекте на: https://randomnerdtutorials.com  
  4. *********/
  5.  
  6. #include "SPIFFS.h"
  7.  
  8. void setup() {
  9.   Serial.begin(115200);
  10.  
  11.   if(!SPIFFS.begin(true)){
  12.     Serial.println("An Error has occurred while mounting SPIFFS");
  13.                //  "При монтировании SPIFFS возникла ошибка"
  14.     return;
  15.   }
  16.  
  17.   File file = SPIFFS.open("/test_example.txt");
  18.   if(!file){
  19.     Serial.println("Failed to open file for reading");
  20.                //  "Не удалось открыть файл для чтения"
  21.     return;
  22.   }
  23.  
  24.   Serial.println("File Content:");
  25.              //  "Содержимое файла:"
  26.   while(file.available()){
  27.     Serial.write(file.read());
  28.   }
  29.   file.close();
  30. }
  31.  
  32. void loop() {
  33.  
  34. }

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

Esp32fs spiffs test read file 1.PNG

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

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

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

  1. /*********
  2.   Руи Сантос
  3.   Более подробно о проекте на: https://randomnerdtutorials.com  
  4. *********/
  5.  
  6. #include "FS.h"
  7. #include "SPIFFS.h"
  8.  
  9. // Создаем объект класса «File» для манипуляции с файлом:
  10. File myFile;
  11.  
  12. // Путь к файлу:
  13. const char* myFilePath = "/new_file.txt";
  14.  
  15. void setup(){
  16.   // Включаем последовательную коммуникацию (в целях отладки):
  17.   Serial.begin(115200);
  18.  
  19.   // Инициализируем SPIFFS:
  20.   if(!SPIFFS.begin(true)){
  21.     Serial.println("Error while mounting SPIFFS");
  22.                //  "Ошибка при монтировании SPIFFS"
  23.     return;
  24.   }
  25.  
  26.   // Открываем файл и записываем в него данные:
  27.   myFile = SPIFFS.open(myFilePath, FILE_WRITE);
  28.   if (myFile.print("Example message in write mode")){
  29.                //  "Сообщение-пример, сохраненное в режиме записи"
  30.     Serial.println("Message successfully written");  
  31.                //  "Сообщение успешно записано"
  32.   }
  33.   else{
  34.     Serial.print("Writing message failed!!");
  35.              //  "Запись сообщения не удалась!!"
  36.   }
  37.   myFile.close();
  38.  
  39.   // Добавляем данные в файл:
  40.   myFile = SPIFFS.open(myFilePath, FILE_APPEND);
  41.   if(myFile.print(" - Example message appended to file")){
  42.               //  " – Сообщение-пример добавлено в файл"
  43.     Serial.println("Message successfully appended");  
  44.                //  "Сообщение успешно добавлено"
  45.   }
  46.   else{
  47.     Serial.print("Appending failled!");  
  48.              //  "Добавление данных не удалось!"
  49.   }
  50.   myFile.close();
  51.  
  52.   // Читаем содержимое файла:
  53.   myFile = SPIFFS.open(myFilePath, FILE_READ);
  54.   Serial.print("File content: \"");
  55.            //  "Содержимое файла: \""
  56.   while(myFile.available()) {
  57.     Serial.write(myFile.read());
  58.   }
  59.   Serial.println("\"");  
  60.  
  61.   // Узнаем размер файла:
  62.   Serial.print("File size: ");
  63.            //  "Размер файла: "
  64.   Serial.println(myFile.size());
  65.  
  66.   myFile.close();
  67.  
  68.   // Удаляем файл:
  69.   if(SPIFFS.remove(myFilePath)){
  70.     Serial.println("File successfully deleted");
  71.                //  "Файл успешно удален"
  72.   }
  73.   else{
  74.     Serial.print("Deleting file failed!");
  75.              //  "Не удалось удалить файл!"
  76.   }
  77. }
  78. void loop(){
  79.  
  80. }

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

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

  1. #include "FS.h"
  2. #include "SPIFFS.h"

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

File myFile;

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

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

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

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

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

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

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

myFile = SPIFFS.open(myFilePath, FILE_WRITE);

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

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

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

myFile.close();

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

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

myFile = SPIFFS.open(myFilePath, FILE_APPEND);

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

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

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

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

myFile = SPIFFS.open(myFilePath, FILE_READ);

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

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

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

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

Serial.println(myFile.size());

Удаляем файл

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

SPIFFS.remove(myFilePath)

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

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

Esp32 spiffs read write append delete files serial monitor 1.PNG

См.также

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