Jetzt merk dir das!

Wie die meisten elektronischen Sachen, wird ein Arduino auch vergesslich sobald der Strom weg ist. Zwar nicht was die Programmierung oder die Stammdaten (Konstanten oder Init Werte) angeht aber die Bewegungsdaten (Variablen etc) sind meist futsch nach dem Stromverlust.

Der konkrete Bedarfsfall bei mir ist ein Ausgabewert der nach jedem ausführen einer Aktion um eins hoch zählt und bei Verlust des Stromversorgung von einem Speicherpunkt aus wieder hoch zählen soll.
Nuja bei einem RasPi würde man das wohl auf der SD Karte tun… sowas hat ein Arduino aber nicht von Haus aus. Aber er hat einen EEPROM, nicht üppig gerade einmal 512 byte gross, aber wenn man weiss was man will oder braucht sollte das für den Anfang eigentlich reichen.
In meinem Fall gehe ich davon aus, das die Variable nicht einmal annähernd die maximale positive 16 Bit Integer Zahl erreichen soll. Also brauche ich nur einen winzigen Bruchteil meine verfügbaren 512 Adressen. Um genauer zu sein… gerade mal 2.
Die Arduino Dokumentation macht es sich bei ihrem Beispiel sehr einfach und lässt den maximalen positiv integer Wert von 1024 durch 4 teilen. Und lebt mit dem Rundungs-fehler.
Der Rundungs-fehler ist Datentyp bedingt. Kommt beim dividieren eines integer(ganz Zahlen) Wertes ein Bruch raus, wird auf den integer Wert abgerundet. Multipliziert man diesen gerundeten Wert dann mit dem vorherigen Divisor ist das Produkt niedriger als der vorherige Dividend. Man kann es gelegentlich verschmerzen… Wenn der Wert aber z.B. eine Liste fortsetzen soll ist das inakzeptabel.
Die Division ist also nur die halbe Miete. Es gibt jetzt 2 Möglichkeiten… entweder man Speichert an der 2ten Adresse den Rest oder den genauen Bitwert über beide Adressen…
Nachdem ich auch Denkfaul war, hab ich mich für die erste Variante entschieden.
Den Restwert oder auch Modulo erhält man mit %

Mein Code dafür sieht also in etwa so aus:

#include <EEPROM.h>

int var=EEPROM.read(0)*255+EEPROM.read(1);

void setup() {
var++;
EEPROM.write(0, var/255);
EEPROM.write(1, var%255);
}

void loop() {
}

Der Code hier würde jetzt jedes mal, sobald der Arduino Strom bekommt um eins hoch zählen. Ein wenig Sinn-frei für den Alltag, aber es demonstriert das Prinzip.

Man kann aber was draus machen…
z.B. Meine Variante, die den Inhalt einer integer Variable weg schreibt.
Höchster Wert eines Hochwasser Algorithmus oder ähnliches.

Wem der Interne EEPROM eines Arduino zu klein ist, sollte sich vielleicht nach einem externen EEPROM umschauen die gibt es schon für wenige Euros.

Dieser Beitrag wurde unter Allgemein veröffentlicht. Setze ein Lesezeichen auf den Permalink.