В этом руководстве показано, как постоянно сохранять данные во флэш-памяти ESP32 с помощью библиотеки Preferences.h. Данные, хранящиеся во флэш-памяти, сохраняются при сбросах или сбоях питания. Использование библиотеки Preferences.h полезно для сохранения таких данных, как сетевые учетные данные, ключи API, пороговые значения или даже последнее состояние GPIO. Вы узнаете, как сохранять и считывать данные из флэш-памяти.
Preferences.h Library
В предыдущем руководстве мы рекомендовали использовать библиотеку EEPROM для сохранения данных во флэш-памяти. Однако библиотека EEPROM устарела в пользу библиотеки Preferences.h. Эта библиотека “устанавливается” автоматически, когда вы устанавливаете платы ESP32 в свой Arduino IDE.Библиотека Preferences.h предпочтительно используется для хранения значений переменных с помощью пар ключ:значение. Постоянное сохранение данных может быть важно для:
- запомнить последнее состояние переменн
- ой; сохранить настройки;
- сохраните, сколько раз устройство было активировано;
- или любой другой тип данных, который вам необходимо сохранить навсегда.
Если вместо переменных вам нужно сохранять файлы в ESP32, мы рекомендуем вместо этого использовать файловую систему (SPIFFS). Чтобы узнать, как сохранять файлы в файловой системе ESP32, вы можете прочитать одно из следующих руководств:
Install ESP32 Filesystem Uploader in Arduino IDE
ESP32 with VS Code and PlatformIO: Upload Files to Filesystem (SPIFFS)
Сохранение данных с помощью библиотеки Preferences.h
Данные, сохраненные с помощью настроек, структурированы следующим образом:
namespace {
key:value
}
Вы можете сохранять разные ключи в одном и том же пространстве имен, например:
namespace {
key1: value
1 key2: value2
}
В практическом примере эта конфигурация может быть использована для сохранения ваших сетевых учетных данных:
credentials {
ssid: "your_ssid
" pass: "your_pass"
}
В предыдущем примере учетные данные - это пространство имен, а ssid и pass - это ключи.Вы также можете иметь несколько пространств имен с одним и тем же ключом (но каждый ключ имеет свое значение):
namespace1{
key:value1
}
namespace2{
key:value2
}
При использовании библиотеки Preferences.h вам следует определить тип данных, который вы хотите сохранить. Позже, если вы захотите прочитать эти данные, вы должны знать тип сохраненных данных. Другими словами, тип данных для записи и чтения должен быть одинаковым.Вы можете сохранить следующие типы данных, используя Preferences.h: char, Uchar, short, Ushort, int, Uint, long, Ulong, long64, Ulong64, float, double, bool, string и bytes.
Preferences.h
Чтобы использовать библиотеку Preferences.h для хранения данных, сначала вам нужно включить ее в свой эскиз:
#include <Preferences.h>
Затем вы должны инициировать экземпляр библиотеки настроек. Вы можете назвать это предпочтениями, например:
Preferences preferences;
После этого вы можете использовать следующие методы для обработки данных с использованием библиотеки Preferences.h.
Начало работы с Preferences
Метод begin() открывает ”пространство хранения" с определенным пространством имен. Аргумент false означает, что мы будем использовать его в режиме чтения/записи. Используйте значение true, чтобы открыть или создать пространство имен в режиме только для чтения.
preferences.begin("my-app", false);
В этом случае имя пространства имен - my-app. Имя пространства имен ограничено 15 символами.
Отчистка Preferences
Используйте clear(), чтобы очистить все настройки в открытом пространстве имен (это не удаляет пространство имен):
preferences.clear();
Извлечь ключ
Удалить ключ из открытого пространства имен:
preferences.remove(key);
Закрыть Preferences
Используйте метод end(), чтобы закрыть настройки в открытом пространстве имен:
preferences.end();
Введите ключевое значение (сохраните значение)
Вы должны использовать различные методы в зависимости от типа переменной, которую вы хотите сохранить.
Получить значение ключа (Считанное значение)
Аналогично, вы должны использовать различные методы в зависимости от типа переменной, которую вы хотите получить.
Удалить пространство имен
В реализации настроек Arduino нет способа полностью удалить пространство имен. В результате в течение нескольких проектов раздел настроек энергонезависимого хранилища ESP32 (nvs) может быть заполнен. Чтобы полностью стереть и переформатировать память NVS, используемую настройками, создайте эскиз, содержащий:
#include <nvs_flash.h>
void setup() {
nvs_flash_erase(); // erase the NVS partition and..
. nvs_flash_init(); // initialize the NVS partition.
while(true);
}
void loop() {
}
Вы должны загрузить новый эскиз на свою плату сразу после выполнения вышеуказанного, иначе он будет переформатировать раздел NV при каждом включении.
Preferences.h - Сохранить ключ:пары значений
Для простого примера того, как сохранять и получать данные с помощью Preferences.h, в вашей Arduino IDE перейдите в File> Examples> Preferences> StartCounter.
/* ESP32 startup counter example with Preferences library.
This simple example demonstrates using the Preferences library to store how many times the ESP32 module has booted. The Preferences library is a wrapper around the Non-volatile storage on ESP32 processor. created for arduino-esp32 09 Feb 2017 by Martin Sloup (Arcao) Complete project details at https://RandomNerdTutorials.com/esp32-save-data-permanently-preferences/*/
#include <Preferences.h>
Preferences preferences;
void setup() {
Serial.begin(115200);
Serial.println();
// Open Preferences with my-app namespace. Each application module, library, etc
// has to use a namespace name to prevent key name collisions. We will open storage in
// RW-mode (second parameter has to be false).
// Note: Namespace name is limited to 15 chars.
preferences.begin("my-app", false);
// Remove all preferences under the opened namespace
//preferences.clear();
// Or remove the counter key only
//preferences.remove("counter");
// Get the counter value, if the key does not exist, return a default value of 0
// Note: Key name is limited to 15 chars.
unsigned int counter = preferences.getUInt("counter", 0);
// Increase counter by 1 counter++;
// Print the counter to Serial Monitor
Serial.printf("Current counter value: %u\n", counter);
// Store the counter to the Preferences
preferences.putUInt("counter", counter);
// Close the Preferences
preferences.end(); // Wait 10 seconds Serial.println("Restarting in 10 seconds...");
delay(10000); // Restart ESP
ESP.restart();
}
void loop() {
}