текст перекладу
Пам'ятаєте, як ми працювали з обробкою файлів у C++ (і в Python, C, Java та багатьох інших мовах)? Найцікавіша частина була в тому, що ми могли отримувати доступ до .txt або csv файлів на нашому ПК.
В ESP32, на щастя, ми можемо працювати з файлами, але не з ПК, а безпосередньо з самого ESP32. Ми можемо створювати та читати файли на ESP32, і це чудо стало можливим завдяки SPIFFS!
Що таке SPIFFS? SPIFFS (SPI File System) — це легка файлова система, розроблена для вбудованих систем, де іноді необхідно працювати з файлами для частого читання та запису, таких як реєстрація даних, збереження кодів доступу або в вебсервісах.
Також важливо знати, що SPIFFS не підтримує концепцію підкаталогів або папок, а зберігає файли безпосередньо в кореневому каталозі. SPIFFS не має суворого обмеження на розмір файлів, але це залежить від доступної флеш-пам'яті.
Мені здається, що цього знання достатньо. Використовуйте Chat GPT, щоб дізнатися більше, друзі!
Без зайвих слів, давайте писати код!
P.S. Якщо вам потрібна допомога з кодом або розумінням теми, просто додайте мене в Discord @shahrukh517#4777
Системне середовище: ESP-IDF версія 5.2, Ubuntu 20.04.6 LTS, середовище Visual Studio Code та термінал для виведення.
Крок 1: Включення бібліотек
Важливо знати, що для використання SPIFFS потрібно включити заголовковий файл esp_spiffs.h, який містить важливі функції для ініціалізації SPIFFS.
Ви також можете включити інші важливі функції разом з заголовками SPIFFS, але найкращий формат такий:
#include // для виведення
#include // для рядків
#include // для відкриття та закриття файлів
#include // для взаємодії з файловою системою
#include "esp_log.h" // для логів
#include "esp_spiffs.h" // ініціалізація SPIFFS
static const char *TAG = "Spiffs";
Також важливо знати, що деякі включення, як sys/unistd.h і sys/stat.h, є важливими для обробки файлів, таких як читання та запис, а також для взаємодії з файловою системою.
Крок 2: Попередні вимоги
Перед тим, як продовжити, вам потрібно розуміти, що для роботи SPIFFS необхідно створити простір у флеш-пам'яті ESP32, тому при компіляції код має знати, скільки місця користувач фактично виділяє для зберігання файлів SPIFFS. Для цього потрібно створити csv файл.
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
storage, data, spiffs, , 0xF0000,
Ця таблиця розділів показує налаштування для флеш-пам'яті ESP32, де невтратне сховище займає діапазон від 0x9000 до 0x6000, потім phy_init, factory і, нарешті, storage для SPIFFS, але його розмір змінюється в залежності від розміру файлів, тому він залишений порожнім, але верхня межа задана як 0xF0000.
Ви можете назвати цей csv файл будь-як як хочете, наприклад mycsvfile.csv, але він має бути в папці проєкту, а не в головній директорії.
Тепер, коли ви додали csv файл, нам залишається налаштувати файл sdkconfig. Насправді, не сам sdkconfig, оскільки він генерується після збірки, а sdkconfig.defaults, який встановлює певні параметри для sdkconfig, і він буде виглядати наступним чином:
CONFIG_PARTITION_TABLE_CUSTOM=y
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="mycsvfile.csv"
CONFIG_PARTITION_TABLE_FILENAME="mycsvfile.csv"
Тут ми вказуємо sdkconfig зберігати ці значення, щоб файл csv був розпізнаний під час збірки. Він автоматично розпізнається завдяки цьому файлу.
Збережіть цей файл як sdkconfig.defaults і збережіть його в директорії проєкту, а не в головній.
Крок 3: Ініціалізація
Як і будь-яка інша функція ініціалізації в програмуванні для ESP32, це також функція ініціалізації, без якої все не працюватиме, і це настільки просто.
текст перекладу
Вам потрібно налаштувати код наступним чином.
esp_vfs_spiffs_conf_t conf = {
.base_path = "/spiffs", // тут "/" - це корінь, а "/spiffs" - наш розділ SPIFFS
.partition_label = NULL, // починати з мітки розділу
.max_files = 5, // це вказує, скільки файлів SPIFFS може відкрити
.format_if_mount_failed = true // ініціалізація статусу монтування
};
Це важливі параметри, які необхідно ініціалізувати, і їх деталі вказані в коментарях. Після цього потрібно зареєструвати ці налаштування, а після використання також їх скасувати. Ось як це робиться:
esp_vfs_spiffs_conf_t conf = {
.base_path = "/spiffs", // тут "/" - це корінь, а "/spiffs" - наш розділ SPIFFS
.partition_label = NULL, // починати з мітки розділу
.max_files = 5, // це вказує, скільки файлів SPIFFS може відкрити
.format_if_mount_failed = true // ініціалізація статусу монтування
};
esp_vfs_spiffs_register(&conf)// це для реєстрації
/* ваша робота з відкриттям файлів тут*/
esp_vfs_spiffs_unregister(conf.partition_label);// це для скасування реєстрації
Як ми звикли виділяти та звільняти пам'ять за допомогою вказівників, це не вказівник, але якщо ми скасуємо реєстрацію, це допоможе зберегти ресурси. Це зазвичай використовується для управління ресурсами та запобігання пошкодженню даних.
Крок 4: Файли та виведення
На цьому етапі ми будемо працювати з відкриттям файлів, закриттям файлів, видаленням файлів та їх перейменуванням. Ми будемо працювати тільки з .txt файлами. Почнемо!
Після того, як ви ініціалізували все, давайте відкриємо файл, як ми це робили в C:
Тепер ми будемо писати в нашому розділі SPIFFS.
ESP_LOGI(TAG, "Opening file");
FILE *f // визначено в stdio.h, це тип для файлів
f = fopen("/spiffs/my_file.txt","w") // функція для відкриття файлу в вашому розділі SPIFFS з ім'ям
fprintf(f,"Hello Medium People Do you like my Blogs?");// друкує в файл
fclose(f);
ESP_LOGI(TAG,"File written");
Дозвольте швидко показати вам виведення:
Тепер давайте швидко зчитаємо файл:
ESP_LOGI(TAG, "Reading file");
f= fopen("/spiffs/my_file.txt", "r");
char line[64];
fgets(line, sizeof(line), f);// читає рядок з потоку
fclose(f);
ESP_LOGI(TAG, "Read from file: '%s'", line);
Це виведення з файлу.
Також ви можете перейменувати та видаляти файли.
remove("/spiffs/my_file.txt"); // видалити
rename("/spiffs/my_file.txt", "/spiffs/my_medium_file.txt");// перейменувати файл
Сподіваюся, цей блог був корисним. Якщо вам потрібна допомога або підтримка, зв'язуйтесь зі мною в Discord @shahrukh517#4777, і я з радістю допоможу.
Щасливого кодування!
Перекладено з: ESP32 File Handling SPIFFS ESP-IDF with Code