Beregnungsanlage mit einem Arduino MEGA 2560 in OOP

Du hast deinen Code in Post #1 noch nicht in Code Tags formatiert. Bitte nachholen.

ich zeige dir hier meinen Ansatz.
Es gibt eine Klasse generell für Buttons. Deren Aufgabe ist es einen Button zu debouncen.
Das was du aktuell als FlipFlop hast, würde ich in eine Klasse geben. Die besteht im wesentlichen aus einem LED Pin und eben einen Button.

Wenn du die Objekte in einem Array anlegst, sparst du dir viel Tipparbeit.

Code siehst du hier:
Flipflop (Button) - Wokwi ESP32, STM32, Arduino Simulator

Die Klasse Button könnte man jetzt auch verwenden für ein 30 ms Monoflop.
Also ähnliches Vorgehen, auch ein Monoflop besteht wieder aus einem Ausgabe Pin , einem kleinen Timer basierend auf millis() und eben einem Button.

Also etwas erweitert zum Beispiel so:
Flipflop Monoflop (Button) - Wokwi ESP32, STM32, Arduino Simulator

Wenn du Fragen hast - frage.

Hallo zusammen, ich habe alles gelesen und "unit8_t" erst einmal gegooglet, aber eigendlich brauche ich doch nur 1 oder 2 Zeilen und dann müßte es doch laufen.
Eine Zeile im Hauptprogramm, daß ich die LED Pin 26 abfragen kann oder 2 Zeilen, im Unterprogramm den "ein_speicher" ausgeben und im Hauptprgramm abfragen. Das mit dem ESP32 ist keine schlechte Idee gewesen, da es ihn gleich mit Display gibt, da würden sich, bei meinem Wissensstand aber andere Probleme ergeben. Mein Programm funktioniert ja soweit und was wichtiger ist, ich verstehe was da steht. Das ist mir wichtiger, als ein Programm zu "kupfern", welches funktioniert, aber ich nicht weiß, was darin passiert.
Das Programm ist jetzt eingekürzt, wegen der Übersichtlichkeit.
Hauptprogramm:

#include "FlipFlop.h"

TasterClass TasterE; //Erzeugen einer Instanz TasterClass für den ersten Taster

void setup() {
TasterE.setPin (40, 26); //Taster mit Pullup-Wiederstand

Serial.begin(4800); // Initialisierung der seriellen Kommunikation mit 115200 Baud
}

void loop() {

TasterE.CheckStatus();
Serial.print("Taster wurden gedrückt: ");
Serial.println(TasterE.getLEDPin());
}

Unterprogramm:

class TasterClass {

private:
int LEDPin;
int TasterPin; // Pin-Nummer für Taster
int TasterPinWert;
int LEDPinWert;
bool Wert_Taster; // Taster Ein = true oder false
bool ein_speicher;
bool Speicher;
bool Flanke;

public: //Setzen der Pin-Nummer und Initialisierung der Pin-Modi

void setPin( int TasterPinWert, int LEDPinWert) {
LEDPin = LEDPinWert;
TasterPin = TasterPinWert;
pinMode (LEDPin, OUTPUT);
pinMode (TasterPin, INPUT_PULLUP);

}

void CheckStatus() {

Wert_Taster = !digitalRead(TasterPin); // Lesen des Taster-Pins und Invertieren des Wertes (Taster gedrückt = true)

if (Wert_Taster == true && Speicher == false) {
Flanke = true;
Speicher = true;}
if (Wert_Taster == false) {
Speicher = false;}

if ( Flanke == true && ein_speicher == true) {
ein_speicher = false;
LEDPin = false;
Flanke = false;}

if ( Flanke == true && ein_speicher == false) {
ein_speicher = true;
LEDPin = true;
Flanke = false;}

// Methode zum Abrufen des aktuellen Tasterzählerwerts

int getLEDPin; {return LEDPin;}
}
};

Fehlermeldung:

C:\Users\jense\Documents\Arduino\ObjektTaster_2204\ObjektTaster_2204.ino: In function 'void loop()':
C:\Users\jense\Documents\Arduino\ObjektTaster_2204\ObjektTaster_2204.ino:15:24: error: 'class TasterClass' has no member named 'getLEDPin'; did you mean 'LEDPin'?
Serial.println(TasterE.getLEDPin());
^~~~~~~~~
LEDPin
exit status 1

Compilation error: 'class TasterClass' has no member named 'getLEDPin'; did you mean 'LEDPin'?

Das ist der Plan.
Ich hoffe ihr könnt helfen
Mit freundlichen Grüßen
Jens

Da ist ein Semikolon zu viel.

int getLEDPin() {return LEDPin;}

Code-Tags sind nicht so Dein Ding, oder?

Edit: Vergessene Klammern eingefügt (s. #29, Danke @Kai-R !)

Offensichtlich nicht.

Du wurdest 2 mal darum gebeten, "Deinen Sketch" in Code-Tags zu posten, Warum ignorierst du das einfach ?
Wenn du nicht weißt, was Code-Tags sind, dann frag doch einfach. Du stellst doch sonst Fragen hier, oder ?

Gehe mal in der IDE auf bearbeiten danach für Forum Kopieren , hier mit strg+v einfügen.

Und link zu "FlipFlop.h"fehlt auch noch.

Ganz ungünstig. Wenn das nochmal eingefügt, wird der Thread ungünstig.
Besser wäre, die vorhandenen Zeilen markieren und die Schaltfläche klicken.

Gehe davon aus das der "Alter"wird gelöscht

Das wäre dann das erste mal. :sweat_smile:

Da fehlt noch ein bisschen.
int getLEDPin() {return LEDPin;}

Einerseits verständlich. Andererseits ist es empfehlenswert, dass Du wenigstens versuchst Noiascas Code nachzuvollziehen und zu verstehen.

Was Du da baust ist gar nicht schön.

Es ist kein Entprellen eines Tasters erkennbar. Initialisierungen von Membervariablen erfolgen über einen Konstruktor und eigentlich ist im „Arduino-Umfeld“ eine Methode mit dem Namen begin() zur Initialisierung von Pins üblich.

Was sind Code-Tags??

Ist so in FipFlop.h als letzte Anweisung eingetragen. Dann kommt eine Fehlermeldung die ich schon öffter hatte und das ganze Programm zerschießt "/media/chaos/06D9-90BE/ObjektTaster_2204/ObjektTaster_2204.ino:4:13: error: field 'TasterH' has incomplete type 'TasterClass'
TasterClass TasterH;
^~~~~~~
In file included from /media/chaos/06D9-90BE/ObjektTaster_2204/ObjektTaster_2204.ino:1:0:
/media/chaos/06D9-90BE/ObjektTaster_2204/FlipFlop.h:2:9: note: definition of 'class TasterClass' is not complete until the closing brace.
Das Programm kriege ich dann nur wieder zum laufen, wenn ich die Datensicherung beider Programmteile einspiele. Wenn ich die .h ändere und mit #include aufrufe, müster der Kompiler doch eigendlich die geänderten Daten in der h. nachtragen, oder liege ich da falsch.

grafik

Formatierungen werden teilweise mit rechteckigen Klammern und einer Beschreibung der Formatierung innendrinn vorgenommen:

[code]
Dein Programm
[/code]

Genauso geht

```
Dein Programm
```

Ich mag auch zum Ausklappen:

[details=Dein Programm]
```
Dein Programm
```
[/details]

Das in eckigen Klammer nennt man "Tags", deutsch eventuell "Markierungsbezeichner".

Formatiert sieht das dann so aus:

Dein Programm

Genauso geht

Dein Programm

Ich mag auch zum Ausklappen:

Dein Programm
Dein Programm

Dadurch wird es ja nicht besser. Es muss ja nicht richtig sein nur weil es in einer Header-Datei steht. Man darf auch Header-Dateien anpassen (jedenfalls wenn sie im eigenen Projekt stehen; bei Libraries rate ich dringend davon ab).

Die Fehlermeldung field 'TasterH' has incomplete type 'TasterClass' passt dann ja auch, denn die Klassendefinition ist - so wie Du sie in #22 gezeigt hast - fehlerhaft.

Diese Frage hätte ich von dir schon nach Post #3 erwartet, oder einfach mal durchlesen, Wie nutze ich dieses Forum., wenn man nichts weiß.

Hallo, das Uhren-Programm läuft "solo" fehlerfrei auf dem MEGA 256, aber wenn ich es in das aktuelle Beregnungsprogramm einbinden will, kommen die Fehlermeldungen. Ich habe noch keinen Beitrag im Netz gefunden, welcher das Problem erklärt.
Zuerst mal das Uhren-Programm :

#include <RTClib.h>

RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {
  "Sonntag",
  "Montag",
  "Dienstag",
  "Mittwoch",
  "Donnerstag",
  "Freitag",
  "Sonnabend"
};
int Stunde_aktuell;
int Minute_aktuell;
int Auto_Start;

void setup() {
  Serial.begin(9600);

  // SETUP RTC MODULE
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    while (1)
      ;
  }

  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  // manually sets the RTC with an explicit date & time, for example to set
  // January 21, 2021 at 3am you would call:
  // rtc.adjust(DateTime(2021, 1, 21, 3, 0, 0));
}

void loop() {
  DateTime now = rtc.now();
  Serial.print("Date & Time: ");
  Serial.print(now.day(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.year(), DEC);
  Serial.print(" (");
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  Serial.print(") ");
  Serial.print(now.hour(), DEC);
  Stunde_aktuell = (now.hour());
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Minute_aktuell = (now.minute());
  Serial.print(':');
  Serial.println(now.second(), DEC);

  delay(1000);  // delay 1 seconds

  Serial.println(Stunde_aktuell);

  if (Stunde_aktuell == 18) { Auto_Start = true; }
  if (Stunde_aktuell == 21 && Minute_aktuell >= 30) { Auto_Start = false; }
}

das Bewässerungsprogramm

#include <RTClib.h>

RTC_DS3231 rtc

  char daysOfTheWeek[7][12] = {
    "Sonntag",
    "Montag",
    "Dienstag",
    "Mittwoch",
    "Donnerstag",
    "Freitag",
    "Sonnabend"
  };

const unsigned int BUTTON_PIN = A0;        // Pin an dem die Buttons angeschlossen sind
const unsigned int BUTTON_TOLLERANCE = 4;  // Tolleranz die beim auslesen des Analog-Signals verwendet wird
                                           // um den Button zuzuordnen. (Tolleranz wird in beide Richtungen verwendet)
const int Wert_F1_P = A2;                  // Analogwert Fühler 1 einlesen
const int Wert_F1_low = 512;               // ermittelter Low-Wert für Fühler1
const int Wert_F1_high = 196;              // ermittelter High-Wert für Fühler1
const int Wert_F2_P = A3;                  // Analogwert Fühler 2 einlesen
const int Wert_F2_low = 520;               // ermittelter Low-Wert für Fühler2
const int Wert_F2_high = 185;              // ermittelter High-Wert für Fühler2
const int Wert_F3_T = A4;                  // Analogwert Fühler 3 einlesen
const int Wert_F3_low = 10;                // ermittelter Low-Wert für Fühler3
const int Wert_F3_high = 1023;             // ermittelter High-Wert für Fühler3
const int Wert_F4_L = A5;                  // Analogwert Fühler 4 einlesen
const int Wert_F4_low = 12;                // ermittelter Low-Wert für Fühler4
const int Wert_F4_high = 1023;             // ermittelter High-Wert für Fühler4

const int Relais1 = 20;
const int Relais2 = 21;
const int Relais3 = 22;
const int Relais4 = 23;

const int Led_Pumpe = 24;
const int Led_Ein = 25;
const int Led_Hand = 26;
const int Led_Auto = 27;
const int Led_V1 = 28;
const int Led_V2 = 29;
const int Led_V3 = 30;

const unsigned int BUTTON[6] = { 1023, 1017, 1011, 1004, 997, 991 };  // Array mit den Mittelwerten von analogRead() der einzelnen Buttons
bool Button1 = false;
bool Button2 = false;
bool Button3 = false;
bool Button4 = false;
bool Button5 = false;
bool Button6 = false;

bool Speicher_Ein = false;
bool Speicher_Hand = false;
bool Speicher_Auto = false;
bool Speicher_V1 = false;
bool Speicher_V2 = false;
bool Speicher_V3 = false;

bool FlankeB1 = false;
bool FlankeB2 = false;
bool FlankeB3 = false;
bool FlankeB4 = false;
bool FlankeB5 = false;
bool FlankeB6 = false;

bool FlankeB1S = false;
bool FlankeB2S = false;
bool FlankeB3S = false;
bool FlankeB4S = false;
bool FlankeB5S = false;
bool FlankeB6S = false;

bool Nass1 = false;     // Auswertung für Nass Fühler1
bool Trocken1 = false;  // Auswertung für Trocken Fühler1
bool Nass2 = false;     // Auswertung für Nass Fühler2
bool Trocken2 = false;  // Auswertung für Trocken Fühler1


unsigned long buttonMillis_Ein;   // Zeitstempel, wann der Taster zuletzt gedrückt wurde
unsigned long buttonMillis_Hand;  // Zeitstempel, wann der Taster zuletzt gedrückt wurde
unsigned long buttonMillis_Auto;  // Zeitstempel, wann der Taster zuletzt gedrückt wurde

void setup() {
  Serial.begin(9600);  // Serielle Kommunikation starten

  // SETUP RTC MODULE
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    while (1)
      ;
  }
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  int Stunde_aktuell;
  int Minute_aktuell;
  int Auto_Start;

Den Rest habe ich weg gelassen.

Die Fehlermeldungen:

C:\Users\jense\Documents\Arduino\Bewaesserug_20.05_i_O\Bewaesserug_20.05_i_O.ino:5:3: error: expected initializer before 'char'
char daysOfTheWeek[7][12] = {
^~~~
C:\Users\jense\Documents\Arduino\Bewaesserug_20.05_i_O\Bewaesserug_20.05_i_O.ino: In function 'void setup()':
C:\Users\jense\Documents\Arduino\Bewaesserug_20.05_i_O\Bewaesserug_20.05_i_O.ino:87:8: error: 'rtc' was not declared in this scope
if (!rtc.begin()) {
^~~
C:\Users\jense\Documents\Arduino\Bewaesserug_20.05_i_O\Bewaesserug_20.05_i_O.ino:87:8: note: suggested alternative: 'getc'
if (!rtc.begin()) {
^~~
getc
C:\Users\jense\Documents\Arduino\Bewaesserug_20.05_i_O\Bewaesserug_20.05_i_O.ino:93:3: error: 'rtc' was not declared in this scope
rtc.adjust(DateTime(F(DATE), F(TIME)));
^~~
C:\Users\jense\Documents\Arduino\Bewaesserug_20.05_i_O\Bewaesserug_20.05_i_O.ino:93:3: note: suggested alternative: 'getc'
rtc.adjust(DateTime(F(DATE), F(TIME)));
^~~
getc
C:\Users\jense\Documents\Arduino\Bewaesserug_20.05_i_O\Bewaesserug_20.05_i_O.ino: In function 'void loop()':
C:\Users\jense\Documents\Arduino\Bewaesserug_20.05_i_O\Bewaesserug_20.05_i_O.ino:118:18: error: 'rtc' was not declared in this scope
DateTime now = rtc.now();
^~~
C:\Users\jense\Documents\Arduino\Bewaesserug_20.05_i_O\Bewaesserug_20.05_i_O.ino:118:18: note: suggested alternative: 'getc'
DateTime now = rtc.now();
^~~
getc
C:\Users\jense\Documents\Arduino\Bewaesserug_20.05_i_O\Bewaesserug_20.05_i_O.ino:126:16: error: 'daysOfTheWeek' was not declared in this scope
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
^~~~~~~~~~~~~
C:\Users\jense\Documents\Arduino\Bewaesserug_20.05_i_O\Bewaesserug_20.05_i_O.ino:473:16: error: 'Stunde_aktuell' was not declared in this scope
Serial.print(Stunde_aktuell);
^~~~~~~~~~~~~~
exit status 1

Compilation error: expected initializer before 'char'

Vielen Dank schon mal

Jens

Das ist einer der größten Fehler die du machen kannst. Genau dort ist mindesten noch ein Fehler!

Siehst du den Unterschied?

Wenn Du STRG-T drückst, siehst Du das die Variablendeklaration an der falschen Stelle ist.

Leider hast Du Deinen Sketch bis zur Unkenntlichkeit verstümmelt, sodas es nicht einmal annähernd möglich ist die Fehlermeldung mit den Zeilen im Code abzugleichen.

Da:

verstecken sich nämlich Zeilennumern und Spaltenpositionen.

Hallo, vielen Dank, Problem gelöst. Wenn man lange an was rumbastelt, schleichen sich immer mehr fehler ein. Also alles auf Anfang. Die Datensicherung mit dem Hauptprogramm wieder als neuen Sketch, dann das Uhrenprogramm neu reingebastelt und es läuft.