Zapisywanie trwałych danych w ESP32 Flash Preferences

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);
  }
}

Leave a Comment

Scroll to Top