EEPROM Wert geht im void loop() verloren

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
  
}

Test_V9.1a_uebergabe_betrstd_alt_an_voidloop.ino (2.27 KB)

Da solltest Du mal etwas über den Gültigkeitsbereich von Variablen lesen.

Bei Dir wird long betrstd_alt nochmals in der setup()-Funktion definiert. Diese Ausgabe ist damit für loop() unsichtbar.

Lösung:
Das long vor betrstd_alt im setup() entfernen.

Leis mal was lokale und globale Variablen sind und welche wo gesehen werden.
Grüße Uwe

Da liegt der Fehler:

RoAndru:

{...

long betrstd_alt = ...
...}

Wie die Anderen schon geschrieben haben: Variablen, die Du in einem „Block“ (begrenzt durch { und }) deklarierst, sind auch nur in diesem Block gültig („sichtbar“ - Stichwort „scope“).

Deklariere betrstd_alt vor setup(), dann ist das eine globale Variable, die auch in loop() gültig ist.

Gruß

Gregor

und dann noch der Hinweis: lies der die Doku zu EEPROM.get und EEPROM.put durch, dann brauchst du deine Werte nicht mehr händisch auf bytes aufteilen/zusammenlesen.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.