Mehrere Integer in EEProm Schreiben und Lesen

Hallo zusammen,

Ich muss für mein Projekt mehrere Integer / Float Zahlen speichern.
zb. 12365.00 / 2254135214.00 / 25.20
Diese Zahlen könne Variieren (werden ca. 10 mal in der Laufzeit des Arduinos geändert (5-6Jahre).
Ich habe es normal mit:

  float f = 123456;
  EEPROM.put(0 + sizeof(int), f);
  f = 2345678;
  EEPROM.put(1 + sizeof(int), f);

So habe ich das Problem das beim lesen:

  float g = 0;
  EEPROM.get(0 + sizeof(int), g);
  Serial.print("0:    ");
  Serial.println(g);
  EEPROM.get(12 + sizeof(int), g);
  Serial.print("1:    ");
  Serial.println(g);

Folgende Zahlen ausgelesen werden:

0    0.00
1    2345678.00

Wie kann ich das lösen wenn die Zahlen zwischen 1-8 stellen haben und 2 Nachkommastellen?

Gruss Schnibli

Wenn Du float schreiben/lesen willst, solltest Du auch sizeof(float) benutzen.

Gruß Tommy

Verwenden Sie eine Struktur und lesen/schreiben Sie die Struktur mit put und get.

https://www.arduino.cc/en/Reference/EEPROMPut

dann brauchst du dir keine Gedanken über die Speicheradresse machen

du verhaust dich mit den Adressen und Längen.

definiere dir eine Struktur für deine Daten und überlass die Längenberechnung dem Compiler, der kann das verlässlich.

ungeprüft

#include <EEPROM.h>

struct Persist{
  float f;
  float g;
} persist;

void setup() {
  Serial.begin(115200);
  //persist.f = 123456;
  //persist.g = 0;
  //EEPROM.put(0, persist);
  EEPROM.get(0, persist);
  Serial.println(persist.f);
  Serial.println(persist.g);
}

void loop() {
  // put your main code here, to run repeatedly:

}
1 Like

Vielleicht sogar die Adresse vom Compiler ermitteln lassen.
Hab deins mal so umgebaut, denn da fehlt gar nicht mehr viel.

#include <EEPROM.h>

struct Persist
{
  float f;
  int g;
};

Persist imEeprom EEMEM;

Persist imRam;


void setup()
{
  Serial.begin(115200);
  //imRam.f = 123.456;
  //imRam.g = 0;
  //EEPROM.put(int(&imEeprom),imRam);
  EEPROM.get(int(&imEeprom), imRam);
  Serial.println(imRam.f);
  Serial.println(imRam.g);
}

void loop()
{
}

funktioniert es?

(EEMEM ist eine coole Idee)

Ja!
Für AVRs

was mir daran noch nicht gefällt, ist dieser Cast dort
EEPROM.get( int(& imEeprom), imRam);

Auch das der Adressparameter nicht Typesicher ist.
So kann man dann sich doch noch damit vertun

Ich habe mir 2 Funktionen gebaut, welche den Cast verstecken und das auslesen typisiert erledigen.


// e Referenz auf Daten im EEPROM
// r Referenz auf Daten im RAM

template< typename T> inline T &eeGet(T &e, T &r)
{
  return EEPROM.get(reinterpret_cast<int>(&e),r);
}  
      

template< typename T> inline const T &eePut(T &e, const T &r)
{
  return EEPROM.put(reinterpret_cast<int>(&e),r);
}    

Nutzung, dann so:

  //eePut(imEeprom,imRam);
 eeGet(imEeprom, imRam);

Hallo Zusammen

Vielen dank für die Vielen Hilfreichen Inputs.
Das Beispiel #5 von combie habe ich nun zum laufen gebracht.
(Hier sehe ich einen nachteil: Wenn der erste Wert an Zeichen zunimmt "zb. 1234.23 -> 12345.23" dann muss ich immer alle Werte neu speichern oder?

Die zweite Variante #7 bringe ich nicht zum laufen da ich nicht ganz durchblicke.

Gruss Schnibli

Nein!
Die Anzahl sichtbarer Zeichen hat nichts mit sizeof(float) zu tun.
Bitte in einem C++ Handbuch über DatenTypen kundig machen.

Ich habe deinen Code heute ausprobiert und es funktioniert nicht.

#include <EEPROM.h>

struct Persist {
  float f;
  int g;
};

Persist imEeprom EEMEM {    // Arduino erzeugt *.eep Datei
  f: 3.14,
  g: 4711
};

Persist imRam;

void setup() {
  Serial.begin(115200);
  EEPROM.get(int(&imEeprom), imRam);
  Serial.println(imRam.f);
  Serial.println(imRam.g);
}

void loop() {}

Die musst Du "per Hand" schreiben.
Gab hier mal eine Kurzbeschreibung: Daten vom Compiler in EEprom schreiben lassen

Ja :slight_smile:

Welches ja ist es?
Das "gab es" ja?
Oder das "funktioniert doch" ja?

beide

und der Smiley war da, weil Nr. 5 es nicht erwähnt hat (was mein Punkt 'funktioniert es?' war)

Dafür findest du in #7 eine Anleitung, wie man das "Automatisieren" kann.

das war ein Hinweis darauf, dass #5 etwas bearbeitet werden musste. Nur meine 2cts

Zur Kenntnisnahme:

#5 ist schon ganz ok so.
Es bisschen "selber mit denken" darf ruhig sein.

Wie ich reagiere:
Ich schreibe keine Romane! (selten)

Auf Kritik, "wie ich hier im Forum helfe" reagiere ich meistens ganz übel und unausstehlich.
Zum Ausgleich kritisiere ich auch nie(selten) wie andere helfen.

Kritik in der Sache, ist ein ganz anderes Buch!
Die MUSS immer erlaubt sein.

Ich muss auch nicht immer, mit allen, der gleichen Meinung sein.
Wie auch?
Zu manchen Themen habe ich selber mehrere Meinungen, die sich teilweise widersprechen.

Zu #5:
Das Beispiel sollte zeigen, wie man den Compiler zur Ermittlung von EEPROM Adressen nutzen kann. Es war nicht beabsichtigt ein allumfassendes EEPROM Tutorial zu sein.

Zu #6:
Du hast nachgefragt.
Das ist ok. Richtig so.

Darauf hast du in #7 eine Antwort und einen Link zu einem von mir geschriebenen Tutorial/Roman bekommen.
Wenn du das nicht liest/verstehst, dann ist das dein Problem.

Posting #5 hat damit nichts zu tun.
Und ich auch nicht!
Im Gegenteil, habe ja in #7 versucht Klärung herzustellen.

Es tut mir auch ein bisschen leid, dass mein Verhalten, meine Perfektion, meine Postings, nicht immer deinen Erwartungen entsprechen.
Es würde helfen, wenn du deine Erwartungen klarer, und vor allen Dingen vorher äußerst. Je deutlicher und je früher, desto besser kann ich darauf reagieren.

Tipp:
Ich kann freundlich sein.
Ich kann sachlich sein.
Ich kann aber auch einen Streit mit aller mir möglichen Gewalt führen. Da habe ich keinerlei Hemmungen.

Frage mal z.B. @Doc_Arduino danach, der wird dir das sicherlich bestätigen.
Fachlich sind wir meistens dicht beieinander, gehen auch freundlich miteinander um.
Wird es aber persönlich, dann spritzt das Blut.

Ich bin nicht einverstanden. aber das ist in Ordnung

Ich schreibe keine Romane! (selten)

Ich bin wieder anderer Meinung :wink:

Jeder hat das Recht, die Welt anders zu sehen.

#5
Es steht sogar in den Kommentaren drin, wie man die Variablen/Struktur füllt und speichert.

Du hast deine Meinung und deine Erwartungen zu meinen Postings.
Ich erwarte, dass du meine Postings aufmerksam liest und klare Fragen stellst, wenn da irgendwas unklar ist.

Mit Vorwürfen ist keinem gedient.
Die machen auch keinen glücklich.

Vorwürfe und nachtreten führen meist zu Widerstand.
Und Widerstand, das möchten wir doch beide nicht, oder?

Dialog, Kooperation, ja.
Disput, Kampf, nein.
? ? ? ?

du nimmst das viel zu ernst

Ich hatte Erwartungen. Ich dachte, du würdest den Hinweis verstehen. Du hast nicht.

Es ist keine große Sache. Die Welt dreht sich weiter.