Go Down

Topic: Wieder bewässerung (Read 3428 times) previous topic - next topic

Nethacks

Würde einen Sensor verwenden.
Da gibt es vom Ösi so einen, welcher kapazitiv funktioniert.
Weis den Namen aber nicht mehr.

Tommy56

Du meinst wahrscheinlich https://www.ramser-elektro.at. Dazu gibt es auch einen Thread hier. Wenn, dann die beschichteten sensoren nehmen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

oldmann

#62
Dec 14, 2018, 11:40 pm Last Edit: Dec 15, 2018, 10:20 pm by oldmann
Hallo zusammen!

Ich brauche doch eine Aufklärung durch die Weisen :smiley-sad: .

Wie ich schon geschrieben habe, wird das Projekt geändert. Statt wie zuerst mehrere kleine pumpen verwenden, kommt jetzt eine größere pumpe mit Ventilen in Einsatz. Der code sieht jetzt so aus:
Code: [Select]
unsigned long jetzt;                                                  // Variable für den aktuellen Zeitpunkt
unsigned long vorLicht = 0;                                           // Variable fuer Messintervalle Helligkeit
const unsigned long lichtIntervall = 1000;                            // Messintervall Helligkeit
bool lichtStatus = true;                                              // Tag - Nacht Status
const byte helligkeit = A0;                                           // Helligkeitsensor Eingang
unsigned int lichtwert0 = 0;                                          // Messwert fuer berechnung Helligkeit Mittelwert
unsigned int lichtwert1 = 0;                                          // Messwert fuer berechnung Helligkeit Mittelwert
unsigned int lichtwert2 = 0;                                          // Messwert fuer berechnung Helligkeit Mittelwert
const byte pumpPin = 2;                                               // Ausgang Giesspumpe
const byte wasserPin = 3;                                             // Wasser in Behaelter vorhanden
bool ventil0;                                                         // Ventilstatus Blume 1
bool ventil1;                                                         // Ventilstatus Blume 2
bool ventil2;                                                         // Ventilstatus Blume 3
bool ventil3;                                                         // Ventilstatus Blume 4

struct Blumen                                                         // Struktur mit Konstanten, Variablen und Methoden
{ Blumen(const byte messPin, const byte ventilPin, const unsigned int trockenWert, const unsigned long giessIntervall, const unsigned long messIntervall):
    messPin(messPin), ventilPin(ventilPin), trockenWert(trockenWert), giessIntervall(giessIntervall), messIntervall(messIntervall), vorhin(0), intervall(0), schritt(0) {}

  void init() {
    pinMode(ventilPin, OUTPUT);                                       
  }

  void nacht() {
    digitalWrite(ventilPin, LOW);                                     // Bei Nacht und Wassermangel Ausschalten
  }

  void run() {
    if (jetzt - vorhin >= intervall) {                                // Messpause fuer Feuchtigkeit Messung abgelaufen
      vorhin = jetzt;                                                 // Zeit letzten messung auf aktueller Zeit setzen
      switch (schritt) {
        case MESSEN:                                                  // Schritt Messen
          if (trockenWert > analogRead(messPin)) {                    // Pflanze trocken
            schritt = GIESSEN;                                        // Zu Schritt Giessen
          }
          else {
            intervall = messIntervall;                                // Sonst: intervall mit messIntervall ueberschreiben
          }
          break;
        case GIESSEN:                                                 // Schritt Giessen
          digitalWrite(ventilPin, HIGH);                              // Ventil auf
          intervall = giessIntervall;                                 // intervall mit giessIntervall ueberschreiben
          schritt = PAUSE;                                            // Zu Schritt Pause
          break;
        case PAUSE:                                                   // Schritt Pause
          digitalWrite(ventilPin, LOW);                               // Ventil zu
          intervall = (messIntervall - giessIntervall);               // intervall mit messIntervall verkuerzt um Giesszeit ueberschreiben
          schritt = MESSEN;                                           // Zu Schritt Messen
          break;
      }
    }
  }

  const byte messPin, ventilPin;
  const int trockenWert;
  const unsigned long giessIntervall, messIntervall;
  unsigned long vor, vorhin, intervall;
  byte schritt;
  enum {MESSEN, GIESSEN, PAUSE};
};

Blumen blumen[]                                                       // Ein Feld der Struktur Blumen
{ // messPin, ventilPin, trockenWert, giessIntervall, messIntervall
  {A1, 4, 500, 2500, 10000},                                          // Werte für Blume und Ventil 1
  {A2, 5, 500, 5000, 10000},                                          // Werte für Blume und Ventil 2
  {A3, 6, 500, 1500, 10000},                                          // Werte für Blume und Ventil 3
  {A4, 7, 500, 1000, 10000},                                          // Werte für Blume und Ventil 4
};

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

void loop() {
  jetzt = millis();                                                   // Aktuellen Zeit merken
  if (jetzt - vorLicht >= lichtIntervall) {                           // Messpause fuer Helligkeit Messung abgelaufen
    vorLicht = jetzt;                                                 // Zeitpunkt für aktuellen Helligkeit Messung
    lichtwert0 = analogRead(helligkeit);                              // Aktuellen Helligkeit Wert als erster Messwert schreiben
    lichtStatus = ((lichtwert0 + lichtwert1 + lichtwert2) / 3) < 500; // Wenn Helligkeit Mittelwert kleiner Sollwert; Status false - Nacht, Status true - Tag
    lichtwert2 = lichtwert1;                                          // Zweiten Helligkeitwert als dritten schreiben
    lichtwert1 = lichtwert0;                                          // Ersten Helligkeitwert als zweiten schreiben
  }
  if (lichtStatus && digitalRead(wasserPin)) {                        // Wenn Tag und genug Wasser   
    for (Blumen &b : blumen) b.run();                                 // Alle Feldelemente werden nacheinender mit der Methode run abgearbeitet
  }
  else {
    for (Blumen &b : blumen) b.nacht();                               // Sonst: alle Feldelemente werden nacheinender mit der Methode nacht abgearbeitet
  }
  ventil0 = digitalRead(4);                                           // Status Ventil 1
  ventil1 = digitalRead(5);                                           // Status Ventil 2
  ventil2 = digitalRead(6);                                           // Status Ventil 3
  ventil3 = digitalRead(7);                                           // Status Ventil 4
  if (ventil0 || ventil1 || ventil2 || ventil3) {                     // Wenn mindestens ein Ventil auf
    digitalWrite(pumpPin, HIGH);                                      // Giesspumpe ein
  }
  else {
    digitalWrite(pumpPin, LOW);                                       // Sonst: Giesspumpe aus
  }
}

Ich habe trockenlaufschutz eingebaut und das mehrmaligen gießen entfernt. Ich wollte für die grosen kasten/topfe langen messintervall und gießzeiten und für die kleinen umgekehrt. Beim Test ist mir aufgefallen, dass die Einschaltzeiten für die Ventile verschieben sich, so dass für jeder Blume schaltet die Pumpe extra. Bei mehreren kleinen pumpen kein Problem, aber hier, reine Energie Verschwendung. Da die Pumpe stark genug ist alle Blumen gleichzeitlich mit Wasser versorgen, wollte ich alle pflanzen in die gruppe, wenn notwendig, zu gleichen zeit gießen.
Weil die variable intervall in die Methode run (pflanze trocken) wird erst nach den gießen mit messIntervall belegt, ergibt sich der Gesamtzeit als "giessIntervall + messIntervall".
Also der intervall mit "messIntervall - giessIntervall" belegen, und das Problem ist erledigt (giessIntervall + (messIntervall - giessIntervall) = messIntervall).
Klingt für mich logisch, funktioniert aber nicht. Messungen haben gezeigt das intervall = messIntervall + (messIntervall - giessIntervall).

Was ist da falsch?

Danke in voraus.

Go Up