Eine Long Integer Zahl mit 8 Byte soll im Arduino EEPROM abgelegt und dann wieder ausgelesen werden.
Long Integer in das EEPROM schreiben
void eepromWriteLong(long lo, int adr) { // long Wert in das EEPROM schreiben // Eingabe : adr Speicherplatz // Eingabe : lo Zahl, Wertebereich -2.147.483.648 bis 2.147.483.647 // // Matthias Busse 23.5.2014 Version 1.0 byte by; for(int i=0;i< 4;i++) { by = (lo >> ((3-i)*8)) & 0x000000ff; EEPROM.write(adr+i, by); } } // eepromWriteLong
Und eine Long Integer Zahl wieder auslesen
long eepromReadLong(int adr) { // long int Wert aus 4 Byte EEPROM lesen // Eingabe : adr bis adr+3 // Ausgabe : long Wert // // Matthias Busse 23.5.2014 Version 1.0 long lo=0; for(int i=0;i< 3;i++){ lo += EEPROM.read(adr+i); lo = lo << 8; } lo += EEPROM.read(adr+3); return lo; } // eepromReadLong
> Eine Integer Zahl in das Arduino EEPROM schreiben
von Matthias Busse
Pingback: Barometer Display mit 1h / 3h Differenz und Temperatur Ausgabe. Mit dem 5110 Display, BMP-180, Uno | Shelvin – Elektronik ausprobiert und erläutert
Pingback: Eine Integer Zahl in das Arduino EEPROM schreiben und wieder lesen | Shelvin – Elektronik ausprobiert und erläutert
Hallo,
Ich bin Anfänger und neu hier. Kann mir bitte jemand dabei helfen das program fertig zu machen?
In diesem Program gibt es 2 Zähler DWORD Zähler. Ein Zähler wird immer automatisch auf null gesetzt aber der zweite soll immer erhalten bleiben aber ich weiß nicht wie!? Um eine Antwort würde ich mich sehr freuen.
#include
int powerPin = 3;
int keyPin = 4;
int power = 0;
int powerState = 0;
int key = 0;
int keyState = 0;
int tStart = 0;
unsigned long count1 = 0;
unsigned long count2 = 0;
void setup()
{
Serial.begin(9600);
pinMode(keyPin,INPUT);
pinMode(powerPin,INPUT);
}
void loop()
{
powerState = digitalRead(powerPin);
keyState = digitalRead(keyPin);
if ( powerState != power )
{
delay(200);
if ( powerState == HIGH ) // positive flank
{
count1 = 0;
}
else
{
if( tStart != 0 )
tStart = 0;
}
power = powerState;
}
if( power == HIGH )
{
if (keyState != key)
{
delay(200);
if (keyState == HIGH) //positive flank
{
++count1;
++count2; // wie kann ich den Zähler in EEPROM speichern, so dass nicht gelöscht wird?
if( tStart == 0 )
tStart = millis();
}
key = keyState;
}
else
{
Serial.print(„count1: „);
Serial.println(count1);
Serial.print(„count2: „);
Serial.println(count2);
Serial.println();
delay(200);
}
}
}
Mögliche Komplettlösung mit Ausgabe von:
long Zahl im Arduino EEPROM ablegen und auslesen
#include
int adresse=103;
unsigned long lo1=4294967295;
unsigned long lo2;
void setup() {
Serial.begin(38400); // start serial
/*************************/
Serial.println(„Long in EEPROM schreiben\n“);
/*************************/
}
void loop() {
eepromWriteLong(lo1, adresse);
lo2 = eepromReadLong(adresse);
/*************************/
Serial.print(„\nSchreib Wert:\t“);
Serial.println(lo1);
Serial.print(„Lese Wert:\t“);
Serial.println(lo2);
Serial.println(„\n*******************************\n“);
/*************************/
delay(3000);
lo1 -= 1;
}
void eepromWriteLong(unsigned long lo1, int adr) {
// long Wert in das EEPROM schreiben
// Eingabe : adr Speicherplatz
// Eingabe : lo1 Zahl, Wertebereich -2.147.483.648 bis 2.147.483.647
byte by;
Serial.print(„EEPROM schreiben\n“);
for(int i=0;i> ((3-i)*8)) & 0x000000ff;
EEPROM.write(adr+i, by);
/*************************/
Serial.print(„Adresse: „);
Serial.print(adr+i);
Serial.print(„\tWert: „);
Serial.println(by, HEX);
/*************************/
}
/*************************/
Serial.print(„\n“);
/*************************/
} // eepromWriteLong
unsigned long eepromReadLong(int adr) {
// long int Wert aus 4 Byte EEPROM lesen
// Eingabe : adr bis adr+3
// Ausgabe : long Wert
unsigned long lo2=0;
Serial.print(„EEPROM lesen\n“);
for(int i=0;i< 3;i++){
lo2 += EEPROM.read(adr+i);
lo2 = lo2 << 8;
/*************************/
Serial.print("Adresse: ");
Serial.print(adr+i);
Serial.print("\tWert: ");
Serial.println(lo2, HEX);
/*************************/
}
lo2 += EEPROM.read(adr+3);
/*************************/
Serial.print("Adresse: ");
Serial.print(adr+3);
Serial.print("\tWert: ");
Serial.println(lo2, HEX);
/*************************/
return lo2;
} // eepromReadLong
Hallo, der Artikel ist zwar bereits älter, aber dennoch hat er mir sehr geholfen.
Vielen Dank dafür. Super gut erklärt.
Dennoch ist mir ein Fehler in deinem Text aufgefallen:
In der ersten Zeile schreibst du „Eine Long Integer Zahl mit 8 Byte soll …“ !
Eine long int Variable hat jedoch nur 4 Byte.
Kein großer Fehler, aber gerade bei Arduino wichtig 😉
Danke.
Gruß, Heiko