Frage zu EEPROMex.h

Hallo

Hat einer ein einfaches Beispiel für EEPROMex.h
Wie ich eine Zahl aus der variable in den EEPROM schreiben kann und auch wieder auslesen kann.

An den Beispiel aus libraries Sitze ich schon langer dran aber da mit komme ich nicht klar.

Bis dann
Ingo

Einfach read() und write() nehmen: http://arduino.cc/de/Reference/EEPROMRead http://arduino.cc/de/Reference/EEPROMWrite

Braucht eigentlich keine extra Lib. Für 2-Byte ints muss man halt die Zahl zerlegen. Das geht unter anderem hiermit: http://arduino.cc/en/Reference/LowByte http://arduino.cc/en/Reference/HighByte http://arduino.cc/en/Reference/WordCast (um aus einem int wieder zwei Bytes zu machen)

Es gibt auch noch das hier um beliebige Datentypen (bis hin zu structs) abzuspeichern: http://playground.arduino.cc/Code/EEPROMWriteAnything

Da werden die Daten einfach auf ein Byte Array gecastet

Hallo

So langsam komme ich da hinter. Erst mal vielen Dank.

Bis dann
Ingo

Hallo ingo79 Den namen der Bibliothek EEPROMex.h interpretiere ich daß diese ein externes EEprom ansteuern soll. Die Bibliothek eeprom.h , die im Arduino-Packet enthalten ist greift auf das in Kontroller vorhandene EEprom zu. Bitte schick uns die quelle der EEPROMex.h Viele Grüße Uwe

Hallo Uwe

Die EEPROMex.h greift auch auf den Kontroller vorhandene EEprom zu. Hier mal ein Link http://playground.arduino.cc/Code/EEPROMex

Bis dann Ingo

Da steht doch eigentlich alles was man braucht. Was die Funktionen machen ist am Namen ersichtlich.

Die musst nur mit den Adressen aufpassen. Die passieren wahrscheinlich immer noch auf Bytes.

Kann du mir das genauer erklären mit den Adressen und Bytes.

Die Adressen gehen von 0-1023 und jede Adresse spricht ein Byte an.

Mal angenommen wir wollen zwei ints abspeichern. Die haben jeweils zwei Bytes. Das muss man dann (mit EEPROMex.h) sowie es aussieht so machen:

int value1 = 1111;
int value2 = 2222;
writeInt(0, value1);
writeInt(2, value2);

Und nicht etwa writeInt(1, value2). Das würde das zweite Byte von value1 überschreiben.

Da gibt es auch eine Hilfs-Funktion um die Adressen zu verwalten (weiter unten bei "Address allocation"): http://thijs.elenbaas.net/2012/07/extended-eeprom-library-for-arduino/ Da kann man sich am Anfang einmal die Adressen aller Variablen berechnen lassen, was praktisch ist wenn man mit verschiedenen Datentypen arbeitet.

Vielleicht solltest du mal genau beschreiben was für Daten du abspeichern willst. Dann kann man auch was genaueres sagen :)

Ich möchte für meine Aquarium Steuerung die soll werte von Temperatur, PH und einschalt Zeiten Lampen usw. im EEprom abspeichern, das die nicht beim Stromausfall weg sind die ich über Menü eingegeben habe.

Ja, da ist dann diese Lib nicht schlecht. Gerade wenn du nicht wirklich damit auskennst.

Du kannst dann wie es in dem Link oben steht, erst mal die Adressen in setup() berechnen:

void setup()
{
    int addressTemp = EEPROM.getAddress(sizeof(float));
    int addressPH = EEPROM.getAddress(sizeof(float));
    int addressTimeHour = EEPROM.getAddress(sizeof(byte));
    int addressTimeMinute = EEPROM.getAddress(sizeof(byte));
}

Ich habe bei den Datentypen mal geraten. Musst du halt anpassen wenn du das anders willst. z.B. int statt float wenn du keine Komma-Stellen brauchst.

Dann kannst du auch gleich statt der normalen write Funktion die update Funktion verwenden:

updateFloat(addressTemp, temperature)

Und schon wird das nur geschrieben wenn sich der Wert geändert hat. Du musst halt für jeden Datentyp die entsprechende Funktion verwenden updateFloat() und readFloat() für floats, oder updateByte() und readByte() für Bytes.

Danke erstmals. So langsam versteh ich es.

Eigentlich brauchst Du für diese Werte keine int oder float-Variablen. Zeiten als Stunden und Minuten abspeichern, pH und Temperatur einfach einen Offset bezogen auf einen Minimalwert, gegebenenfalls mit 10 oder 100 multiplizieren un 1 oder 2 Kommastellen zu erhalten zB Referenzwert Temperatur 20 Grad; Offset 0 bis 25,5 (abgespeicherter Wert) also kannst Du von 20°C bis 45,5°C Sollwert in Zehntelschritten abspeichern. Für pH: Referenzwert pH6 Offset 0 bis 2,55; erreichst dann Sollwerte von 6 bis 8,55 in Hundertstelschritten.

Du kannst also Byte abspeichern und das braucht dann immer nur 1 Speicherstelle im EEprom.

Grüße Uwe

Hallo Uwe

Habe ich das richtig verstanden mit den Offset um die soll Temperatur im EEprom zu Speichern. Sagen wir mal 27,5°C ist die soll Temperatur die muss ich dann minus 20 und mit der 10 multiplizieren da kommt dann 75 bei raus und die 75 Speicher ich ins EEprom und verbrauche dann nur 1 Byte bis zu 255 und verbrauche ich dann ab 256 2 Byte?

Bis dann Ingo

Jein.
Ich glaube nicht, daß Du die Fische im Aquarium kochen willst. Auch glaube ich daß Du kein Nordpolarmerraqarium bauen willst um Kaltwasserkorallen zu züchten. So ist eine Temperatursollwerteinstellung von 20 bis 42,5 °C ausreichend, So kannst Du mit 1 Byte diesen Bereich abdecken. Falls ich daneben liege Kannst Du ja den Startwert (20°C) ändern. Du brauchst gar kein zweites Byte da der Einstellbereich ab Basistemperatur von 0 bis 25,5 ausreicht. Das gleiche gilt für den pH Wert.
Viele Grüße Uwe

Hallo Uwe

Nein das will ich ja nicht. Ich wollte nur Fragen ob ich das richtig verstanden habe?

Ich glaube Du hast es verstanden. Ich habe nur Probleme Dich zu verstehen. ;) ;) ;)

dann nur 1 Byte bis zu 255 und verbrauche ich dann ab 256 2 Byte?

Ja für Werte zwischen 0 und 255 brauchst Du nur ein Byte. Int Typ Variablen können 65636 Werte annehmen (von 0 bis ca 65635 als unsigned oder von ca -32768 bis +32767 und braucht 2 Byte. Ähnliches gilt für long und Float siehe http://arduino.cc/en/Reference/HomePage unter "DATA TYPE".

Du brauchst aber nicht 2 Byte wenn Du es so machst wie ich Dir vorgeschalagen habe (den Basiswert mußt Du definieren und ob Du mit dem möglichen Bereich auskommst).

Grüße Uwe