Das EEPROM ist eine kleine „Festplatte“ beim Arduino. Allerdings fasst sie nur 1024 Byte. Der Inhalt bleibt nach dem Ausschalten erhalten.
Jeder Speicherplatz ist 1 Byte groß und kann deshalb nur eine 1 Byte große ➨Variable oder einen Teil einer anderen Variablen aufnehmen.
Der Inhalt bleibt nach dem Ausschalten erhalten.
Für das Programm ist der Typ byte am besten geeignet, weil er nur 1 Byte beansprucht und genau einen Speicherplatz belegt. Er umfasst die Zahlen von 0 bis 255.
Für das Speichern von Würfelaugen reicht er vollkommen aus.
Beispiel Speichern und Lesen von Zufallszahlen:
// eingebaute Bibliothek einbinden
# include <EEPROM.h>
byte Zufallszahl;
byte MaxWuerfeln = 5;
// Maximum muss 7 sein
// Zufallszahl wird immer nach unten gerundet
int Minumum = 1;
int Maximum = 7;
void setup()
{
Serial.begin(9600);
// Zufallsgenerator starten
randomSeed(analogRead(0));
// Zufallszahlen schreiben
for (int i = 0; i < MaxWuerfeln; i ++)
{
Zufallszahl = random(Minumum, Maximum);
EEPROM.write(i, Zufallszahl);
}
// Zufallszahlen lesen
for (int i = 0; i < MaxWuerfeln; i ++)
{
Serial.println(EEPROM[i]);
}
}
void loop()
{
// bleibt leer, Programm wird nur einmal ausgeführt
}
Jedem Befehl muss EEPROM. vorangestellt werden:
Methoden der Bibliothek EEPROM
Methode | Funktion |
---|---|
write(Speicherplatz, Wert) | beschreibt einen Speicherplatz nur für 1 Byte große Variable (byte, char) |
update(Speicherplatz, Wert) | aktualisiert den Wert eines Speicherplatzes Im Unterschied zu write() wird der Wert nur geschrieben, wenn er sich vom bisherigen Wert unterscheidet. nur für 1 Byte große Variable (byte, char) |
read(Speicherplatz, Wert) | liest den Wert an einem Speicherplatz nur für 1 Byte große Variable (byte, char) |
put(Speicherplatz, Wert) | schreibt den Wert ungeachtet der Größe der Variable anwendbar für alle Variablen |
get(Speicherplatz, Wert) | liest den Wert ungeachtet der Größe der Variable anwendbar für alle Variablen |
length() | zeigt die Größe des EEPROMs an |
Das Programm soll:
- 5-mal würfeln
- die Anzahl der Dreier- Viererpaschs und der Kniffel ermitteln
- die Werte ins EEPROM schreiben
Benötigte Bauteile:
- Taster
- Leitungsdrähte
Baue die Schaltung auf.
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Beim Programmstart sollen die Werte ausgelesen und abgefragt werden, ob die gespeicherten Werte gelöscht werden sollen.
So soll es aussehen:
Binde die Bibliothek EEPROM ein und definiere die Variablen:
#include <EEPROM.h>
byte Zufallszahl;
byte MaxWuerfeln = 5;
int Minumum = 1;
int Maximum = 7;
int TASTER = 8;
int TasterLesen;
Im setup-Teil wird das EEPROM ausgelesen und gefragt, ob die bisherige Statistik gelöscht werden soll.
void setup()
{
Serial.begin(9600);
pinMode(TASTER, INPUT_PULLUP);
randomSeed(analogRead(0));
/*
Überblick Statistik
Speicherstelle EEPROM
0 -> Anzahl der Spiele
1 -> Anzahl Dreierpasch
2 -> Anzahl Viererpasch
3 -> Anzahl Kniffel
*/
Serial.print("Anzahl bisheriger Spiele: ");
Serial.println(EEPROM[0]);
Serial.print("Anzahl Dreierpasch: ");
Serial.println(EEPROM[1]);
Serial.print("Anzahl Viererpasch: ");
Serial.println(EEPROM[2]);
Serial.print("Anzahl Kniffel: ");
Serial.println(EEPROM[3]);
/*
Abfrage ob die bisherigen Daten
aus dem EEPROM gelöscht werden sollen
Umlaute ersetzen: ö -> \u00f6
*/
Serial.println("---------------------------------------");
Serial.println("Bisherige Statistik l\u00f6schen (j/n)?");
Serial.println("---------------------------------------");
}
Im loop-Teil wird zunächst die Antwort auf die Frage „Bisherige Statistik löschen“ verarbeitet ...
void loop()
{
// Variable definieren
byte Zufallszahl;
// auf serielle Eingabe warten
while (Serial.available() > 0)
{
// solange lesen, bis return \n eingegeben wurde
String Eingabe = Serial.readStringUntil("\n");
// das letzte Zeichen ist return → soll entfernt werden (-1)
Eingabe = Eingabe.substring(0, Eingabe.length() - 1);
// die ersten 4 Speicherstellen mit 0 überschreiben
if (Eingabe == "j")
{
for (int i = 0; i < 4; ++i)
{
EEPROM.write(i, 0);
}
Serial.println("Statistik gel\u00f6scht!");
}
else Serial.println("Statistik bleibt erhalten!");
Serial.println("Bitte zum W\u00fcrfeln Taster dr\u00fccken!");
}
Statistik löschen und die gespeicherten Werte lesen:
int AnzahlEins = 0;
int AnzahlZwei = 0;
int AnzahlDrei = 0;
int AnzahlVier = 0;
int AnzahlFuenf = 0;
int AnzahlSechs = 0;
// Werte aus EEPROM lesen
byte AnzahlSpiele = EEPROM[0];
byte DreierPasch = EEPROM[1];
byte ViererPasch = EEPROM[2];
byte Kniffel = EEPROM[3];
Nachdem der Taster gedrückt wurde, werden in einer for-Schleife die Zufallszahlen gebildet und mit switch auf die Anzahl der Einsen, Zweien … untersucht.
TasterLesen = digitalRead(TASTER);
delay(200);
for (int i = 0; i < MaxWuerfeln; i++)
{
Zufallszahl = random(Minumum, Maximum);
// Anzahl der einsen, zweien ... zählen
// wird für die Auswertung benötigt
switch (Zufallszahl)
{
case 1:
AnzahlEins ++;
break;
case 2:
AnzahlZwei ++;
break;
case 3:
AnzahlDrei ++;
break;
case 4:
. . .
. . .
case 5:
. . .
. . .
case 6:
. . .
. . .
}
Serial.println(Zufallszahl);
// Summe berechnen
Summe += Zufallszahl;
// Summe anzeigen
Serial.println("-----------------------------");
Serial.print("Summe: ");
Serial.println(Summe);
Auswertung und Speichern:
Die Anzahl wird erhöht und in die entsprechende Speicherstelle geschrieben:
// Dreierpasch
if (AnzahlEins == 3)
{
Serial.println("Dreierpasch 1");
DreierPasch ++;
EEPROM.update(1, DreierPasch);
}
if (AnzahlZwei == 3) {
Serial.println("Dreierpasch 2");
DreierPasch ++;
EEPROM.update(1, DreierPasch);
}
. . .
. . .
// Viererpasch
if (AnzahlEins == 4)
{
Serial.println("Viererpasch 1");
ViererPasch ++;
EEPROM.update(2, ViererPasch);
}
if (AnzahlZwei == 4)
{
Serial.println("Viererpasch 2");
ViererPasch ++;
EEPROM.update(2, ViererPasch);
}
if (AnzahlDrei == 4)
{
Serial.println("Viererpasch 3");
ViererPasch ++;
EEPROM.update(2, ViererPasch);
}
. . .
. . .
/*
Auswertung Kniffel
wenn AnzahlEins == 5 oder (||) AnzahlZwei = 5 ...
keine Auswertung mit welcher Zahl der Kniffel gewürfelt wurde
Anzahl wird um 1 erhöht und in die Speicherstelle 2 geschrieben
*/
if (AnzahlEins == 5 || AnzahlZwei == 5 || AnzahlDrei == 5 || AnzahlVier ==
5 || AnzahlFuenf == 5 || AnzahlSechs == 5)
{
Serial.println("Kniffel");
Kniffel ++;
EEPROM.update(3, Kniffel);
}
Jetzt muss noch die Anzahl bisheriger Spiele in den Speicher geschrieben werden, der Speicher gelesen und angezeigt werden.
// Anzahl der Spiele in Speicherstelle 0 schreiben und anzeigen
EEPROM.update(0, AnzahlSpiele);
Serial.println("-----------------------------");
Serial.print("Anzahl bisheriger Spiele: ");
Serial.println(EEPROM[0]);
// Anzahl der bisherigen Dreier- Vierpasch und Kniffel anzeigen
Serial.print("Anzahl Dreierpasch: ");
Serial.println(EEPROM[1]);
Serial.print("Anzahl Viererpasch: ");
Serial.println(EEPROM[2]);
Serial.print("Anzahl Kniffel: ");
Serial.println(EEPROM[3]);
}
}
Mit einigen zusätzlichen Zeilen wird die Statistik erweitert:
Serial.print(float(EEPROM[1]) / float(EEPROM[0]) * 100);
Serial.println(" %");
. . .
. . .
Verwandte Aufgaben:
- DHT22 - Wetterdaten aufzeichnen
- Lottozahlen auf eine SD-Karte schreiben
- Lottozahlen mit Zeitstempel anzeigen und auf einer SD-Karte speichern
Letzte Aktualisierung: