# EEPROM schreiben und lesen

**URL:** <https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232>\
**Category:** Deutsch\
**Created:** [January 26, 2020, 9:10pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232 "2020-01-26T21:10:14Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tequilamixer](https://avatars.discourse-cdn.com/v4/letter/t/87869e/32.png) [@Tequilamixer](https://forum.arduino.cc/u/Tequilamixer)\
**Post date:** [January 26, 2020, 9:10pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/1 "2020-01-26T21:10:14Z")

</div>

Hallo,

ich möchte auf einem Wemos D1 mini Daten dauerhaft speichern und lesen. Mein Testsketch dazu funktioniert jedoch nicht. Ich finde den Fehler nicht ☹ Wert lesen: 0

```cpp
#include <EEPROM.h>

int Schreibwert = 478; //the int to write to EEPROM
int Lesewert = 0;

void setup() {
  Serial.begin(9600);

  EEPROM.write(7, highByte(Schreibwert)); //write the first half
  EEPROM.write(8, lowByte(Schreibwert)); //write the second half

  Serial.print("Wert geschrieben: ");
  Serial.println(Schreibwert);
  Serial.println();
}

void loop() {
  
  byte high = EEPROM.read(7); //read the first half
  byte low = EEPROM.read(8); //read the second half
 
  Lesewert = (high << 8) + low; //reconstruct the integer
  Serial.print("Wert lesen: ");
  Serial.println(Lesewert);
  Serial.println();
  delay(10000);
    
  }

```

---

<div class="post-metadata">

**Author:** ![gregorss](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gregorss/32/340154_2.png) [@gregorss](https://forum.arduino.cc/u/gregorss)\
**Post date:** [January 26, 2020, 9:15pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/2 "2020-01-26T21:15:24Z")

</div>

> Tequilamixer:  
> Mein Testsketch dazu funktioniert jedoch nicht.

„Funktioniert nicht“ ist keine sonderlich hilfreiche Fehlerbeschreibung.

Was erwartest Du? Was passiert stattdessen? Erscheinen Fehlermeldungen?

Gruß

Gregor

---

<div class="post-metadata">

**Author:** ![Tequilamixer](https://avatars.discourse-cdn.com/v4/letter/t/87869e/32.png) [@Tequilamixer](https://forum.arduino.cc/u/Tequilamixer)\
**Post date:** [January 26, 2020, 9:20pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/3 "2020-01-26T21:20:38Z")

</div>

sorry.

Zu Beginn soll der Wert 478 zerlegt und in 2 Byte geschrieben werden.

Diese 2 Byte werden danach wieder gelesen, zusammengesetzt und seriell ausgegeben.

Dabei erscheint leider der Wert 0.

---

<div class="post-metadata">

**Author:** ![postmaster-ino](https://avatars.discourse-cdn.com/v4/letter/p/977dab/32.png) [@postmaster-ino](https://forum.arduino.cc/u/postmaster-ino)\
**Post date:** [January 26, 2020, 9:26pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/4 "2020-01-26T21:26:38Z")

</div>

Hi

Funktionieren die Funktionen highByte und lowByte korrekt?  
Ich vermisse diverse Serial.print, um dem Problem auf die Spur kommen zu können.  
Auch sollte statt WRITE eher UPDATE genommen werden, da WRITE ein explizieten Schreibzugriff bedeutet und so ein EEprom nicht ewig lebt.

MfG

---

<div class="post-metadata">

**Author:** ![uk1408](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/uk1408/32/241543_2.png) [@uk1408](https://forum.arduino.cc/u/uk1408)\
**Post date:** [January 26, 2020, 9:28pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/5 "2020-01-26T21:28:51Z")

</div>

Hallo,

beim ESP kommt im Setup die Größenfestlegung mit EEPROM.begin(Zahl); Zahl z.B. 10

nach den EEPROM-schreiben noch EEPROM.commit(); zum speichern.

---

<div class="post-metadata">

**Author:** ![Tommy56](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/tommy56/32/232943_2.png) [@Tommy56](https://forum.arduino.cc/u/Tommy56)\
**Post date:** [January 26, 2020, 9:31pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/6 "2020-01-26T21:31:28Z")

</div>

@TO: Du solltest Dir mal die Methoden put und get anschauen. Die können beliebige Daten schreiben/lesen.

Gruß Tommy

---

<div class="post-metadata">

**Author:** ![Tequilamixer](https://avatars.discourse-cdn.com/v4/letter/t/87869e/32.png) [@Tequilamixer](https://forum.arduino.cc/u/Tequilamixer)\
**Post date:** [January 26, 2020, 9:46pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/7 "2020-01-26T21:46:32Z")

</div>

ja mit EEPROM.begin(10); funktioniert es nun 🙂

Was bewirkt EEPROM.commit() dann? Was passiert, wenn man den Befehl weg lässt?

Brauche ich bei put und get die int-Variable nicht zerlegen?

---

<div class="post-metadata">

**Author:** ![postmaster-ino](https://avatars.discourse-cdn.com/v4/letter/p/977dab/32.png) [@postmaster-ino](https://forum.arduino.cc/u/postmaster-ino)\
**Post date:** [January 26, 2020, 9:55pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/8 "2020-01-26T21:55:09Z")

</div>

Zu put und get:

> **[EEPROM Library | Arduino Documentation](https://docs.arduino.cc/learn/built-in-libraries/eeprom)**
>
> Documentation for usage of the EEPROM library. EEPROM is a memory whose values are kept when the board is powered off.

Nicht als Link, Das könntest Du vll. sogar selber hinbekommen ...

das .commit() findet zumindest meine Suchmaschine nicht direkt bei Arduino, sondern eher bei ESP.

MfG

---

<div class="post-metadata">

**Author:** ![MicroBahner](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/microbahner/32/238923_2.png) [@MicroBahner](https://forum.arduino.cc/u/MicroBahner)\
**Post date:** [January 26, 2020, 9:58pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/9 "2020-01-26T21:58:57Z")

</div>

> Tequilamixer:  
> ja mit EEPROM.begin(10); funktioniert es nun 🙂

Wirklich? Auch wenn Du die Spannung wegnimmst und neu startest? Sind die Daten dann noch da?

Hier kommt nämlich der commit ins Spiel. Die Daten werden zunächst nur in einem bei 'begin' angelegten Schatten-RAM gespeichert. Erst mit commit werden sie in den nichtfüchtigen flash umkopiert ( ein echtes EEPROM hat der esp8266 nicht )

---

<div class="post-metadata">

**Author:** ![uk1408](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/uk1408/32/241543_2.png) [@uk1408](https://forum.arduino.cc/u/uk1408)\
**Post date:** [January 26, 2020, 10:07pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/10 "2020-01-26T22:07:02Z")

</div>

> Tequilamixer:  
> Was bewirkt EEPROM.commit() dann? Was passiert, wenn man den Befehl weg lässt?

Frag mal google, der weiß es genau, ich meine dass dann erst die Daten gespeichert werden da der ESP eigentlich kein echtes EEPROM hat. Und wenn es weglässt geht es halt nicht - das merkst dann wenn gespeicherte Wert nach einem !Neustart! lesen möchtest.  
Was möchtest denn letztendlich speichern? Zahlen, Charakters, Strings?  
Ich mache einfach aus allem Strings und speichere die dann Zeichen für Zeichen ins EEPROM mit put. Ob ich dabei ein paar Byte mehr oder weniger brauche ist mir eher egal....

---

<div class="post-metadata">

**Author:** ![Tequilamixer](https://avatars.discourse-cdn.com/v4/letter/t/87869e/32.png) [@Tequilamixer](https://forum.arduino.cc/u/Tequilamixer)\
**Post date:** [January 26, 2020, 10:17pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/11 "2020-01-26T22:17:11Z")

</div>

Richtig: ohne EEPROM.commit() ist beim nächsten Start wieder alles weg, mit commit() ist die Variable dauerhaft vorhanden.

Und Richtig: mit EEPROM.get und put lassen sich größere Variablen speichern

PS: Mir fallen viele Anwendungen ein. Bei meiner Balkonbewässerung soll der eingestellte Intervall zur Bewässerung nach einem unabsichtlichen Neustart (Stromausfall, ...) wieder geladen wird. Oder die Statistik für meinen Lichtschalter (wie oft über Echo geschaltet wurde) nicht verloren geht und z.B. 1 mal pro Tag gespeichert wird.

---

<div class="post-metadata">

**Author:** ![Tommy56](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/tommy56/32/232943_2.png) [@Tommy56](https://forum.arduino.cc/u/Tommy56)\
**Post date:** [January 26, 2020, 10:29pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/12 "2020-01-26T22:29:04Z")

</div>

Du hast aber im Hinterkopf, dass die Anzahl der Schreibzyklen begrenzt ist?

Gruß Tommy

---

<div class="post-metadata">

**Author:** ![Tequilamixer](https://avatars.discourse-cdn.com/v4/letter/t/87869e/32.png) [@Tequilamixer](https://forum.arduino.cc/u/Tequilamixer)\
**Post date:** [January 26, 2020, 10:54pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/13 "2020-01-26T22:54:35Z")

</div>

Bei 100.000 Zyklen kann ich 270 Jahre einmal am Tag die Statistik abspeichern, den Bewässerungsintervall ändere ich noch seltener.

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [January 26, 2020, 11:32pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/14 "2020-01-26T23:32:21Z")

</div>

> ```arduino
> int Schreibwert = 478; 
> 
> ```

EEPROM.write(7, highByte(Schreibwert)); //write the first half  
EEPROM.write(8, lowByte(Schreibwert)); //write the second half

> ```arduino
> 
> ```

Erstens:  
Ich verstehe was es werden soll!  
Es wird aber nix.  
Da ein int auf dem ESP 32Bit(4Byte) breit ist.

Zweitens:  
Die händische Adressberechnung ist Fehler trächtig.  
Diese könnte/sollte man dem Compiler überlassen.  
Der ist meist sorgfältiger als ein Mensch.

---

<div class="post-metadata">

**Author:** ![gregorss](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gregorss/32/340154_2.png) [@gregorss](https://forum.arduino.cc/u/gregorss)\
**Post date:** [January 27, 2020, 1:41am UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/15 "2020-01-27T01:41:39Z")

</div>

> Tequilamixer:  
> Bei 100.000 Zyklen kann ich 270 Jahre einmal am Tag die Statistik abspeichern, den Bewässerungsintervall ändere ich noch seltener.

~~Na prima. Solche Sachen kannst Du ausrechnen, aber für eine ordentliche Fehlerbeschreibung und für eine Erwähnung der Tatsache, dass Du noch nicht einmal einen Arduino benutzt, bist Du zu blöd?!~~  
~~Sauber.~~

s. #18

---

<div class="post-metadata">

**Author:** ![uk1408](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/uk1408/32/241543_2.png) [@uk1408](https://forum.arduino.cc/u/uk1408)\
**Post date:** [January 27, 2020, 7:34am UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/16 "2020-01-27T07:34:49Z")

</div>

> gregorss:  
> ….und für eine Erwähnung der Tatsache, dass Du noch nicht einmal einen Arduino benutzt, bist Du zu blöd?!
> 
> Sauber.

Das ist genau der Ton den ich hier oftmals sehr unpassend finde.  
Und wer zu blöd ist richtig zu lesen (1. Post: ich möchte auf einem Wemos D1 mini Daten dauerhaft speichern und lesen) sollte mit solchen Bemerkungen vorsichtig sein. Oder musst du nur die Anzahl deiner Postings erhöhen?

---

<div class="post-metadata">

**Author:** ![Tequilamixer](https://avatars.discourse-cdn.com/v4/letter/t/87869e/32.png) [@Tequilamixer](https://forum.arduino.cc/u/Tequilamixer)\
**Post date:** [January 27, 2020, 9:18am UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/17 "2020-01-27T09:18:58Z")

</div>

@ uk1408: Danke, ganz meiner Meinung 🙂

@ combie: Wie kann ich dem Compiler die Adressierung meiner Variable überlassen? Und wenn EEPROM.put(0,INT\_VarA) 4 Byte belegt, darf ich die 2. Variable dann erst ab EEPROM.put(4,INT\_VarB) schreiben?

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [January 27, 2020, 9:45am UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/18 "2020-01-27T09:45:16Z")

</div>

> Und wenn EEPROM.put(0,INT\_VarA) 4 Byte belegt, darf ich die 2. Variable dann erst ab EEPROM.put(4,INT\_VarB) schreiben?

Das fragst du doch jetzt nicht wirklich, oder?  
Manno...

> Wie kann ich dem Compiler die Adressierung meiner Variable überlassen?

In dem du deine Daten, die im virtuellen EEPROM landen sollen, in einer Struktur zusammenfasst.  
offsetof() zeigt dir die Position in der Struktur.

```arduino
struct PersistenteDaten
{
  int anzahl;
  float spannung;
} __attribute((__packed__));

// anzahl aus dem EEPROM lesen
int anz;
EEPROM.get(offsetof(PersistenteDaten,anzahl),anz);

// ganze Struktur aus dem EEPROM lesen
PersistenteDaten daten;
EEPROM.get(0,daten);

```

_ungetestet_

Schreiben geht natürlich äquvalent.

Wofür \_\_attribute(( **packed** )) gut ist, und ob du es benötigst darfst du selber herausfinden.  
Aber Vorsicht, es besteht die Gefahr, dass du dabei was lernst.

Tipp:  
Beim lernen der Sprache, welche du verwendest, würden dir dieses ganzen Dinge von selber ins Hirn hüpfen.  
Ich rate dir zu einem schönen, dicken+fetten und modernem C++ Buch.

---

<div class="post-metadata">

**Author:** ![gregorss](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gregorss/32/340154_2.png) [@gregorss](https://forum.arduino.cc/u/gregorss)\
**Post date:** [January 27, 2020, 9:32pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/19 "2020-01-27T21:32:28Z")

</div>

> uk1408:  
> Das ist genau der Ton den ich hier oftmals sehr unpassend finde.  
> Und wer zu blöd ist richtig zu lesen (1. Post: ich möchte auf einem Wemos D1 mini Daten dauerhaft speichern und lesen) sollte mit solchen Bemerkungen vorsichtig sein. Oder musst du nur die Anzahl deiner Postings erhöhen?

Uh. Shit. Da habe ich mich ja mal ordentlich zum Deppen gemacht. Entschuldigung.

Gruß

Gregor

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [May 6, 2021, 1:49pm UTC](https://forum.arduino.cc/t/eeprom-schreiben-und-lesen/633232/20 "2021-05-06T13:49:05Z")

</div>


