Gewächshaus mit millis statt delay

Guten Tag liebes Forum
Ich habe ein kleines Problem mit meinem Sketch.
Nachdem ich alle delay`s durch milis ersetzt habe bekomme ich keinen Wert von den Sensoren zurückgegeben. Keine Ahnung woran es liegt. Hoffentlich könnt ihr abhilfe schaffen.
Die Datei hänge ich mit ran.

Mfg

Bodenfeuchtigkeit_Messung.ino (265 Bytes)

Fuellstandsanzeige.ino (458 Bytes)

Gew_chshaus_Hauptteil1v3.ino (1.46 KB)

Helligkeit.ino (266 Bytes)

Messung_Temperatur.ino (416 Bytes)

(deleted)

(deleted)

delay.JPG

Ich sehe in den gezeigten Sketchen kein einziges millis(), nur 2 kurze delay() und ein langes pulseIn() in der Füllstandsmessung.

Bitte nimm Dir das EVA Prinzip ( Eingabe, Verarbeitung, Ausgabe) zu herzen und trenne die MEssung und das Ansteuern der Aktoren.

Um millis zu verstehen schau dir das "blink_without_delay" in den Beispieldateien der IDE an und lies die Nachtwächtererklährung BlinkwithoutDelay - Die Nachtwächtererklärung - Deutsch - Arduino Forum

Grüße Uwe

#Deklaration
unsigned long aktuell=millis();
.
.
.

#im Sketch
 if(aktuell-Timerhell>=intervall3)
  {
    Timerhell=aktuell;
.

Das könnte funktionieren? Bin erstaunt.
Wid dort wirklich "aktuell" immer der "millis()"-Wert übergeben?
Naja, anscheinend nicht. :frowning:

Wid dort wirklich "aktuell" immer der "millis()"-Wert übergeben?

Nur wenn die Deklaration in derselben Funktion steht (lokale Variable)

Hallo Sandman30,

millis() ist eine Funktion die einen Zahlenwert zurückgibt. Dieser Zahlenwert sind die Millisekunden die seit Programmstart vergangen sind.

Jedesmal wenn man millis() aufruft bekommt man die zu diesem Zeitpunkt aktuelle Anzahl Millisekunden.
In deinem Programm gibt es einen einzigen Aufruf von millis(). Da wo die Variable "aktuell" definiert wird.
Wenn das ganze funktionieren soll muss man in einer Schleife diese Zuweisung immer wieder von neuem machen.
Sonst bleibt die Variable "aktuell" auf dem Millisekundenwert bei Programmstart stehen.

Es gibt noch etwas anderes wichtiges beim Programmieren. Man sollte sich an das Grundprinzip
Eine Funktion macht genau eine Sache halten.
Du hast eine function "int Messunghell()" in dieser function wird aber nicht nur gemessen sondern auch noch geschaltet.
Das heißt der Name passt nicht so richtig. Dem compiler ist das vollkommen egal. Man könnte die function auch
"int blablaquatschi()" nennen. Es empfiehlt sich aber selbsterklärende Namen zu vergeben und dann macht eine function eine Sache. Je größer Programme werden desto mehr zahlt sich das aus. Weil man dann Fehler viel schneller findet.
Man programmiert eine function und testet sie aus. Wenn Sie funktioniert kommt der die nächste function. Auf diese Art kann man sich sehr sicher sein, dass der Fehler in der zuletzt geschriebenen function steckt. (zu 95% ab und zu gibt es doch Fehler die woanders stecken)

Übersichtlicher ist es eine function zu programmieren die den Messwert holt und eine zweite function die dann den Schaltvorgang macht. Das mag bei so wenig Befehlen die dann eine function hat umständlich wirken aber es zahlt sich auf die Dauer wirklich aus.

Du hast deinen Sketch auf mehrere Dateien aufgeteilt. Das macht es für andere ganz schön ausfwendig deinen Code mal testweise auf ein Board zu flashen. Man muss vier mal Datei hinzufügen anklicken bis man alles zusammen hat.

Es erzeugt eine gewisse Übersicht für jede Funktion eine eigene Datei zu haben aber es ist auch umständlich von Fenster zu Fenster zu klicken. Man kann auch alle Programmteile in einer Datei zusammenhalten.
Dadurch das man einzelne functions programmiert entsteht auch Ordnung und Übersicht.

viele Grüße

Stefan