Daten im EEPROM speichern, auslesen und Variablen zuweisen

In diesem Beitrag möchte ich euch zeigen wie man Daten auf dem EEPROM des Arduino speichern und diese auch wieder auslesen kann. Beim dieser Art von Speicher handelt es sich um einen Speicherbereich im Microcontroller, der wie eine Festplatte, seine Daten auch nach dem ausschalten nicht verliert. Je nach Art des Microcontrollers stehen unterschiedliche Speichergrößen zwischen 512 Byte und 4 kByte zur Verfügung. Der AtMega328 den ich auf meinem Arduino-Uno-Board nutze verfügt z.B. über eine Größe von 1024 Bytes. 1024 Bytes hören sich nicht viel an, sind aber absolut ausreichend für die meisten Anwendungsfälle. Für größere Projekte gibt es die Möglichkeit externe Speicherchips zu nutzen.

ArduinoEEPROMPreview

Ich benutze in einem meiner Projekte diesen nicht flüchtigen Speicherbereich dazu, sämtliche Netzwerkeinstellungen, die ich zum betreiben des Ethernet-Shields und den Zugriff auf eine Website darüber benötige. Außerdem speichere ich die DeviceAdressen sämtlicher am Arduino angeschlossenen Temperatur-Sensoren. Diese Daten in diesem Speicherbereich des Micro-Controllers zu speichern bietet den Vorteil, diese Werte z.B. über das Terminal oder wahlweise über ein Webinterface, ändern zu können ohne den Arduino neu programmieren zu müssen.

Bei meiner Recherche zu diesem Thema stieß ich bei playground.arduino.cc auf folgenden Code, den ich für meine Anwendungen nutze. Um mein Projekt übersichtlich zu halten, habe ich den kompletten unten angegebenen Code auf eine eigene Seite ausgelagert. Dies geht in der Arduino IDE über das kleine Dreieck auf der rechten Seite unter der Lupe und einen Klick auf „Neuer Tab“. Diesen Tab habe ich unter EEPROM abgespeichert.

Arduino - Neues Tab

 

 

Arduino - TabName

 

 

Arduino-Sketch

EEPROM_TUTORIAL

In diesem Sketch habe ich zur Veranschaulichung die Ethernet und die DallasTemperature Libraries eingebunden um zu demonstrieren wie ich Netzwerkeinstellungen, sowie auch die DeviceAdressen meiner Temperatursensoren im nichtflüchtigen Speicher abspeichern, diese daraus laden und anschließend Variablen zuweisen kann. Die meisten Zeilen habe ich kommentiert so sollte eigentlich alles klar sein.

 

 

 

Arduino-Sketch

EEPROM

in diesem Sketch habe ich Teile von einem Sketch genutzt das ich auf http://playground.arduino.cc/Code/EepromUtil gefunden habe. Mit diesem Code ist es nämlich möglich Integerwerte und Strings in hoher Geschwindigkeit im EEPROM abzulegen was mit der Standard Library so nicht geht.

Wichtig „initializeEEPROM“ ganz unten können Sie die Standardwerte für Ihre Variablen deklarieren die im nichtflüchtigen Speicherbereich des Microcontrollers gespeichert werden sollen wenn das StatusFlag entweder ungleich 49 (0) ist oder  wenn die Variable „WRITE_EEPROM“ true ist. Bitte beachten Sie, wenn Sie z.B. für „ServerHost“ den Startwert 100 angeben und „ServerURL“ den Startwert 130 hat, dass der Text in „ServerHost“ dann auf keinen Fall länger als 30 Zeichen sein sollte. Andernfalls wird der Wert in „ServerURL“ überschrieben wird.

 

EEPROM-DUMP

Wenn Sie sich die Sketches genau angeschaut haben und die Ausgabe im Bild oben sehen, werden Sie sich sicher fragen was das zu bedeuten hat. Hier eine kurze Erklärung.
An Adresse 0 haben wir ja die Zahl 1 gespeichert, hier steht aber die Zahl 31. Das ist so ganz richtig, denn die Zahl 31 wurde in Hexadezimaler Form gespeichert. Der Hex-Wert 31 steht also für den Ascii-Wert 1. Danach folgen zwei Nullen, diese zwei Nullen erscheinen weil die Mac-Adresse, die als nächstes gespeichert wurde, als Startadresse die 2 bekommen hat und somit Adresse 1 leer ist. Danach haben wir die MAC-Adresse „5A:A2:DA:0D:56:7A“ gespeichert. Es gibt einige Rechner mit denen man HEX in ASCII umwandeln kann. Sie können aber auch eine Seite wie „https://de.wikipedia.org/wiki/ASCII“ benutzen um zu schauen was welcher Wert bedeutet. Also die 35 steht für die Zahl 5, die Zahl 41 steht für den Buchstaben A usw.

 

 

Um die Werte auszulesen und den deklarierten Variablen zuweisen zu können, nutzen Sie die Funktion „InitializeVariables“. Folgender Code ließt z.B. den ServerHost aus dem Adressbereich 100 aus, weißt diesen Wert der Variablen serverhost zu und gibt ihn über den seriellen Port aus.

 

Bei Fragen können Sie gern die Kommentarfunktion hier unten benutzen oder direkt bei Arduino Playground vorbeischauen.

Über Enrico S.

Programmierer, Webdesigner, Grafiker, Blogger, Screencaster, Arduino- und eMobility Enthusiast.

2 Kommentare zu “Daten im EEPROM speichern, auslesen und Variablen zuweisen

  1. Hallo Enrico,

    vielen Dank für diesen großartigen Text zum EEPROM eines Arduino.

    Der Text ist sehr ausführlich und gut verständlich.
    Er inspiriert mich, wie ich meine „Probleme“ lösen kann.

    Frage habe ich keine.

    Dieser Text ist der erste den ich aus aus deinem Blog gelesen habe und hoffe noch viele weitere in dieser Qualität und Ausfühlichkeit zu finden.

    Vielen Dank.

  2. Hallo, sehr schön erklärt, ich habe aber keine Lösung für mein sehr einfaches Problem gefunden.
    Ich möchte 6 Variablen von typ int einlesen und dauerhaft speichern. Die Werte können zwischen 0 und 10.000 liegen und sollen nach neustart wieder verwendet werden.

    Über eine Hilfe würde ich mich sehr freuen.