Zapis w pamięci Flash z Preferences
ESP32 nie ma wbudowanej pamięci Eeprom. Umożliwia jednak zapisywanie trwałych danych w pamięci Flash. Flash podobnie jak Eeprom ma określoną żywotność, do 10-100tyś cykli na sektor. Jednym ze sposobów na zapisywanie danych jest użycie Preferences. Wgranie nowego programu nie kasuje danych z Preferences. Dane pozostają nawet po restarcie lub odłączeniu zasilania.
Kiedy warto używać Preferences w ESP32?
- Do rzadko zmieniających się ustawień (np. konfiguracja WiFi, ID urządzenia, kalibracja).
- Do zapisania stanu po restarcie (np. ostatni stan przekaźnika).
- Gdy nie chcesz używać systemu plików (SPIFFS/LittleFS).
Kiedy NIE używać Preferences?
- Jeśli musisz zapisywać dane bardzo często (np. co sekundę).
- Do logowania zdarzeń – lepiej użyć RTC RAM lub zapisać dane w buforze i przesyłać je do serwera.
- Gdy potrzebujesz struktury plików – wtedy lepszy będzie SPIFFS lub LittleFS.
Alternatywy dla częstego zapisu danych
- RTC RAM – Jeśli dane nie muszą przetrwać restartu, ale muszą przetrwać głęboki sen.
- Zapis do SD – jeśli potrzebujesz dużo miejsca na dane.
- Pamięć FRAM (zewnętrzna, I2C/SPI) – bardzo duża żywotność: 1E13 cykli i szybkość zapisu 20MHz,np. MB85RS64V
- Buforowanie w RAM i okresowy zapis – np. zamiast zapisywać za każdym razem, zapisuj tylko co kilka minut.
Usuwanie danych z Preferences
- przez preferences.clear() lub preferences.remove(“klucz”)
- w Arduino IDE poprzez opcję “Erase All Flash Before Sketch Upload: Enabled”
- zapisanie nowych danych pod tym samym kluczem – stare zostaną nadpisane
Program do zapisu danych w pamięci Flash ESP32 z Preferences co 5s
#include <Preferences.h>
Preferences preferences;
int counter;
void setup() {
Serial.begin(115200);
delay(1000);
preferences.begin("storage", false);
counter = preferences.getInt("savedCounter", 0);
Serial.printf("Odczytany licznik: %d\n", counter);
preferences.end();
}
void loop() {
Serial.printf("Counter: %d\n", counter);
counter++;
preferences.begin("storage", false);
preferences.putInt("savedCounter", counter);
preferences.end();
delay(5000);
}
Zapisywanie liczby kliknięć przycisku ESP32 w pamięci Flash z Preferences
#include <Preferences.h>
Preferences preferences;
int counter = 0;
const int BTN_PIN = 0;
void setup() {
Serial.begin(115200);
pinMode(BTN_PIN, INPUT_PULLUP);
preferences.begin("storage", false);
counter = preferences.getInt("savedCounter", 0);
Serial.printf("Odczytany licznik: %d\n", counter);
preferences.end();
}
void loop() {
if (digitalRead(BTN_PIN) == LOW) {
while (digitalRead(BTN_PIN) == LOW)
;
counter++;
Serial.printf("Licznik: %d\n", counter);
preferences.begin("storage", false);
preferences.putInt("savedCounter", counter);
preferences.end();
delay(50);
}
}