Hallo Leute,
ich bin blutiger Anfänger, habe mir jedoch bisher schon viel erarbeitet.
In meinem Projekt einer dezentralen Staubabsaugung steuere ich erfolgreich 5 Klappen mit Servos und eine zweistufige Absaugung. Jetzt bin ich dabei die Betriebsstunden der Anlage zu erfassen und will dann den Filterwechsel und die zwei Motoren wechselweise schalten, wenn bestimmte Betriebszeiten erreicht sind. Auch da bin ich schon sehr weit. Nachdem jedoch die jeweiligen Einschaltzeiten der Absaugung nur wenige Minuten sein können, benötige ich einen großen Zahlenwert um die notwendigen Nachkommastellen berücksichtigen zu können. Das alles nur vorab zur Erklärung.
Ich kann eine 8 stellige Zahl in das EEPROM schreiben und auch auslesen, solange es VOR void loop() geschieht. Sobald ich void loop() aufrufe geht der Wert verloren. Ich habe den Code nun auf die minimalste Größe reduziert, der Wert geht auch hier verloren. Ich gehe davon aus, dass es wohl ein trivialer Fehler ist, ich komme aber leider nicht drauf.
Ich bin für jede Hilfe dankbar.
Der Code ist nicht zu lange, deshalb hier im Klartext noch einmal.
/* ====== Anfang Version 91a ============
* Der Wert von betrstd_alt geht mit start voidloop() verloren
*/
#include <EEPROM.h> // Library EEPROM lesen und schreiben
#include <Wire.h> // Library Kommunikation über I2C Bus
#include "SSD1306Ascii.h" // Library Display
#include "SSD1306AsciiWire.h" // Library für Display Kommunikation
#define I2C_ADDRESS 0x3C // Display I2C Bus Adresse
SSD1306AsciiWire oled; // Display Type festlegen
long betrstd_alt; // speichert die Betriebsstunden aus dem EEPROM als "lange" Zahl
long betrstd_neu; // speichert die Betriebsstunden neu in das EEPROM als "lange" Zahl
long betr_count = 0; // counter für die Anzahl der Schleifen in void(taster) als Basis der Betriebsstunden
//Schreiben auf EEPROM vorbereiten
void write_EEPROM(int address, long betrstd_neu) // Unterprogramm EEPROM SCHREIBEN, schreibt die Zahl, maximal 8 Stellen, in 4 Speicherplätze je 2 Byte
{
EEPROM.write(address, (betrstd_neu >> 24) & 0xFF);
EEPROM.write(address + 1, (betrstd_neu >> 16) & 0xFF);
EEPROM.write(address + 2, (betrstd_neu >> 8) & 0xFF);
EEPROM.write(address + 3, betrstd_neu & 0xFF);
}
//EEPROM AUSLESEN - Der Wert ist in Stunden/1000 angegeben. 1225 = 1,225 Stunden!!
long read_EEPROM(int address)
{
return ((long)EEPROM.read(address) << 24) +
((long)EEPROM.read(address + 1) << 16) +
((long)EEPROM.read(address + 2) << 8) +
(long)EEPROM.read(address + 3);
}
void setup() {
Wire.begin();
Wire.setClock(400000L);
oled.begin(&Adafruit128x64,I2C_ADDRESS); // Start Displaykommunikation
oled.setFont(System5x7); // Auswahl der Schriftart
// EEPROM lesen
write_EEPROM(100, 1000500L); //>> Kann gelöscht werden, wenn Wert auf 0 resettet ist
long betrstd_alt = read_EEPROM(100); // Liesst das EEPROM aus und speichert die lange Zahl als Betriebsstunden alt ab.
// Anzeige Startbildschirm
oled.clear(); // Anzeige löschen
oled.println("BETRIEBSBEREIT V9.1a"); // Anzeige Betriebsbereit und Versionsnummer
oled.print("Stunden: ");
oled.println(betrstd_alt/1000.000); // Anzeige Betriebsstunden .000 wg. Nachkommastellen
oled.println(betrstd_alt); /// WERT VORHANDEN
}
void loop() {
oled.println(betrstd_alt); /// = 0
}