Esp32 узнать количество памяти

Обновлено: 07.07.2024

В этом руководстве мы расскажем, как использовать 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». В результате должен получиться путь как на скриншоте ниже.

Esp32fs spiffs arduino tools folder 1.PNG

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

Чтобы проверить, успешно ли установился плагин, откройте 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 spiffs image uploaded 1.PNG

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

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

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

Esp32fs spiffs test read file 1.PNG

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Удаляем файл

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

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

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


SPIFFS – (Serial Peripheral Interface Flash File System) файловая система флеш-памяти, подключаемой по последовательному периферийному интерфейсу. Простыми словами: есть микроконтроллер ESP32 (рисунок 1), у него есть встроенная перезаписываемая энергонезависимая NOR-память, в которой хранятся: настройки (Preferences), загрузчик (Bootloader), микропрограмма (скомпилированный скетч), файловая система (SPIFFS) и ещё что-нибудь, типа обновления "по воздуху" (OTA).


Рисунок 1. Функциональная блок-схема микроконтроллера ESP32

NOR-память – это такой вид энергонезависимой перезаписываемой памяти, который имеет достаточно высокую скорость считывания, относительно низкую скорость записи и стирания, в сравнении с типом памяти NAND. Встретить NOR-память большого объёма практически невозможно, обычно ограничиваются 128 МБ. В случае с ESP32 – четырьмя.

На сегодняшний день SPIFFS имеет некоторые недостатки недоработки , в их числе: отсутствие поддержки папок; не стек реального времени, поэтому одна и та же операция может занимать разное время; отсутствие возможности нахождения и исправления битых блоков. Если перечисленные недостатки для Вас некритичны, то продолжаем читать следующий пункт.

Давайте поговорим об использовании

К сожалению, из коробки память микроконтроллера не размечена под SPIFFS, для того чтобы разметить, необходимо воспользоваться плагином ESP32FS для среды разработки Arduino IDE.

После того, как плагин скачен – его необходимо установить:

  • Убедитесь, что у Вас установлена новейшая версия среды разработки Arduino IDE и драйвера для Вашего устройства на ESP32. У меня M5Stack драйвера CP210X я скачиваю по этой ссылке;
  • Скопируйте скаченную папку tool со вложенным в неё плагином в папку /Arduino/tools/ESP32FS/;
  • В macOS папка расположена по адресу


Рисунок 2. Меню Инструменты (Tools)

  • Обратите внимание на папку data, находящуюся рядом со скетчем. Все файлы, расположенные в данной папке, будут загружены в память устройства при форматировании;
  • Смело выбираем указанный пункт и дожидаемся окончания форматирования области памяти. Обратите внимание на то, что другие участки памяти затронуты НЕ будут, а значит микропрограмма останется в памяти устройства и будет работать. Аналогично и со скетчем, когда он будет скомпилирован в микропрограмму и загружен в устройство – файловая система затронута не будет.

Если хочется комфорта

Если Вы хотите трогать файлы и видеть информацию о свободном пространстве, то скачайте скетч BRIDGE и прошейте им своё устройство.

Так же скачайте и скомпилируйте кроссплатформенный файловый менеджер A-Explorer (рисунок 3). На GitHub бинарные файлы вскоре будут лежать в папке bin.


Рисунок 3, a. Файловый менеджер A-Explorer под macOS


Рисунок 3, б. Файловый менеджер A-Explorer под Windows

Данный файловый менеджер позволит узнать информацию о свободном пространстве, загружать/выгружать/удалять файлы. Имеется индикация прогресса выполнения операции.

Как видите по рисунку 3 плагин разметил приблизительно 1,38 МБ памяти под SPIFFS.

Кто такой этот BRIDGE?

BRIDGE – это скетч, а прежде всего одноимённая функция, которая работает с файловой системой SPIFFS и A-Explorer является графической оболочкой для неё. Последний отправляет ту или иную команду, а данная функция её обрабатывает на самом устройстве с использованием библиотек FS и SPIFFS. Давайте посмотрим, чего есть интересного в этих библиотеках.

Начнём с рассмотрения публичных методов класса SPIFFS:

Метод bool begin(bool formatOnFail=false, const char * basePath="/spiffs", uint8_t maxOpenFiles=10). Данный метод пытается инициализировать экземпляр класса. Первым аргументом принимает истину или ложь на тот случай, стоит ли форматировать файловую систему, если файловая система не отформатирована. Второй аргумент принимает путь, где будет располагаться корень файловой системы. Третий аргумент определят количество одновременно открытых файлов. Последние два параметра лучше оставить дефолтными и не менять их. Если файловая система отсутствует (не был использован плагин, приведённый выше). то функцию вернёт ложь.

Метод bool format() проверят отформатирована ли файловая система – возвращает истину, в противном случае – ложь.

Метод size_t totalBytes(). Такой метод возвращает size_t-число общего количества Байт размеченных под файловую систему.

Метод size_t usedBytes(). Этот метод возвращает size_t-число используемых Байт в файловой системе.

Метод void end(). Данный метод производит деинициализацию данного класса. После вызова данного метода другие методы вызывать бессмысленно.

В данном классе всё, ничего особо интересного нет. Давайте перейдём к классу FS и посмотрим, что оттуда нам может пригодиться.

Первое, что бросается в глаза, так это метод-инициализатор класса bool begin(). Данный метод не требует аргументов и вызывать его нет необходимости, т. к. мы будем использовать сразу следующий метод.

Метод File open(const char path, const char mode) и его брат File open(const String& path, const char* mode). Данные методы принимают по два аргумента первый из них символьный и строковый указатель на путь к файлу, а второй режим открытия, который может быть следующей константой:

FILE_READ – открыть только для чтения;

FILE_WRITE – открыть только для записи;

FILE_APPEND – открыть для дозаписи.

После того, как мы открыли файл, теперь можем произвести над ним какие-либо операции.

  • Метод size_t write(uint8_t) позволяет записать в конец файла одно 8 битное беззнаковое целое число.
  • Метод size_t write(const uint8_t *buf, size_t size) позволяет записывать ряд безнаковых целых чисел указанной длинны во втором аргументе.
  • Метод int available() подсчитывает количество символов от конца до указателя.
  • Метод int read() считывает из файла один символ и возвращает его в виде целого числа, при этом курсор смещается на единицу право.
  • Метод size_t readBytes(char *buffer, size_t length) считывает символы в буфер, указатель на который получен первым аргументом, а количество символов, переданное вторым аргументом. Возвращает количество считанные символов.
  • Метод String readString() cчитывет строку из файла.
  • Метод int peek() работает аналогично методу int read(), только курсор остаётся на месте.
  • Метод bool seek(uint32_t pos, SeekMode mode) и bool seek(uint32_t pos, SeekMode mode) устанавливает курсор в указанное место. Первым аргументом передают позицию, а вторым правило (SeekSet – установить курсор). Если успешно – возвращает истину, в противном случае – ложь.
  • Метод size_t position() возвращает позицию курсора.
  • Метод size_t size() возвращает размер файла в Байтах.
  • Метод const char * name() возвращает имя файла.
  • Метод const char * fullName() с учётом полного пути.
  • Метод bool isFile() возвращает истину, если открытый объект является файлов. В противном случае – ложь.
  • Метод bool isDirectory() возвращает истину, если открытый объект является папкой. В противном случае – ложь.
  • Метод File openNextFile() возвращает указатель на следующий файл в корне, в противном случае NULL.
  • Метод bool exists(const char* path) и bool exists(const String& path) принимает в качестве аргумента полное имя файла, и, если такой файл существует, то возвращает истину, в противном – ложь.
  • Метод bool remove(const char* path) и bool remove(const String& path) пытается удалить файл, имя которого передано аргументом. В случае успеха возвращает истину, в противном случае – ложь.
  • Метод bool rename(const char pathFrom, const char pathTo) и bool rename(const String& pathFrom, const String& pathTo); принимает полное имя файла первым аргументов, а вторым полное новое имя файла и производите переименование.

Да-да, можно взять эту функцию и запустить её в отдельном потоке в любом другом скетче

Спасибо большое за уделённое время! Буду рад, если данная статья принесёт Вам пользу.

Это может оказаться полезным, когда скетч работает некорректно, и трудно определить причину ошибки. Ниже на примере показано, как определить количество свободной памяти RAM вызовом функции memoryFree.
Пользовательская функция memoryFree использует системные переменные для вычисления количества свободной оперативной памяти RAM. Обычно системные переменные невидимы - они создаются компилятором для собственного использования (для управления внутренними ресурсами).Количество свободной памяти может меняться с течением времени, пока работает Ваша программа. Очень важно удостовериться, что Вы не тратите больше памяти, чем имеется в наличии у системы.Вот несколько основных причин потребления памяти RAM:
• Когда Вы инициализируете константы:

• Когда Вы декларируете глобальные переменные:

• Когда делаете вызов функции:

• Когда динамически выделяете память:

Объект String системы Arduino использует динамическое выделение памяти для строк. Вы можете проверить это, если добавите в начало кода примера определение строки String s = "\n";, и затем добавите в код loop перед задержкой строки:

После запуска этого варианта скетча Вы увидите, что количество памяти уменьшается, потому что каждая прокрутка цикла loop увеличивает размер строки. В какой-то момент память переполнится, и программа перестанет работать. Поэтому не увеличивайте размер строк сверх необходимого, и следите за их размером. Также будьте особенно внимательны с кодом, который использует динамическое выделение памяти. Не пишите код, который динамически создает разное количество переменных в зависимости от некоторых параметров во время своей работы, потому что очень сложно бывает найти ошибки во время выполнения кода, связанные с переполнением памяти.

Также в библиотеках часто объявляются константы и глобальные переменные, о которых Вы можете не знать, но они также расходуют RAM. У библиотеки Serial, например, есть глобальный массив из 128 байт, который используется как буфер для приходящих последовательных данных. Только это использует одну восьмую от общего объема памяти старого Arduino на микроконтроллере ATmega168.

ESP32 DevKit — это универсальная платформа для разработки IoT-решений.


Программирование на C++


Для начала работы с платформой ESP32 DevKit на языке C++ скачайте и установите на компьютер интегрированную среду разработки Arduino IDE. По умолчанию среда IDE настроена только на AVR-платы. Для платформы ESP32 DevKit добавьте в менеджере плат поддержку платформ на модуле ESP32. Выберите платформу ESP32 DevKit: Инструменты Плата DOIT ESP32 DEVKIT V1 .

После выполненных действий плата ESP32 DevKit готова к программированию через Arduino IDE.

Подробности о функциях и методах работы ESP32 на языке C++ читайте на ESP32 Arduino Core’s.

Примеры работы для Arduino

ESP32 может подключиться к Wi-Fi сети, создать собственную точку доступа, представляться сервером и клиентом, формировать GET и POST запросы. Также микроконтроллер имеет два АЦП и датчик Хола.

Пример WebClient

После подключения к Wi-Fi микроконтроллер напишет в COM порт ответ от сервера.


Пример Analog WebServer

ESP32 имеет 15 аналоговых пинов. Выведем через веб-интерфейс значения с 36, 39 и 34 пина.

Когда микроконтроллер подключится к Wi-Fi сети, в монитор порта будет выведен IP-адрес веб-страницы с данными. Получить к ней доступ можно из локальной сети, перейдя по указанному IP-адресу. Скопируйте IP-адрес из монитора порта и вставьте в адресную строку браузера. Если вы подключены к той же локальной сети, что и ESP32, то вы увидите веб-интерфейс.

Пример blink WebServer

Создадим WEB-сервер на порту 80. С помощью веб-интерфейса будем мигать светодиодами на 16 и 17 пинах.


При переходе по IP-адресу из монитора порта, выводится веб-страница с кнопками.

Программирование на JavaScript


Для старта с платформой Wi-Fi Slot на языке JavaScript скачайте и установите интегрированную среду разработки — Espruino Web IDE.

Подробнее о функциях и методах работы ESP32 на языке JavaScript читайте документацию на Espruino.

Элементы платы


Мозг платформы

Платформа для разработки ESP32 DevKit основана на модуле ESP32-WROOM с чипом ESP32-D0WDQ6 от Espressif.


Чип ESP32-D0WDQ6

Чип ESP32-D0WDQ6 — выполнен по технологии SoC (англ. System-on-a-Chip — система на кристалле), в которую входит 2-ядерный 32-битный процессор Tensilica Xtensa LX6 с блоками памяти ROM на 448 КБ и SRAM на 520 КБ. В кристалле также расположены беспроводные технологии Wi-Fi/Bluetooth, радио-модуль, датчик Холла и сенсор температуры.

Для работы с чипом необходима внешняя Flash-память и другая электронная обвязка. Кристалл ESP32-D0WDQ6 является основой на базе которой выпускаются модули с необходимой периферией: например ESP32-WROOM или ESP32-WROVER .

Модуль ESP32-WROOM

ESP32-WROOM — модуль с чипом ESP32-D0WDQ6, Flash-памятью на 4 МБ и всей необходимой обвязкой, которые спрятаны под металлическим кожухом. Pins SCK/CLK, SDO/SD0, SDI/SD1, SHD/SD2, SWP/SD3 and SCS/CMD, namely, GPIO6 to GPIO11 are connected to the integrated SPI flash integrated on the module and are not recommended for other uses.

Рядом с кожухом расположена миниатюрная антенна из дорожки на верхнем слое печатной платы в виде змейки. Металлический кожух экранирует компоненты модуля и тем самым улучшает электромагнитные свойства.

Модуль является основной, на которой выполняются промышленные устройства или отладочные платы, например: ESP32 DevKit или ESP32-Sense Kit .

USB-UART преобразователь

Преобразователь USB-UART на микросхеме CP2102 обеспечивает связь модуля ESP32-WROOM с USB-портом компьютера. При подключении к ПК — платформа ESP32 DevKit определяется как виртуальный COM-порт.

Разъём micro-USB

Разъём micro-USB предназначен для прошивки и питания платформы ESP32 DevKit с помощью компьютера.

Светодиодная индикация

Имя светодиода Назначение
ON Индикатор питания платформы.
LED Пользовательский светодиод на 2 пине микроконтроллера. При задании значения «высокого уровня» светодиод включается, при «низком» – выключается.

Кнопка EN

Кнопка предназначена для ручного сброса программы — аналог кнопки RESET обычного компьютера.

Кнопка BOOT

Кнопка служит для ручного перевода модуля в режим прошивки:

Регулятор напряжения

Линейный понижающий регулятор напряжение AMS1117-3.3 обеспечивает питание микроконтроллера. Выходное напряжение 3,3 вольта с максимальным током 1 А.

Распиновка


Пины питания

VIN: Пин для подключения внешнего источника напряжения в диапазоне от 5 до 14 вольт. 3V3: Пин от стабилизатора напряжения с выходом 3,3 вольта и максимальных током 1 А. Регулятор обеспечивает питание модуля ESP32-WROOM.

Порты ввода/вывода

В отличие от большинства плат Arduino, родным напряжением ESP32 DevKit является 3,3 В, а не 5 В. Выходы для логической единицы выдают 3,3 В, а в режиме входа ожидают принимать не более 3,3 В. Более высокое напряжение может повредить микроконтроллер!

Будьте внимательны при подключении периферии: убедитесь, что она может корректно функционировать в этом диапазоне напряжений.

Читайте также: