oldmann:
Für ein paar Tipps wäre ich sehr dankbar. Gruß
Fange doch mal mit einem Blumenfeld an. Da Du ganz verschiedene Blumen hast, nutzt Du eine Struktur von Blumen:
struct Blumen // Struktur mit Konstanten, Variablen und Methoden
{
const byte messPin, relaisPin;
const int trockenWert;
const unsigned long messIntervall, giessIntervall, nachgiessenIntervall;
unsigned int messwert;
unsigned long vorhin, intervall;
byte schritt;
};
Blumen blumen[] // Ein Feld der Struktur Blumen
{ // messPin, relaisPin, trockenWert, messIntervall, giessIntervall, nachgiessenIntervall
{A0, 2, 200, 3000, 500, 5000},
{A1, 3, 250, 2500, 500, 5000},
{A2, 4, 250, 2000, 250, 3000}
};
So mag der Compiler das noch nicht, dient nur zum Sortieren der Gedanken.
In der Struktur gibt es mehr Werte, als im Feld festgelegt werden. Diese Werte wären alle 0, könnte man alle in das Feld schreiben, verschwendet aber nur Platz. Nach einem Vorschlag von combie kann man diese auch in einem Constructor1) initialisieren:
struct Blumen // Struktur mit Konstanten, Variablen und Methoden
{ Blumen(const byte messPin, const byte relaisPin, const unsigned int trockenWert, const unsigned long messIntervall, const unsigned long giessIntervall, const unsigned long nachgiessenIntervall):
messPin(messPin), relaisPin(relaisPin), trockenWert(trockenWert), messIntervall(messIntervall), giessIntervall(giessIntervall), nachgiessenIntervall(nachgiessenIntervall), messwert(0), vorhin(0), intervall(0), schritt(0) {}
const byte messPin, relaisPin;
const int trockenWert;
const unsigned long messIntervall, giessIntervall, nachgiessenIntervall;
unsigned int messwert;
unsigned long vorhin, intervall;
byte schritt;
};
Blumen blumen[] // Ein Feld der Struktur Blumen
{ // messPin, relaisPin, trockenWert, messIntervall, giessIntervall, nachgiessenIntervall
{A0, 2, 200, 3000, 500, 5000},
{A1, 3, 250, 2500, 500, 5000},
{A2, 4, 250, 2000, 250, 3000}
};
void setup() {}
void loop() {}
Schon ist auch der Compiler einverstanden.
Wenn Du auf der OOP-Schiene weitermachen möchtest, benötigst Du nur noch eine Initialisierungs-Methode und eine Methode, die die Arbeit macht:
unsigned long jetzt; // Variable für den aktuellen Zeitpunkt
struct Blumen // Struktur mit Konstanten, Variablen und Methoden
{ Blumen(const byte messPin, const byte relaisPin, const unsigned int trockenWert, const unsigned long messIntervall, const unsigned long giessIntervall, const unsigned long nachgiessenIntervall):
messPin(messPin), relaisPin(relaisPin), trockenWert(trockenWert), messIntervall(messIntervall), giessIntervall(giessIntervall), nachgiessenIntervall(nachgiessenIntervall), messwert(0), vorhin(0), intervall(0), schritt(0) {}
void init()
{ pinMode(relaisPin, OUTPUT);
}
void run()
{ // hier die Funktionalität einfügen!
}
const byte messPin, relaisPin;
const int trockenWert;
const unsigned long messIntervall, giessIntervall, nachgiessenIntervall;
unsigned int messwert;
unsigned long vorhin, intervall;
byte schritt;
};
Blumen blumen[] // Ein Feld der Struktur Blumen
{ // messPin, relaisPin, trockenWert, messIntervall, giessIntervall, nachgiessenIntervall
{A0, 2, 200, 3000, 500, 5000},
{A1, 3, 250, 2500, 500, 5000},
{A2, 4, 250, 2000, 250, 3000}
};
void setup()
{ for (Blumen &b : blumen) b.init(); // alle Feldelemente werden nacheinender mit der Methode init abgearbeitet
}
void loop()
{ jetzt = millis();
for (Blumen &b : blumen) b.run(); // alle Feldelemente werden nacheinender mit der Methode run abgearbeitet
}
Dies soll eine Anregung sein, die Du selbst ausgestaltest. Möglicherweise benötigt man noch andere Werte oder welche von meinen sind überflüssig. Ich habe keinen grünen Daumen 
Anm.:
- Bitte im großen C++-Buch nachlesen!