Go Down

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

combie

Quote
Nach einem Vorschlag von combie kann man diese auch in einem Constructor1) initialisieren:
Danke für die Blumen!

Der Testballon hätte von mir sein können, so in etwa...

Denn so teste ich die Lernbereitschaft der Fragenden.
Die gierigen, hungrigen, trennen sich so von jenen, welche sich selber (willkürliche) Grenzen auferlegen.

Dass jeder Grenzen hat, und dass lernen ein (recht langer) Prozess ist, daran besteht kein Zweifel.
Aber die Bereitschaft, zu lernen, kann man so gut spüren.



Quote
Suchanfragen wie „Schleife Status" oder „Unterprogramm Ein, Ausgänge zuweisen" bringen keine brauchbaren Ergebnisse.
Kein Wunder...
Suche nach "endlicher Automat".


Quote
Ich bastle aber grade meinen Sketch aus mehreren zusammen und in erste Linie will erreichen das der lauft, erst danach wird nach neuern Erkenntnissen nachgebessert.
Aus meiner Sicht die falsche Reihenfolge!
Aber was solls, jeder ist seines Glückes Schmied.

Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle bestimmt.

oldmann

OK bin überredet. Bis zu Frühling gibt noch bisschen Zeit. Ab in der schule. :smiley-cry:

Eure Meinung zu obigem Sketch wurde ich aber gerne kennenlernen. 8)

postmaster-ino

Hi

Du hast Es so gewollt :o
Was mir an Deinem Sketch auffällt:
- der Sketch selber ist sparsam Kommentiert
- Variablen wie i und j kann man in einer Schleife lokal nutzen, global wären sprechende Namen besser
- Datentyp int - sowohl der Lichtsensor wie der Feuchtesensor werden wohl keine negativen Werte bringen, wenn der positive Wertebereich trotzdem ausreichend ist, wird's in Richtung Glaubensfrage gehen, warum kein unsigned benutzt wurde.
.  wenn der Wert wesentlich kleinere Grenzen hat, würde sich byte anbieten (0...255, ist eh unsigned)
- in setup() beutzt Du 'magc numbers' - mir ist klar, wer '2' und '3' ist, warum benutzt Du nicht die extra dafür angelegten Variablen? Macht auch ein Anpassen einfacher
- #define durch const Datentyp Variable=wert; ersetzen, damit der Compiler eine Chance hat, die Datentypen ebenfalls mit zu überprüfen
- time0 ... time4 sprechende Namen geben - ich muß bei jedem Auftauchen von 'time' hochscrollen und schauen, was Das nun wieder sein soll - würde das Lesen einfacher machen
- dem Helligkeitswert den Namen NACHT aufzubürden wäre mir wohl nicht eingefallen
- Du setzt step auf 3, hast aber keinen Case dafür

Auf logische Fehler habe ich Deinen Sketch nicht geprüft, ist mir derzeit zu schwere Kost,

MfG

oldmann

So, habt einiges geändert. Kann aber keine Garantie geben das das jetzt eine leichte Kost ist.
Pause ist um, die Schule geht weiter. ;)
Code: [Select]
/* Analog Eingänge A0-Lichtsensor, A1-Feuchtigkeit Sensor Pflanze 1, A2-Feuchtigkeit Sensor Pflanze 2
   Digital Ausgänge D2-Pumpe Pflanze 1, D3-Pumpe Pflanze 2
   Der betrieb soll in die Nacht eingestellt sein.
   Da die pflanzen Töpfe klein sind, soll die Pumpe in ein paar kurzen Zyklen, gefolgt von pausen laufen,
   um das Wasser auslaufen verhindern. Weiter soll immer nur eine Pumpe laufen.
   Alle Zeiten und Sensorwerten für testzwecken. Korrekte werte mussen erst im betrieb ermitelt werden */


unsigned long int nightbreak = 0;                                // Merker für "Nachtbetrieb"
unsigned long int pump0ON = 0;                                   // Merker Laufzeit Pumpe 1
unsigned long int pump0OFF = 0;                                  // Merker Pausezeit Pumpe 1
unsigned long int pump1ON = 0;                                   // Merker Laufzeit Pumpe 2
unsigned long int pump1OFF = 0;                                  // Merker Pausezeit Pumpe 2
const brightness = A0;                                           // Lichtsensor am eingang A0
const moist0 = A1;                                               // Feuchte Pflanze 1
const moist1 = A2;                                               // Feuchte Pflanze 2
unsigned int bright = 0;                                         // Variable für Lichtsensor
unsigned int moisture0 = 0;                                      // Variable Feuchte Pflanze 1
unsigned int moisture1 = 0;                                      // Variable Feuchte Pflanze 2
const pump1 = 2;                                                 // Ausgang Pumpe Pflanze 1
const pump2 = 3;                                                 // Ausgang Pumpe Pflanze 2
bool pumpstate0 = true;                                          // Variable Pumpenstatus Pflanze 1
bool pumpstate1 = true;                                          // Variable Pumpenstatus Pflanze 2

void setup() {
 pinMode(pump1, OUTPUT);
 pinMode(pump2, OUTPUT);
}

void loop() {
 bright = analogRead(brightness);             
 moisture0 = analogRead(moist0);
 moisture1 = analogRead(moist1);
 static byte step = 0;
 switch (step) {
   case 0:
     if (bright < 600) {                                         // Wenn drausen dunkel ist umschalten auf nachbetrieb
       time0 = millis();
       step = 3;
     }
     else {                                                      // Bei tageslicht pflanze 1 überprüffen
       step = 1;
     }
     break;
   case 1:                                                       // Pflanze 1
    byte i = 0;
     if (moisture0 < 400) {                                      // Boden trocken
       while (i < 5) {                                           // Gissen-Pumpe 5-mal kurz laufen lasen
         if (!digitalRead(pump1) && millis() - pump0ON >= 1000 ) {
           pump0OFF = millis();
           pumpstate0 = !pumpstate0;
           digitalWrite(pump1, pumpstate0);
         }
         if (digitalRead(pump1) && millis() - pump0OFF >= 3000 ) {
           pump0ON = millis();
           pumpstate0 = !pumpstate0;
           pumpA();
         }
       }
     }
     else {                                                      // Boden feucht
       step = 2;                                                 // Weiter zu pflanze 2
     }
     break;
   case 2:                                                       // Pflanze 2
     byte j = 0;
     if (moisture1 < 400) {                                      // Boden trocken
       while (j < 5) {                                           // Gissen-Pumpe 5-mal kurz laufen lasen
         if (!digitalRead(pump2) && millis() - pump1ON >= 1000 ) {
          pump1OFF = millis();
           pumpstate1 = !pumpstate1;
           digitalWrite(pump2, pumpstate1);
         }
         if (digitalRead(pump2) && millis() - pump1OFF >= 3000 ) {
         pump1ON = millis();
           pumpstate1 = !pumpstate1;
           pumpB();
         }
       }
     }
     else {                                                      // Boden feucht
       step = 0;                                                 // Wider an Anfang
     }
     break;
   case 3:                                                       // Nachtbetrieb
     if (millis() - nightbreak > 15000) {                        // In die Nacht je xx min die Helligkeit prüfen
       step = 0;
     }
     break;
 }

 void pumpA() {                                                  // Unterprogramm für Pumpe 1
   digitalWrite(pump1, pumpstate0);
   i++;
 }

 void pumpB() {                                                  // Unterprogramm für Pumpe 2
   digitalWrite(pump2, pumpstate1);
   j++;
 }

oldmann

Hallo
Ich Hofe das jetzt lässt sich besser verdauen
Code: [Select]
// Bewaesserung Belegung der Ein und Ausgaenge
const byte brightness = A0;        // Lichtsensor am eingang A0
const byte moisture0 = A1;         // Feuchte Sensor Pflanze 1 am Eingang A1
const byte moisture1 = A2;         // Feuchte Sensor Pflanze 2 am Eingang A2
//
const byte pumpe1 = 2;             // Ausgang Pumpe Pflanze 1
const byte pumpe2 = 3;             // Ausgang Pumpe Pflanze 2
// Zeiten fuer zustaende
const int pumpeEIN = 500;          // Pumpe Laufzeit
const int pumpeAUS = 1000;         // Pumpe Pause
const int schlafen = 10000;        // Interval Helligkeit kontrolle in der nacht
// Variablen fuer Sensoren
unsigned int bright = 0;           // Licht
unsigned int moist0 = 0;           // Feuchte Pflanze 1
unsigned int moist1 = 0;           // Feuchte Pflanze 2
// Merkers fuer millis()
unsigned long int nightbreak = 0;  // Merker fuer "Nachtbetrieb" in die nacht wird je xx min der lichtsensor gelesen
unsigned long int pumpelaufen = 0; // Merker Laufzeit Pumpe
unsigned long int pumpepause = 0;  // Merker Pause Pumpe
//
bool giessen = false;              // Solange gegossen wird - true
enum zustaende {helligkeit, pflanze1, pflanze2, pumpen, pause, nachtpause};
byte zustand = helligkeit;         // Start zustand
byte zyklenzahl = 0;               // Pumpe zyklenzahl
byte pumpewahl = 0;                // Welche Pumpe soll laufen

void setup () {
// Pins konfiguration
pinMode(pumpe1, OUTPUT);
pinMode(pumpe2, OUTPUT);
}

void loop () {
// Sensoren auslesen
bright = analogRead(brightness);             
    moist0 = analogRead(moisture0);
    moist1 = analogRead(moisture1);
// Giessen false erst wann alle pumpenzyklen abgelaufen
if (zyklenzahl < 4) {         
    giessen = true;
    }
    else {
    giessen = false;
zustand = helligkeit;
    }
switch (zustand) {
case helligkeit:
    if (bright < 600) { // Wenn drausen dunkel ist umschalten auf nachbetrieb
                nightbreak = millis();
                zustand = nachtpause;
    }
            else {                      // Bei tageslicht feuchte pflanze 1 kontrolle
                zustand = pflanze1;
            }
break;
case nachtpause:                // In der Nacht je x min helligkeit kontrolle
            if (millis() - nightbreak >= schlafen) {
                zustand = helligkeit;
}
break;
case pflanze1:
// Pflanze troken und keine Pflanze sonst wird gegossen
if ((moist0 < 400) && (giessen = false)) {
pumpewahl = pumpe1;         // Auswahl der Pumpe
pumpelaufen = millis();
zustand = pumpen;           // Giessen
}
else {
            zustand = pflanze2;         // Pflanze feucht die zweite wird kontrolliert
}
break;
// Pflanze troken und keine Pflanze sonst wird gegossen
    case pflanze2:             
if ((moist1 < 400) && (giessen = false)) {
pumpewahl = pumpe2;         // Auswahl der Pumpe
pumpelaufen = millis();
zustand = pumpen;           // Giessen
}
else {
            zustand = helligkeit;        // Pflanze feucht wieder an Anfang
}
break;
    case pumpen:
// Noch keine 4 Zyklen und pause abgelaufen
        if ((zyklenzahl < 4) && (millis() - pumpepause >= pumpeAUS)) {
            pumpelaufen = millis();
            digitalWrite(pumpewahl, HIGH);    // Pumpe einschalten
            zustand = pause;
            }
    break;
        case pause:
// Laufzeit fuer die Pumpe abgelaufen
        if (millis() - pumpelaufen >= pumpeEIN) {
            digitalWrite(pumpewahl, LOW);     // Pumpe aus
            pumpepause = millis();
            zyklenzahl++;
            zustand = pumpen;
            }
     break;
    }
}

IDE findet keine Fehler. Ich auch ;D

agmue

... das war für mich eine Nummer zu groß. :smiley-red:
Das glaube ich nicht, denn sonst hätte ich Dir diese Variante nicht angeboten. Richtig deutlich werden die Vorteile bei vielen Pumpen.

IDE findet keine Fehler. Ich auch ;D
"Ein Programm, das tut, was es soll, ist ein gutes Programm!" hat mir mal jemand geschrieben, noch besser, wenn Du es verstehst!

Sollen noch mehr Pumpen dazukommen?
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

oldmann

Eigentlich ja.
Ich habe 2 genommen um die Übersicht nicht verlieren.
Ich denke, wann alles funktioniert, lässt sich der Sketch leicht erweitern.

FredRam

Du kennst den Giesomat Sensor und das Shield dazu?
Gibt es schon einen Beispielscode dazu.
Module und Sensoren für den Hobby und Profi Elektroniker :
https://www.ramser-elektro.at/shop/

oldmann

Hallo

agmue;

Ich gehe Deinem Tipp nach, brauche aber erst ein „delay". Nein ich versuche mit millis. ;)

In der letzten Woche habe ich versucht zu viel Stoff aufbearbeiten. Es ist ein totales Chaos entstanden. Muss ein System da.

FredRam;

Danke für deinen Tipp.

Ja der „Giesomat" kenne ich. Eine interessante Lösung für einem Bewässerung.
Händler aus Fernen Osten bitten mittlerweile bezahlbaren Sensoren die arbeiten mit gleichen Prinzip, und geben am Ausgang eine Spannung 0-3V (Habe  ein paar bestellt, leider der weg ist sehr lange) der Vorteil: ein analog Eingang genug, und so viele verwendbar, wie viele freie Eingänge stehen zu Verfügung. 

Zu code für Arduino:

Der Michael Haugk schreib: (Zitat)
„Der Rest sollte für den geübten Arduino-Programmierer eine Kleinigkeit sein"
Ich brauche den Rest, und bin leider kein „geübte Arduino-Programmierer". :'(

oldmann

agmue;

Bevor ich wieder Fehler beginne muss fragen. Aus Deinem Vorschlag:
 
Code: [Select]
const byte messPin, relaisPin;
  const int trockenWert;
  const unsigned long messIntervall, giessIntervall, nachgiessenIntervall;
  unsigned int messwert;
  unsigned long vorhin, intervall;
  byte schritt;

Was nach Dir haben zu bedeuten „vorhin" und „intervall"?
Und in diesem Abschnitt:
Code: [Select]
void loop()
{ jetzt = millis();
  for (Blumen &b : blumen) b.run();  // alle Feldelemente werden nacheinender mit der Methode run abgearbeitet
}

Was meinst Du mit   „jetzt" ?
Danke im Voraus.

agmue

#25
Nov 12, 2018, 09:25 pm Last Edit: Nov 12, 2018, 09:25 pm by agmue
Was nach Dir haben zu bedeuten „vorhin" und „intervall"?
...
Was meinst Du mit   „jetzt" ?
Das entstammt dem Beispiel der IDE BlinkWithoutDelay, nur anders benannt:

currentMillis = jetzt
previousMillis = vorhin
interval = intervall

Für mein Gehirn ist es einfacher, sich vorzustellen, millis() würde sich während loop() nicht ändern, was sich aber als fataler Fehler herausstellen könnte. Daher verwende ich jetzt, dann stimmt die Annahme.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

postmaster-ino

Hi

millis() ist quasi die Stop-Uhr des Arduino - Sie zählt stur im 1ms-Takt vorwärts (ok, keine STOP-Uhr).
Das ist also die aktuelle Uhrzeit des Arduino - und die Methode .run benötigt die aktuelle Uhrzeit, um daraus abzuleiten, ob 'die Zeit um ist'.
jetzt ist eine globale Variable, wird in jedem loop()-Durchlauf gesetzt und dann in ALLEN 'Blumen' angewendet.

MfG

oldmann

Danke

OK das mit die millis ist mir klar. Was mich aber momentan beschäftigt:

Im agmue's Vorschlag gibt ein Intervall für Feuchtigkeit Messungen, finde ich auch richtig. Um das erreichen muss die zeit der letzten Messung festgehalten sein, ich sehe aber keinen geeigneten, außer „vorhin", Merker. Ist das so, dass wenn ich in run Methode einen Merker „vorhin" setze, wird die Messung Zeit für jede Blume gemerkt, auch bei gleicher Benennung? Muss ich nach anderer Lösung suchen? Oder habe ich das falsch interpretiert?


agmue

#28
Nov 13, 2018, 12:58 am Last Edit: Nov 13, 2018, 10:01 am by agmue
Ist das so, dass wenn ich in run Methode einen Merker „vorhin" setze, wird die Messung Zeit für jede Blume gemerkt, auch bei gleicher Benennung?
Die Methode kann so geschrieben werden, als gäbe es nur eine Blume und eine Pumpe. Das Feld blumen[] hat aber zwei Elemente, weshalb es auch zweimal die Variable vorhin gibt: blumen[0].vorhin und blumen[1].vorhin. Die Initialisierung von vorhin erfolgt im Constructor, ist also im Feld blumen[] nicht direkt sichtbar. Wenn Du Dir vorstellst, jedes Element von blumen[] hat 10 Konstanten und Variablen1), dann gehört eine zu vorhin.


Anm:
1) Wenn ich mich verzählt haben sollte, dann sind es so viele, wie Konstanten und Variablen im Constructor hinter dem Doppelpunkt stehen. Auch vorhin(0) ist dort zu finden.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

FredRam

Hallo

Ja der „Giesomat" kenne ich. Eine interessante Lösung für einem Bewässerung.
Händler aus Fernen Osten bitten mittlerweile bezahlbaren Sensoren die arbeiten mit gleichen Prinzip, und geben am Ausgang eine Spannung 0-3V (Habe  ein paar bestellt, leider der weg ist sehr lange) der Vorteil: ein analog Eingang genug, und so viele verwendbar, wie viele freie Eingänge stehen zu Verfügung. 
Der riesige Vorteil des Giesomat ist das digitale Signal.
Achtung vor der Ware aus Fernost: Die sind nicht versiegelt.
Nach ein paar Wochen löst sich der Lötstopplack.
Module und Sensoren für den Hobby und Profi Elektroniker :
https://www.ramser-elektro.at/shop/

Go Up