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)