Wieder bewässerung

Bei Nacht kann man die Pumpen mit der Methode nacht() abschalten (ungetestet):

const unsigned long pausenIntervall = 1000;  // Pause während des Giessens
unsigned long jetzt;                         // Variable für den aktuellen Zeitpunkt
unsigned long vorBright = 0;                 // Variable fuer Messintervalle Helligkeit
const unsigned long brightIntervall = 10000; // Helligkeit Messungen Intervall
bool tagnachtStatus = true;                  // Tag - Nacht Status

const byte brightness = A0;    // Helligkeit Sensoreingang
byte brightwert0 = 0;          // Messwert fuer berechnung Helligkeit Mittelwert
byte brightwert1 = 0;          // Messwert fuer berechnung Helligkeit Mittelwert
byte brightwert2 = 0;          // Messwert fuer berechnung Helligkeit Mittelwert

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), zaehler(0), schritt(0) {}

  void init() {
    pinMode(relaisPin, INPUT_PULLUP);
    pinMode(relaisPin, OUTPUT);
  }

  void nacht() {
    digitalWrite(relaisPin, HIGH); // Ausschalten
  }

  void run() {
    if (jetzt - vorhin >= intervall) {
      vorhin = jetzt;
      switch (schritt) {
        case MESSEN:
          if (trockenWert > analogRead(messPin)) {
            schritt = GIESSEN;
            zaehler = 0;
          }
          else {
            intervall = messIntervall;
          }
          break;
        case GIESSEN:
          digitalWrite(relaisPin, LOW);
          intervall = giessIntervall;
          schritt = PAUSE;
          break;
        case PAUSE:
          digitalWrite(relaisPin, HIGH);
          if (5 > ++zaehler) {
            intervall = pausenIntervall;
            schritt = GIESSEN;
          }
          else {
            intervall = messIntervall;
            schritt = MESSEN;
          }
          break;
      }
    }
  }

  const byte messPin, relaisPin;
  const int trockenWert;
  const unsigned long messIntervall, giessIntervall, nachgiessenIntervall;
  unsigned int messwert;
  unsigned long vorhin, intervall;
  byte zaehler, schritt;
  enum {MESSEN, GIESSEN, PAUSE};
};

Blumen blumen[]  // Ein Feld der Struktur Blumen
{ // messPin, relaisPin, trockenWert, messIntervall, giessIntervall, nachgiessenIntervall
  {A1, 2, 200, 3000, 500, 5000},  // Werte für Blume und Pumpe 1
  {A2, 3, 250, 2500, 500, 5000}   // Werte für Blume und Pumpe 2
};

void setup() {
  for (Blumen &b : blumen) b.init();  // alle Feldelemente werden nacheinender mit der Methode init abgearbeitet
}

void loop() {
  jetzt = millis();
  if (jetzt - vorBright >= brightIntervall) {     // Messpause fuer Helligkeit messung abgelaufen
    vorBright = jetzt;                            // Zeitpunkt für aktuellen Messung
    brightwert0 = analogRead(brightness);         // Aktuellen Helligkeit Wert als erste Messwert schreiben
    tagnachtStatus = ((brightwert0 + brightwert1 + brightwert2) / 3) < 160; // Wenn Helligkeit Mittelwert kleiner Sollwert; Status false - Nacht, Status true - Tag
    brightwert2 = brightwert1;                    // Zweiten Helligkeitwert als dritten schreiben
    brightwert1 = brightwert0;                    // Ersten Helligkeitwert als zweiten schreiben
  }
  if (tagnachtStatus) {
    for (Blumen &b : blumen) b.run();
  } else {
    for (Blumen &b : blumen) b.nacht();
  }
}

Den Arduino kann man nicht abschalten, sonst verpaßt er den Sonnenaufgang 8)