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).
Если в статусной панели появилось сообщение «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» и «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. В результате в мониторе порта должно напечататься следующее:
См.также
Внешние ссылки