Перейти к содержанию

Как сохранить настройки ESP32, чтобы они не пропадали после выключения?

Обновлено Редакция GAW

У AVR для настроек есть встроенная EEPROM, у ESP32 её нет: данные, которые должны пережить выключение, хранят во внешней флеш-памяти модуля. Чтобы не возиться с секторами и износом, ESP-IDF даёт библиотеку NVS, а в Arduino поверх неё работает Preferences.

Пример на Arduino

#include <Preferences.h>
Preferences prefs;

void setup() {
  prefs.begin("cfg", false);              // namespace, read-write
  int boots = prefs.getInt("boots", 0);   // 0 if the key is missing
  prefs.putInt("boots", boots + 1);
  prefs.end();
}

Пространство имён и ключ — до 15 символов, одновременно открыто одно пространство имён. Для чтения без записи пространство открывают с readOnly = true.

EEPROM AVR и NVS ESP32

EEPROM ATmega328PNVS ESP32
Гдеотдельная память 1 КБраздел флеш-памяти
Доступпо адресу, побайтнопо ключу
Износ100 000 циклов на байт, выравнивать вручнуювыравнивание встроено
Пропадание питанияможно испортить байттеряется только записываемая пара
Размерфиксированраздел nvs: 0x5000 = 20 КБ в схеме Arduino по умолчанию, 0x6000 в ESP-IDF

Данные — DS40002061B, ESP-IDF v6.1 и файл схемы разделов default.csv ядра Arduino-ESP32. Ресурс AVR и раскладку переменных считает калькулятор EEPROM AVR.

Что учесть

  • Мелкие значения. Espressif советует держать в NVS много мелких значений; строка — до 4000 байт, большие массивы лучше хранить в файловой системе.
  • Запись. В ESP-IDF значение гарантированно попадает во флеш после nvs_commit(); если работаете с NVS напрямую, не забывайте его вызывать.
  • Таблица разделов. Размер и место раздела nvs задаёт таблица разделов; при её смене старые данные могут оказаться испорчены, и раздел стирают.
  • Безопасность. Без шифрования NVS любой, у кого есть доступ к флеш-микросхеме, прочитает пароли Wi-Fi и ключи.

Похожие вопросы

Сколько раз можно перезаписать значение в NVS?

Ресурс определяет флеш-память, но NVS не стирает сектор при каждой записи: новое значение дописывается в свободную запись, а старое лишь помечается удалённым. Поэтому износ распределяется по всему разделу, и чем раздел больше относительно данных, тем дольше он проживёт. Частые записи, например раз в секунду, всё равно лучше копить в ОЗУ (наш вывод).

Сотрётся ли NVS при загрузке нового скетча?

Обычная загрузка пишет загрузчик, таблицу разделов и приложение, а раздел nvs не трогает, поэтому настройки сохраняются (наш вывод из устройства таблицы разделов). Они пропадут при полном стирании флеш-памяти или если поменять схему разделов так, что раздел nvs переедет или станет меньше.

Можно ли пользоваться библиотекой EEPROM на ESP32?

Отдельной EEPROM у ESP32 нет. Espressif в документации Arduino-ESP32 прямо пишет, что библиотеку EEPROM следует считать заменённой на Preferences. Для новых проектов берите Preferences или NVS ESP-IDF напрямую.

Источники

  1. Espressif. ESP-IDF Programming Guide v6.1: Non-Volatile Storage Library (ESP32) — пары «ключ — значение» во флеш-памяти, ключ до 15 символов, строка до 4000 байт; страница — сектор 4096 байт, записи по 32 байта; встроенное выравнивание износа; при пропадании питания теряется только записываемая пара; значения попадают во флеш после nvs_commit
  2. Espressif. Arduino-ESP32 documentation: Preferences (tutorial и API) — Preferences — замена библиотеки EEPROM, хранит данные в NVS, переживает перезапуск и пропадание питания; пространства имён и ключи до 15 символов; одновременно открыто одно пространство имён; begin(name, readOnly), putInt, getInt(key, defaultValue); подходит для многих мелких значений, большие данные — в файловую систему
  3. Espressif. arduino-esp32, tools/partitions/default.csv (ветка master, 2026-10-24) — раздел nvs: смещение 0x9000, размер 0x5000

Нашли ошибку?