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