Wow! 
Hier mein aktueller Stand:
unsigned long jetzt; // Variable für den aktuellen Zeitpunkt
byte zyklenzahl = 0; // Die Pumpe soll 4-mal kurz laufen dafuer Variable zyklenzahl
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() {
messwert = analogRead(messPin); // Sensorwert auslesen
if ((jetzt - vorhin >= messIntervall) && (messwert <= trockenWert)) { // Wenn Messinterval abgelaufen und Blume troken
vorhin = jetzt; // Aktuelle Messzeitwert legen
intervall = millis(); // Aktuelle Zeitwert fuer Pumpen legen
}
switch (schritt) {
case 0:
if ((millis() - intervall >= nachgiessenIntervall) && (zyklenzahl < 4)) { // Wenn Pumpepause abgelaufen und wenige als 4 Zyklen
intervall = millis(); // Aktuelle Zeitwert fuer Pumpen legen
digitalWrite(relaisPin, HIGH); // Pumpe einschalten
schritt = 1; // Weiter zu naechsten Schritt
}
break;
case 1:
if (millis() - intervall >= giessIntervall) { // Pumpenzeit abgelaufen
intervall = millis(); // Aktuelle Zeitwert fuer Pumpen legen
digitalWrite(relaisPin, LOW); // Pumpe auschalten
zyklenzahl++; // Zyklenzahl +1
schritt = 0; // Wieder zu ersten Schritt
}
break;
}
}
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
}
Du hast mir den ganzen Spaß verdorben 
ein Paar unterschiede kann man sehen 8)
Eine Frage:
case GIESSEN:
digitalWrite(relaisPin, HIGH);
if (5 > ++zaehler)
{ intervall = pausenIntervall;
schritt = PAUSE;
} else {
intervall = nachgiessenIntervall;
schritt = MESSEN;
Was hast Du vor mit "nachgiessenIntervall"
Ich finde keine verwendung.
MfG