EEprom Speicher Arduino?
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int taster = 10;
int speaker = 13;
int sensor = A0;
//Speichervariablen
int m1;
int m2;
int m3;
int Data;
int Max;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
pinMode(taster, INPUT);
pinMode(speaker, OUTPUT);
pinMode(sensor, INPUT);
Serial.begin(9600);
lcd.begin();
}
void loop() {
if (digitalRead(taster) == HIGH){
Serial.println("Messung");
lcd.clear();
lcd.print("Messung :");
digitalWrite(speaker, HIGH);
delay(500);
digitalWrite(speaker, LOW);
delay(10500);
m1 = analogRead(sensor);
delay(500);
m2 = analogRead(sensor);
delay(500);
m3 = analogRead(sensor);
digitalWrite(speaker, HIGH);
delay(100);
digitalWrite(speaker, LOW);
digitalWrite(speaker, HIGH);
delay(100);
digitalWrite(speaker, LOW);
Data = (m1+m2+m3)/3;
Serial.println(Data);
lcd.print(Data);
}
Hi, mein Projekt ist es
den Atemalkohol eins Menschen auszulesen und über ein LCD-Display auszugeben. Dies funktioniert auch so weit. Nun will ich den höchsten Wert mithilfe des EEPROM speichern (Bestenliste) und in Zeile zwei anzeigen. Kann mir da jemand helfen, ich blicke das mit dem EEPROM nicht so ganz. Danke
3 Antworten
Ich habe zwar keine praktische Erfahrung mit EEPROM, aber die Arduino Dokumentation hilft beim Verständnis.
Nach deinem Beispiel willst du warscheinlich Data speichern, welches ein einzelner Integer ist.
Zum Lesen und Speichern brauchst du eine Adresse im EEPROM Speicher, wo du ablegen möchtest. Die Adresse ist ein Integer kann z.B. 0 sein.
int eeAddress = 0;
Beim Lesen und Speichern in der Doku wird zwar ein Float benutzt, aber wahrscheinlich wird es auch ein Overload für Integer geben. Also:
int data = 0;
EEPROM.get(eeAddress, data);
Danach wurde deine data Variable überschrieben.
Zum Ändern des Wertes solltest du EEPROM.update verwenden. Der Aufruf verändert den Wert auch nur, wenn verändert wurde. Also:
int data = 5;
EEPROM.update(eeAddress, data);
Das erforderliche Include hast du bereits drin:
#include <EEPROM.h>
Eine ordentliche Einrückung des Codes verbessert die Lesbarkeit. Die Arduino IDE (v1 und v2) bieten Optionen für eine automatische Formatierung. Alternative Texteditor sollten es auch können.
Das ist kein Hexenwerk.
Das EEPROM hat eine bestimmte Größe, wie groß das ist, das findest Du leicht im Datenblatt.
Hat es z.B. 512 Bytes, dann hat es einen Adressraum von 0 bis 511.
Die Lese und Schreibbefehle brauchen eine Adresse. Damit bestimmst Du in welche der Speicherzellen Du lesen oder schreiben möchtest. Du kannst ja mehrere Werte speichern oder lesen.
Zum beschreiben sagst Du einafch
EEPROM.write(address, byte);
Wobei Du für die Adresse auch einen festen Wert nehmen kannst wenn Du immer an der selben Stelle lesen/schreiben willst. Du kannst aber auch eine Konstante anlegen wenn Du mehrere Werte speichern möchtest damit Du die im Programm leicht erkennen kannst welche da bearbeitet wird.
Byte ist dann natürlich eine Zahl, Konstante oder Variable. Aber die muss 8-Bit sein. Dieser einfache Befehl kann nur ein Byte, kein Integer, float oder anderes nicht 8-bittiges.
Zum auslesen sagst Du einfach
variable = EEPROM.read(address);
Die Funktion EEPROM.read gibt also einen Returnwert mit dem Inhalt des EEPROMs an der angegebenen Adresse.
Du musst nur bedenken, dass das EEPROM nur etwa 100 tausend Schreibzyklen verträgt. (es gibt auch welche die können eine Million). Besser als EEPROM.read ist die Funktion EEPROM.update.
Diese Funktion dauert doppelt so lange, denn die liest erst mal was da schin drin ist und löscht und schreibt dann nur, wenn der alte Wert anders war. So ersparst Du dem EEPROM völlig unnötige Schreibzyklen.
Da Du ja sowieso prüfst ob der gespeicherte Wert kleiner ist als der gerade gemessene, brauchst Du das hier nicht. Aber für andere Projekte sollte man das halt wissen!
Du arbeitest in Deinem programm mit INT, also 16-Bit. Das musst Du dann erst mal in zwei einzelne Bytes zerlegen. Wie das geht steht hier:
http://shelvin.de/eine-integer-zahl-in-das-arduiono-eeprom-schreiben/
Hier brauchst Du also zwei Adressen im EEPROM, eine für das LOW Byte und eine für das HIGH Byte. Welche Zahlen Du da als Adresse benutzt ist völlig egal. Wichtig ist nur, dass die beim lesen und beim schreiben die selben sind und nicht vertauscht sind.
Dazu musst du deinen Messwert (ein 16-bit Integer) erstmal in 2 Bytes umwandeln, und nach dem Auslesen aus dem EEprom wieder in einen Integer.
Hier ist das glaube ich ganz gut erklärt: