Arduino EEPROM Read & Write Data

Alle Arduino Boards basierend auf dem ATMega haben einen EEPROM Speicher. EEPROM steht für "Electrically Erasable Programmable Read-Only Memory" was bedeutet, dass es sich um einen elektronisch löschbaren Speicher handelt. Je nach Mikrocontroller beträgt die Speichergröße von einigen Bytes bis hin zu einigen Kilobytes. Der EEPROM ist ein nicht flüchtiger Speicher, der seine Daten auch im stromlosen Zustand vom Arduino behält. Auch nach einem Reset oder eines erneuten aufspielen der Software bleiben alle Daten erhalten. Der Speicher ist daher eine sehr gute Lösung wenn man bestimmte Einstellungen von einem Programm am Controller dauerhaft speichern oder im laufenden Betrieb ändern möchte. Dieser Artikel beschreibt, wie verschiedene Datentypen und Parameter in den Speicher geschrieben werden und anschließend auch wieder ausgelesen werden können.

Arduino EEPROM Space Structure

Speicheraufbau

Beim Arduino Uno beträgt der Speicher 1024 Byte bzw. einem Kilobyte. Aus der Informatik ist bekannt, dass ein Byte über acht Bit verfügt. Das bedeutet in einem Byte können acht Bit-Zustände (Nuller und Einser) gespeichert werden. Mit einem Byte kann man z. B. eine Zahl zwischen 0 und 255 speichern. Arbeitet man nach der ASCII-Tabelle, so kann man pro Byte auch einen Buchstaben oder ein Sonderzeichen speichern. Der Buchstabe "A" wäre dann in Dezimal die Zahl "65" was wiederum in Binär "0100 0001" ist. Diese acht Nuller und Einser ergeben dann ein Byte. Wird dieser Buchstabe in den Speicher geschrieben, wäre damit ein Byte von den 1024 Bytes verbraucht und es würden noch 1023 weitere Bytes zur Verfügung stehen. Würde man einen Text in den EEPROM speichern, so wäre hier platz für maximal 1024 Zeichen oder Buchstaben. Jedes einzelne Byte verfügt über eine eindeutige Adresse. Um ein Zeichen in den Speicher zu schreiben oder vom Speicher lesen zu können muss der Software die Adresse bekannt sein. Adressiert wird hier beginnend bei Null bis 1023.

Lebensdauer & Schreibzyklen

Obwohl der Speicher gerade für kleine Informationen sehr gut geeignet ist, gibt es hier einige Nachteile. Der größte Nachteil ist die Lebenszeit. Der EEPROM kann zwar unendlich oft gelesen werden aber wie beim hier beim Arduino nur etwa 100.000 mal beschrieben werden. Das klingt zwar recht hoch, ist es aber nicht. Möchte man einen Messwert jede Minute in den Speicher schreiben, so hat der Speicher eine Lebenszeit von etwa 70 Tagen. Speichert man stündlich in den Speicher, so ergibt sich daraus eine Lebenszeit von etwa 10 Jahren. Aus diesem Grund sollte man hier mit bedacht auf die Lebenszeit die Speicherung von Daten optimieren. Als alternative eignet sich hier ein Flash Speicher, der allerdings nur extern an den Controller angeschlossen werden kann. Diese Speicher können beliebig oft beschrieben werden. Ein weiterer Nachteil ist die Geschwindigkeit vom EEPROM. Die Speicherung von mehreren Bytes kann oft einige Millisekunden bis hin zu Sekunden dauern, was gerade bei zeitkritischen Programmen ein Problem darstellt.

Boolean und kleine Zahlen speichern

Je nach Datentyp, der vom Code verarbeitet werden muss, benötigt man bestimmte Speicherplätze. Um ein Boolean (True, False bzw. 1, 0) oder eine Zahl im Bereich von 0-255 zu speichern reicht ein Byte aus. Speichert man solche Werte ab, ist die Handhabung vom EEPROM relativ einfach. Der folgende Code zeigt, wie ein einzelnes Byte auf der Adresse "0" beschreiben und ausgelesen wird.

Arduino Read Write EEPROM

Integer Speichern

Bei einem Integer handelt es sich um einen Zahlen-Datentyp. Zahlen von 0 - 65.535 können mit zwei Bytes als "unsigned short Integer" dargestellt werden. Speichert man negative Zahlen, so reicht der Wertebereich von -32.768 bis 32.767 (signed Integer). Reicht dieser Wertebereich nicht aus, so kann man den Bereich durch das verwenden eines weiteren Bytes stark vergrößern. Wichtig ist bei der Speicherung, dass die großen Zahlen auf die einzelnen Bytes richtig aufgeteilt und beim Auslesen wieder richtig zusammengesetzt werden.

Arduino Save Integer to EEPROM

String Speichern

Auch Strings können im EEPROM abgespeichert werden. Das große Problem von einem String ist, dass es hier keine feste Speichergröße gibt und die Zeichenlänge somit dynamisch ist. Wird der gesamte EEPROM als Speicher für lediglich einen String verwendet, kann man hier einfach anhand der Länge entsprechend viele Bytes im EEPROM beschreiben. Speichert man jedoch zwei Strings in den Speicher, so kann es passieren, dass wenn der erste String länger wird, die restlichen Zeichen des zweiten Strings überschreiben werden und dieser somit beschädigt wird. Um dieses Problem zu umgehen gibt es verschiedene Lösungen. Die erste Variante wäre eine fixe Speicherzuweisung. Durch das zuweisen von bestimmten Bytes wird jedoch der String nicht mehr dynamisch und ist dadurch mit der Anzahl an Zeichen begrenzt. Eine andere Lösung wäre, dass alle nachfolgenden Strings bzw. Bytes nach hinten verschoben werden. Allerdings wird bei dieser Variante der EEPROM mehrfach belastet, was zu einer kürzeren Lebenszeit führt.

Arduino Save String to EEPROM

Code Beispiele

Die Arduino Codebeispiele beinhalten einfache Beispiele zum Lesen und Schreiben von kleinen Zahlen (Byte), Integer (16-Bit) und einen String mit einer länge von bis zu 250 Zeichen.

Oft gelesen

Anzeige:

Video zum Beitrag

Social Media

Newsletter