Go Down

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

oldmann

Ich formuliere meine Frage anderes:

Wie bekomme ich der „tagnachtStatus" in die „void run" Methode, um die Ausführung switch / case Anweisungen bei "tagnachtStatus = false" zu stoppen. Beim Versuch, so wie die andere Werte im struct, der „tagnachtStatus" einfügen, kommen Fehlmeldungen die ich leider nicht verstehe.

MfG

agmue

Wozu benötigst Du das, was willst Du damit bewirken?
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

oldmann

#47
Nov 16, 2018, 01:57 pm Last Edit: Nov 16, 2018, 01:59 pm by oldmann
Hallo

Das habe ich schon Event, aber bitte:
Ich überlege die Anlage mit solar Strom versorgen.
Soll eine Option sein, aber in die Nacht habe ich noch nie jemanden gesehen der seine Blume gießt.
Da will ich die Anlage „schlafen" legen und unnötige Hardware vom Strom trennen. Dafür der Power Ausgang.

agmue

Soll eine Option sein, aber in die Nacht habe ich noch nie jemanden gesehen der seine Blume gießt.
Menschen schlafen und benötigen Licht, Arduinos hingegen nicht ;D

Meine Frage war aber näher am Programm gemeint und sollte Dich auf eine selbsterdachte Lösung bringen. Was hältst Du beispielsweise von einer Methode aus() oder nacht()?
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

oldmann

Code: [Select]
Menschen schlafen und benötigen Licht, Arduinos hingegen nicht
Da hast Du recht, aber in Zeiten Globalen Erwärmung jeder mW zählt.

Dein Vorschlag klingt interessant, was ändert nichts an die Tatsache, dass ich, mit meinem immer noch Anfänger wissen, damit nicht viel anfangen kann.
Meine Idee: weil die Methode:
Code: [Select]
void loop() {
  jetzt = millis();
  for (Blumen &b : blumen) b.run();
  }

eine for schleife ist, dachte ich, die nur einmal laufen lassen (soll alle Pflanzen Kontrollieren), und an die
„tagnachtStatus" anknüpfen. Wird dann das Intervall für Tag/Nacht Prüfung gleich für die Pflanzen gelten, was aber kein Problem ist. Da habe ich leider, wenn überhaupt möglich, keine Idee wie?

agmue

In #43 hast Du einen Power-Pin eingeführt, an dem vermutlich ein großes Relais hängt, das den Strom für die Pumpen abschaltet. Dann kann das restliche Programm doch machen, was es will, oder? Daher meine Frage, was Du bewirken möchtest, wenn sowieso der Strom aus ist.

Alternativ könntest Du auch die Pumpen ausschalten, dann wird auch kein Strom verbraucht, wenn die Sonne keinen Strom liefert.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

oldmann

Tja, wenn ich mir überlege? ::)

Der Arduino verbraucht Strom bei der Arbeit. Und auch wenn ich die Pflanzen Kontrolle abschalte, das Rad dreht sich weiter. Rest kann ich abschalten.

Danke

agmue

#52
Nov 16, 2018, 05:28 pm Last Edit: Nov 16, 2018, 05:31 pm by agmue
Bei Nacht kann man die Pumpen mit der Methode nacht() abschalten (ungetestet):

Code: [Select]
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)
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

oldmann

„Vor lauter Bäumen den Wald nicht sehen"

Das ist mir passiert. Ich wollte der Arduino „entlasten" um Strom sparen. Das könnte vielleicht ein paar mA bringen (meine Vermutung) „ungetestet" 8) 
Da besteht schon die Möglichkeit, ungebrauchte Dinge mit den „powerPin" ausschalten, also der Code kann unverändert bleiben.
  
So oder so, ich bewundere Dein Engagement. Du hast keinen grünen Daumen! 
Womit habe ich das verdient? Oder willst Du doch paar Blumen auf dem Balkon pflegen? :D

agmue

Ich wollte der Arduino „entlasten" um Strom sparen.
Man kann den Arduino auch in den stromsparenden Schlafmodus versetzen. Bei manchen Projekten kann das sinnvoll sein. Bei einer Anlage mit mehreren Pumpen, die vergleichsweise viel Strom benötigen, sollte die elektrische Energie für den Arduino nicht wichtig sein. Sonst ist die Solaranlage falsch dimensioniert, denke ich mal.

Oder willst Du doch paar Blumen auf dem Balkon pflegen? :D
Nein, denn ich habe keinen Balkon, nur einen Garten ::)
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

postmaster-ino

Hi

Nebengeplänkel:
Ich formuliere meine Frage anderes:... „void run()" ...
void hat NICHTS mit der Funktion/Methode run() zu tun, sondern setzt nur den Rückgabe-TYP - hier eben void = nicht vorhanden.

Wenn diese Funktion/Methode dann doch Mal was zurück geben können soll, wird aus void run() halt int run() (wenn man halt int (auf dem Arduino 16bit, vorzeichenbehaftet) braucht, sonst wäre auch bool, byte, uint64_t ... möglich) - man muß ja den Rückgabewert nicht abholen.
Wenn die Funktion/Methode nicht einer Variable zugewiesen wird, wird der Return-Wert verworfen.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

oldmann

Hallo

Ich könnte in der letzten Zeit leider nicht weitermachen.
Der Code habe ich auf den Steckboard mit Erfolg getestet, und fange an die Anlage zusammenbauen.
Ein paar Kleinigkeiten sollen geändert werden. Ich glaube, und will das allein hinbekommen.

Ich bedanke mich bei allen die mir geholfen haben.

MfG


postmaster-ino

Hi

Das hört Sich doch schon Mal nach einem Teilerfolg an - Glückwunsch!

Wenn Du ohne weitere Nachfragen am Ziel ankommst, wäre eine Nennung trotzdem interessant - alleine der geneigte Nachbauer wüsste dann, daß Es zumindest hier schon Mal funktioniert hat.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

agmue

Danke für die Rückmeldung!

Wenn Du möchtest, kannst Du Dein fertiges Projekt hier veröffentlichen, ich mag auch Fotos. Dann hast Du auch gleich eine Dokumentation für Dich selbst. Du selbst hättest Dich sehr darüber gefreut, wenn Du hier sowas gefunden hättest.

Hier ein Sammelthema mit einem alten Projekt von mir: Zeigt her eure geilen Projekte !

Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

oldmann

Tja, warum nicht.

Nun da ich zuhause erwähnt habe was für den Balkon machen, ist mir sofort vorgestellt eine Idee,
wie wir unsren „Erholung Garten" umgestalten können. :smiley-eek:

Jetzt gibt noch mehr Kleinigkeiten, die erfordern das Projekt anpassen.

Aber ich komme voran, und hoffe, bald das Ergebnis vorstellen können.

Das Endergebnis wird erst nach Sommer Urlaub zu beurteilen.

MfG

Go Up