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

Материал из Онлайн справочника
< ESP32:Примеры
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


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

См.также

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