EEPROM

Lese­zeit: 5 Minu­ten

Erklä­rung

EEPROM des Ardui­no UNO R3

Das EEPROM (Elec­tri­cal­ly Erasable Pro­gramma­ble Read-Only Memo­ry) ist eine klei­ne „Fest­plat­te“. Aller­dings fasst sie nur 1024 Byte. Jeder Spei­cher­platz ist 1 Byte groß und kann des­halb nur eine 1 Byte gro­ße Varia­ble oder einen Teil einer ande­ren Varia­blen auf­neh­men.
Der Inhalt bleibt nach dem Aus­schal­ten erhalten.

EEPROM des ESP32

Der ESP32 hat kei­nen eige­nen Bau­stein für das EEPROM, er nutzt viel­mehr einen Teil des Flash-Spei­chers (non-vola­ti­le sto­rage NVS) und zwar 512 Byte. Laut Daten­blatt sind 100.000 Schreib­zu­grif­fe möglich.

Funk­tio­nen der Biblio­thek EEPROM

Schlüs­sel­wortAkti­on
write(Speicherplatz, Wert)beschreibt einen Speicherplatz
nur für 1 Byte gro­ße Varia­ble (byte, char)
update(Speicherplatz, Wert)aktua­li­siert den Wert eines Speicherplatzes
Im Unter­schied zu wri­te() wird der Wert nur geschrie­ben, wenn er sich vom bis­he­ri­gen Wert unterscheidet.
nur für 1 Byte gro­ße Varia­ble (byte, char)
read(Speicherplatz, Wert)liest den Wert an einem Speicherplatz
nur für 1 Byte gro­ße Varia­ble (byte, char)
put(Speicherplatz, Wert)schreibt den Wert unge­ach­tet der Grö­ße der Variable
anwend­bar für alle Variablen 
get(Speicherplatz, Wert)liest den Wert unge­ach­tet der Grö­ße der Variable
anwend­bar für alle Variablen 
length()zeigt die Grö­ße des EEPROMs an

Jeder Funk­ti­on muss EEPROM. vor­an­ge­stellt werden.

Bei­spie­le für die Spei­che­rung ver­schie­de­ner Variablen

byte

// eingebaute Bibliothek einbinden 
# include "EEPROM.h"

// ESP32
#define EEPROM_GROESSE 6

byte Zufallszahl; 
byte MaxWuerfeln = 5; 
int Minumum = 1; 
int Maximum = 7; 

void setup() 
{ 
  // ESP32
  EEPROM.begin(EEPROM_GROESSE);

  Serial.begin(9600);
  
  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);
 
  // Zufallsgenerator starten   
  randomSeed(analogRead(A0)); 

  // Zufallszahlen schreiben   
  for (int i = 0; i < MaxWuerfeln; i ++)   
  { 
    Zufallszahl = random(Minumum, Maximum); 
    EEPROM.write(i, Zufallszahl);   
  } 

  // Zufallszahlen lesen  
  for (byte i = 0; i < MaxWuerfeln; i ++) 
  { 
    Serial.println(EEPROM.read(i));
  } 
} 

void loop() 
{  
  // bleibt leer, Programm wird nur einmal ausgeführt 
}

char-Array

# include "EEPROM.h"

// ESP32
#define EEPROM_GROESSE 40

void setup() 
{ 
  // ESP32
  EEPROM.begin(EEPROM_GROESSE);

  Serial.begin(9600); 
  
  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);

  char BeispielString1[] = "Programmieren mit "; 
  char BeispielString2[] = "Arduino ist toll!"; 

  // Startadresse 
  int SpeicherAdresse = 0; 

  // ersten String schreiben 
  EEPROM.put(SpeicherAdresse, BeispielString1); 

  // Startadresse auf das Zeichen hinter das Ende des ersten Strings setzen 
  SpeicherAdresse = sizeof(BeispielString1); 

  // String schreiben 
  EEPROM.put(SpeicherAdresse, BeispielString2); 

  // ersten String lesen 
  for (int i = 0; i < sizeof(BeispielString1) - 1; i++)
  { 
    Serial.print(char(EEPROM.read(i)));
    // Serial.print(char(EEPROM[i])); 
  }

  // zweiten String lesen 
  for (int i = SpeicherAdresse; i < SpeicherAdresse + sizeof(BeispielString2) - 1; i++) 
  { 
        Serial.print(char(EEPROM.read(i)));
    // Serial.print(char(EEPROM[i]));
  }
}

void loop()
{ 
  // bleibt leer → das Programm soll nur einmal ausgeführt werden
} 

int

# include "EEPROM.h"

// ESP32
#define EEPROM_GROESSE 30

void setup()
{
  // ESP32
  EEPROM.begin(EEPROM_GROESSE);

  Serial.begin(9600);
  
  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);

  int Zahl1 = 12;
  int Zahl2 = 21;
 
  // "Hilfsvariable", in die das Ergebnis des Speicherauslesens geschrieben wird
  int Ergebnis;
 
  // 1. Zahl schreiben
  int Speicheradresse = 0;
  EEPROM.put(Speicheradresse, Zahl1);
 
  // 2. Zahl schreiben
  // Speicheradresse um Länge der Variable int verschieben
  Speicheradresse += sizeof(int);
  EEPROM.put(Speicheradresse, Zahl2);

  // Produkt berechnen und schreiben
  // Speicheradresse um Länge der Variable int verschieben
  Speicheradresse += sizeof(int);
  EEPROM.put(Speicheradresse, Zahl1 * Zahl2);

  // Speicheradresse auf Start setzen
  Speicheradresse = 0;
  
  // Daten in die "Hilfsvariable" Ergebnis einlesen und anzeigen
  EEPROM.get(Speicheradresse, Ergebnis);
  Serial.print(String(Ergebnis) + " * ");

  // Speicheradresse um Länge der Variable int verschieben
  Speicheradresse += sizeof(int);

  // Daten in die "Hilfsvariable" Ergebnis einlesen und anzeigen
  EEPROM.get(Speicheradresse, Ergebnis);
  Serial.print(String(Ergebnis) + " = ");
  Speicheradresse += sizeof(int);
  EEPROM.get(Speicheradresse, Ergebnis);
  Serial.print(Ergebnis);
}

 void loop()
 {
   // bleibt leer → das Programm soll nur einmal ausgeführt werden
 }

float

# include "EEPROM.h"

// ESP32
#define EEPROM_GROESSE 30

void setup()
{
  // ESP32
  EEPROM.begin(EEPROM_GROESSE);

  Serial.begin(9600);
  
  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);

  float Zahl1 = 12.56;
  float Zahl2 = 21.23;
 
  // "Hilfsvariable", in die das Ergebnis des Speicherauslesens geschrieben wird
  float Ergebnis;

  // formatierte Zahl , statt .
  String ErgebnisFormat;
 
  // 1. Zahl schreiben
  int Speicheradresse = 0;
  EEPROM.put(Speicheradresse, Zahl1);

  // 2. Zahl schreiben
  // Speicheradresse um Länge der Variable float verschieben
  Speicheradresse += sizeof(float);
  EEPROM.put(Speicheradresse, Zahl2);

  // Produkt berechnen und schreiben
  // Speicheradresse um Länge der Variable float verschieben
  Speicheradresse += sizeof(float);
  EEPROM.put(Speicheradresse, Zahl1 * Zahl2);

  // Speicheradresse auf Start setzen
  Speicheradresse = 0;

  // Daten in die "Hilfsvariable" Ergebnis einlesen und anzeigen
  EEPROM.get(Speicheradresse, Ergebnis);

  // Zahl formatieren, , statt .
  ErgebnisFormat = String(Ergebnis);
  ErgebnisFormat.replace(".", ",");
  Serial.print(ErgebnisFormat + " * ");

  // Speicheradresse um Länge der Variable float verschieben
  Speicheradresse += sizeof(float);

  // Daten in die "Hilfsvariable" Ergebnis einlesen und anzeigen
  EEPROM.get(Speicheradresse, Ergebnis);
  ErgebnisFormat = String(Ergebnis);
  ErgebnisFormat.replace(".", ",");
  Serial.print(ErgebnisFormat + " = ");
   
  Speicheradresse += sizeof(float);
  EEPROM.get(Speicheradresse, Ergebnis);
  ErgebnisFormat = String(Ergebnis);
  ErgebnisFormat.replace(".", ",");
  Serial.print(ErgebnisFormat);
}

void loop()
{
  // bleibt leer → das Programm soll nur einmal ausgeführt werden
}

Flash Flash SRAM SRAM Speichermanagement Speichermanagement

Letzte Aktualisierung: 30. Sep 2024 @ 13:53