Fehler in der Programmierung

#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>

const int button1Pin = 5;
const int button2Pin = 6;
const int button3Pin = 7;
const int button4Pin = 4;
const int relay1Pin = 12;
const int relay2Pin = 8;  // Aktualisiert auf Pin 8
const int counterAddress = 0;

int storedState;
unsigned long lastDisplayTime = 0;
const unsigned long displayInterval = 3000;  // 30 Sekunden in Millisekunden (30000)

// Hier passen Sie die Adresse Ihres LCD-Moduls an
LiquidCrystal_I2C lcd(0x27, 16, 2);  // Standardadresse für ein 16x2 LCD

void setup() {
  pinMode(button1Pin, INPUT_PULLUP);
  pinMode(button2Pin, INPUT_PULLUP);
  pinMode(button3Pin, INPUT_PULLUP);
  pinMode(button4Pin, INPUT_PULLUP);
  pinMode(relay1Pin, OUTPUT);
  pinMode(relay2Pin, OUTPUT);

  digitalWrite(relay1Pin, HIGH);  // Deaktiviere Relais 1 zu Beginn
  digitalWrite(relay2Pin, HIGH);  // Deaktiviere Relais 2 zu Beginn

  Serial.begin(9600);

  // Lesen Sie den gespeicherten Zustand von EEPROM
  storedState = EEPROM.read(counterAddress);
}

void loop() {
  // Überprüfe, ob Button 1 gedrückt wurde
  if (digitalRead(button1Pin) == LOW) {
    digitalWrite(relay1Pin, LOW);
    delay(500);
    digitalWrite(relay1Pin, HIGH);

    digitalWrite(relay2Pin, LOW);
    delay(500);
    digitalWrite(relay2Pin, HIGH);

    storedState++;
    EEPROM.write(counterAddress, storedState);
// Überprüfen Sie, ob die Zeit für die Anzeige des Zählerstands abgelaufen ist
  unsigned long currentTime = millis();
  if (currentTime - lastDisplayTime >= displayInterval) {
    // Aktualisieren Sie die Zeitmarke für die Anzeige
    lastDisplayTime = currentTime;

    // Löschen Sie den Inhalt des LCDs
    lcd.clear();

    // Setzen Sie den Cursor auf die erste Zeile
    lcd.setCursor(0, 0);

    // Anzeigen des Zählerstands auf dem LCD
    lcd.print("Zaehlerstand: ");
    lcd.print(storedState);
    
  }

  // Überprüfe, ob Button 2 gedrückt wurde
  else if (digitalRead(button2Pin) == LOW) {
    // Button 2 wurde gedrückt, aktiviere Relais 1 zweimal mit Pause
    for (int i = 0; i < 2; i++) {
      digitalWrite(relay1Pin, LOW);
      delay(500);
      digitalWrite(relay1Pin, HIGH);
      delay(500);
    }

    // Aktiviere Relais 2 für 10 Minuten
    digitalWrite(relay2Pin, LOW);
    delay(6000);
    digitalWrite(relay2Pin, HIGH);

    storedState += 2; // Erhöhe um 2, da der Button 2 zweimal gedrückt wurde
    EEPROM.write(counterAddress, storedState);
  }

  // Überprüfe, ob Button 3 gedrückt wurde
  else if (digitalRead(button3Pin) == LOW) {
    // Button 3 wurde gedrückt, aktiviere Relais 1 viermal mit Pause
    for (int i = 0; i < 4; i++) {
      digitalWrite(relay1Pin, LOW);
      delay(500);
      digitalWrite(relay1Pin, HIGH);
      delay(500);
    }

    // Aktiviere Relais 2 für 20 Minuten
    digitalWrite(relay2Pin, LOW);
    delay(12000);
    digitalWrite(relay2Pin, HIGH);

    storedState += 4; // Erhöhe um 4, da der Button 3 viermal gedrückt wurde
    EEPROM.write(counterAddress, storedState);
  }

  // Überprüfe, ob Button 4 gedrückt wurde (für das Zurücksetzen des Zählerstands)
  else if (digitalRead(button4Pin) == LOW) {
    // Setzen Sie den Zählerstand auf 0 und speichern Sie ihn im EEPROM
    storedState = 0;
    EEPROM.write(counterAddress, storedState);

    // Warten Sie kurz, um mehrere Tastendrücke zu verhindern
    delay(1000);
  }

  // Überprüfen Sie, ob die Zeit für die Anzeige des Zählerstands abgelaufen ist
  unsigned long currentTime = millis();
  if (currentTime - lastDisplayTime >= displayInterval) {
    // Aktualisieren Sie die Zeitmarke für die Anzeige
    lastDisplayTime = currentTime;

    // Ausgabe des Speicherzustands auf dem Serial Monitor
    Serial.print("Zählerstand: ");
    Serial.println(storedState);
  }
}

Ich habe fogende Fehler.
C:\Users\Admin\Desktop\Test LCD\sketch_feb13d\sketch_feb13d.ino: In function 'void loop()':
C:\Users\Admin\Desktop\Test LCD\sketch_feb13d\sketch_feb13d.ino:116:17: error: redeclaration of 'long unsigned int currentTime'
unsigned long currentTime = millis();
^~~~~~~~~~~
C:\Users\Admin\Desktop\Test LCD\sketch_feb13d\sketch_feb13d.ino:50:17: note: 'long unsigned int currentTime' previously declared here
unsigned long currentTime = millis();
^~~~~~~~~~~
C:\Users\Admin\Desktop\Test LCD\sketch_feb13d\sketch_feb13d.ino:125:1: error: expected '}' at end of input
}
^
Die LCD Ausgabe funktioniert auch noch nicht. Kann mir jemand helfen?

Bitte füge Dein Programm in Code-Tags ein, dann ist es besser lesbar:

<code>
Dein Programm
</code>

Das kannst Du auch nachträglich noch ändern.

#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>

const int button1Pin = 5;
const int button2Pin = 6;
const int button3Pin = 7;
const int button4Pin = 4;
const int relay1Pin = 12;
const int relay2Pin = 8;  // Aktualisiert auf Pin 8
const int counterAddress = 0;

int storedState;
unsigned long lastDisplayTime = 0;
const unsigned long displayInterval = 3000;  // 30 Sekunden in Millisekunden (30000)

// Hier passen Sie die Adresse Ihres LCD-Moduls an
LiquidCrystal_I2C lcd(0x27, 16, 2);  // Standardadresse für ein 16x2 LCD

void setup() {
  pinMode(button1Pin, INPUT_PULLUP);
  pinMode(button2Pin, INPUT_PULLUP);
  pinMode(button3Pin, INPUT_PULLUP);
  pinMode(button4Pin, INPUT_PULLUP);
  pinMode(relay1Pin, OUTPUT);
  pinMode(relay2Pin, OUTPUT);

  digitalWrite(relay1Pin, HIGH);  // Deaktiviere Relais 1 zu Beginn
  digitalWrite(relay2Pin, HIGH);  // Deaktiviere Relais 2 zu Beginn

  Serial.begin(9600);

  // Lesen Sie den gespeicherten Zustand von EEPROM
  storedState = EEPROM.read(counterAddress);
}

void loop() {
  // Überprüfe, ob Button 1 gedrückt wurde
  if (digitalRead(button1Pin) == LOW) {
    digitalWrite(relay1Pin, LOW);
    delay(500);
    digitalWrite(relay1Pin, HIGH);

    digitalWrite(relay2Pin, LOW);
    delay(500);
    digitalWrite(relay2Pin, HIGH);

    storedState++;
    EEPROM.write(counterAddress, storedState);
// Überprüfen Sie, ob die Zeit für die Anzeige des Zählerstands abgelaufen ist
  unsigned long currentTime = millis();
  if (currentTime - lastDisplayTime >= displayInterval) {
    // Aktualisieren Sie die Zeitmarke für die Anzeige
    lastDisplayTime = currentTime;

    // Löschen Sie den Inhalt des LCDs
    lcd.clear();

    // Setzen Sie den Cursor auf die erste Zeile
    lcd.setCursor(0, 0);

    // Anzeigen des Zählerstands auf dem LCD
    lcd.print("Zaehlerstand: ");
    lcd.print(storedState);
    
  }

  // Überprüfe, ob Button 2 gedrückt wurde
  else if (digitalRead(button2Pin) == LOW) {
    // Button 2 wurde gedrückt, aktiviere Relais 1 zweimal mit Pause
    for (int i = 0; i < 2; i++) {
      digitalWrite(relay1Pin, LOW);
      delay(500);
      digitalWrite(relay1Pin, HIGH);
      delay(500);
    }

    // Aktiviere Relais 2 für 10 Minuten
    digitalWrite(relay2Pin, LOW);
    delay(6000);
    digitalWrite(relay2Pin, HIGH);

    storedState += 2; // Erhöhe um 2, da der Button 2 zweimal gedrückt wurde
    EEPROM.write(counterAddress, storedState);
  }

  // Überprüfe, ob Button 3 gedrückt wurde
  else if (digitalRead(button3Pin) == LOW) {
    // Button 3 wurde gedrückt, aktiviere Relais 1 viermal mit Pause
    for (int i = 0; i < 4; i++) {
      digitalWrite(relay1Pin, LOW);
      delay(500);
      digitalWrite(relay1Pin, HIGH);
      delay(500);
    }

    // Aktiviere Relais 2 für 20 Minuten
    digitalWrite(relay2Pin, LOW);
    delay(12000);
    digitalWrite(relay2Pin, HIGH);

    storedState += 4; // Erhöhe um 4, da der Button 3 viermal gedrückt wurde
    EEPROM.write(counterAddress, storedState);
  }

  // Überprüfe, ob Button 4 gedrückt wurde (für das Zurücksetzen des Zählerstands)
  else if (digitalRead(button4Pin) == LOW) {
    // Setzen Sie den Zählerstand auf 0 und speichern Sie ihn im EEPROM
    storedState = 0;
    EEPROM.write(counterAddress, storedState);

    // Warten Sie kurz, um mehrere Tastendrücke zu verhindern
    delay(1000);
  }

  // Überprüfen Sie, ob die Zeit für die Anzeige des Zählerstands abgelaufen ist
  unsigned long currentTime = millis();
  if (currentTime - lastDisplayTime >= displayInterval) {
    // Aktualisieren Sie die Zeitmarke für die Anzeige
    lastDisplayTime = currentTime;

    // Ausgabe des Speicherzustands auf dem Serial Monitor
    Serial.print("Zählerstand: ");
    Serial.println(storedState);
  }
}

In der Fehlermeldung steht doch eindeutig drin, wo dein Fehler ist.

Du hast dies hier
unsigned long currentTime
doppelt definiert.
Und solange der Fehler drin ist, funktioniert auch nix.

Muss ich den 1. Eintrag oder 2. löachen?
Ich habe erst seid Gestern mit der Programmierung angefangen.

Das ist wirklich, was der Compiler sagt: Sie haben die Variable currentTime zweimal deklariert. Einmal reicht.

unsigned long currentTime = millis();
•••
currentTime = millis(); // Einfach den neuen Wert zuweisen, keine Notwendigkeit, die Variable erneut zu definieren

Als Höflichkeit gegenüber den Forenmitgliedern und Helfern, bitte korrigieren Sie den ersten Beitrag und fügen Sie bei Bedarf Code-Tags hinzu

Lösche mal den 2. Eintrag

Ich habe den 2. Eintrag gelöscht und folgende Fehler erhalten.
C:\Users\Admin\Desktop\Test LCD\sketch_feb13d\sketch_feb13d.ino: In function 'void loop()':
C:\Users\Admin\Desktop\Test LCD\sketch_feb13d\sketch_feb13d.ino:125:1: error: expected '}' at end of input
}
^

➜ ...

Mit Strg kannst du eine gut lesbare Formatierung in der IDE erzwingen.

Dann siehst du, dass am Ende noch eine Klammer "}" fehlt.

Die Fehler sind weg. Danke an alle. Ich habe das Programm überspielt und jetzt geht nichts mehr. Keine Tasten ; kein Speichern usw. Ich habe nur das Display Programm Hinzugefügt.
Woran kann das liegen.

Wie hast du das gemeint mit Strg?

Sorry, das T vergessen.
Strg + T

Posten Sie den Code (und eine Beschreibung Ihrer elektronischen Schaltung).

Als Höflichkeit gegenüber den Forenmitgliedern und Helfern, bitte korrigieren Sie den ersten Beitrag und fügen Sie bei Bedarf Code-Tags hinzu

#include <EEPROM.h>

const int button1Pin = 5;
const int button2Pin = 6;
const int button3Pin = 7;
const int button4Pin = 4;
const int relay1Pin = 12;
const int relay2Pin = 8;  // Aktualisiert auf Pin 8
const int counterAddress = 0;

int storedState;
unsigned long lastDisplayTime = 0;
const unsigned long displayInterval = 3000;  // 30 Sekunden in Millisekunden (30000)

void setup() {
  pinMode(button1Pin, INPUT_PULLUP);
  pinMode(button2Pin, INPUT_PULLUP);
  pinMode(button3Pin, INPUT_PULLUP);
  pinMode(button4Pin, INPUT_PULLUP);
  pinMode(relay1Pin, OUTPUT);
  pinMode(relay2Pin, OUTPUT);

  digitalWrite(relay1Pin, HIGH);  // Deaktiviere Relais 1 zu Beginn
  digitalWrite(relay2Pin, HIGH);  // Deaktiviere Relais 2 zu Beginn

  Serial.begin(9600);

  // Lesen Sie den gespeicherten Zustand von EEPROM
  storedState = EEPROM.read(counterAddress);
}

void loop() {
  // Überprüfe, ob Button 1 gedrückt wurde
  if (digitalRead(button1Pin) == LOW) {
    digitalWrite(relay1Pin, LOW);
    delay(500);
    digitalWrite(relay1Pin, HIGH);

    digitalWrite(relay2Pin, LOW);
    delay(500);
    digitalWrite(relay2Pin, HIGH);

    storedState++;
    EEPROM.write(counterAddress, storedState);
  }

  // Überprüfe, ob Button 2 gedrückt wurde
  else if (digitalRead(button2Pin) == LOW) {
    // Button 2 wurde gedrückt, aktiviere Relais 1 zweimal mit Pause
    for (int i = 0; i < 2; i++) {
      digitalWrite(relay1Pin, LOW);
      delay(500);
      digitalWrite(relay1Pin, HIGH);
      delay(500);
    }

    // Aktiviere Relais 2 für 10 Minuten
    digitalWrite(relay2Pin, LOW);
    delay(6000);
    digitalWrite(relay2Pin, HIGH);

    storedState += 2; // Erhöhe um 2, da der Button 2 zweimal gedrückt wurde
    EEPROM.write(counterAddress, storedState);
  }

  // Überprüfe, ob Button 3 gedrückt wurde
  else if (digitalRead(button3Pin) == LOW) {
    // Button 3 wurde gedrückt, aktiviere Relais 1 viermal mit Pause
    for (int i = 0; i < 4; i++) {
      digitalWrite(relay1Pin, LOW);
      delay(500);
      digitalWrite(relay1Pin, HIGH);
      delay(500);
    }

    // Aktiviere Relais 2 für 20 Minuten
    digitalWrite(relay2Pin, LOW);
    delay(12000);
    digitalWrite(relay2Pin, HIGH);

    storedState += 4; // Erhöhe um 4, da der Button 3 viermal gedrückt wurde
    EEPROM.write(counterAddress, storedState);
  }

  // Überprüfe, ob Button 4 gedrückt wurde (für das Zurücksetzen des Zählerstands)
  else if (digitalRead(button4Pin) == LOW) {
    // Setzen Sie den Zählerstand auf 0 und speichern Sie ihn im EEPROM
    storedState = 0;
    EEPROM.write(counterAddress, storedState);

    // Warten Sie kurz, um mehrere Tastendrücke zu verhindern
    delay(1000);
  }

  // Überprüfen Sie, ob die Zeit für die Anzeige des Zählerstands abgelaufen ist
  unsigned long currentTime = millis();
  if (currentTime - lastDisplayTime >= displayInterval) {
    // Aktualisieren Sie die Zeitmarke für die Anzeige
    lastDisplayTime = currentTime;

    // Ausgabe des Speicherzustands auf dem Serial Monitor
    Serial.print("Zählerstand: ");
    Serial.println(storedState);
  }
}

Hier ist alles noch Fehlerfrei und es soll nur noch an einem LCD Display die Impulse vom Relais 1 angezeigt werden.
Was muss eingetragen werden damit ich eine Anzeige bekommen?

Welches Display Programm ?

Dies schreibt nur ein einzelnes Byte (das niederwertige Byte) in das EEPROM.

Verwenden Sie put() und get() für komplexere Typen, die aus mehreren Bytes bestehen.

Danke. Vieleicht verstehe ich es nicht richtig. Die Ausgabe am Serial Monitor ist aber fehlerfrei.