DHT22 gleiche Werte

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo und Moin,

    Ich will mir für meine Chilipflanzen eine Box bauen, in der optimale Klimabedingungen herrschen. Da diese aus Mexico kommen und es sich um keine Zuchtsaat handelt, sind die halt ein wenig anfälliger aber unter optimalen Bedingungen halt auch um einiges Geschmacksvoller (weniger Schärfe, aber höheren Eigengeschmack). Aber ja eigentlich auch egal.


    Es gibt im Groben zwei Phasen:

    Vegetation und Fruchtphase, welche sich von dem Belichtungzeitraum unterscheiden.

    Außerhalb des Belichtungszeitraumes sollen auch andere Temperaturen gehalten werden, dazu hab ich nun dieses Python Skript geschrieben (s.u.).

    Das Script soll nun alle 15Minuten die Temperatur und Luftfeuchtigkeit messen und entsprechend agieren (Kühl und Heizmaßnahmen über Relais gesteuert), das Problem ist nur, dass die Werte, die nun gemessen werden komplett identisch sind und nicht neu erfasst werden.

    Das sieht so aus, dass zu Anfang eine Temperatur von Bsp.: 19°C gemessen wird und dieser nun alle 15Min ausgegeben wird und sich nicht verändert, dabei soll das Script ja alle 15Min neu Messen.

    Ich bin blutiger Anfänger und beschäftige mich nun bummelig eine Woche mit Python, daher habt bitte Nachsicht :danke_ATDE:, auch wenn es tausende Gewächshaus Scripte gibt, wollte ich gerne selber eins schreiben, da mich Python sehr fasziniert und ich die Sprache gerne lernen möchte. Aus Google und der Suchfunktion bin ich leider auch nicht schlauer geworden.


    Ich freu mich auf die Antworten und vielen Dank schonmal!


    Die Funktion Luft_Blu ist quasi genau die gleiche wie Luft_veg, nur mit anderen Zeiten und Temperaturen

  • Du liest zwar humidity und temperature innerhalb Deiner Schleife neu ein, fragst aber nur die Variablen c und lf ab (bzw. gibst sie aus), in die Du vor Beginn der Schleife einmalig die Werte übertragen hast (warum eigentlich?).

  • Hallo,


    sagen wir mal so: du misst ziemlich sicher richtig, gibst aber nicht das aus, was du misst - siehe Anmerkung von Manul.


    Zum Code:

    • Die Zeilen 26 und 27 sowie alle Zeilen, wo nur `humidity` und `temperature` steht, sind sinnlos -> weg damit.
    • `print` ist in Python 2 ein Statement und keine Funktion -> du brauchst keine Klammern.
    • Strings formatiert man auch in Python 2.7 mit der `format()` Methode von String.
    • Variablenname sollen _aussagekräftig_ sein und nicht kryptisch oder nur aus einem Buchstaben bestehen. Das erhöht die Lesbarkeit des Codes deutlich.
    • Statt selber relativ umständlich die Zeit zu zählen, solltest du dir lieber jedes Mal die aktuelle Zeit aus einem datetime-Objekt aus dem `datetime` Modul holten und in den if-Abfragen verarbeiten.
    • `humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)` solltest du an den Anfang der `while` Schleife setzen und nicht in jeden if-elif` Zweig. Spart dir etliche Zeilen redundanten Code.
    • Die ganze Struktur des Programms ist suboptimal. Die definierst eine Endlosschleife, verlässt diese aber nie explizit, sondern springst nur irgendwann zur Funktion `Luft_blu`. Wenn diese irgendwann zu Ende ist, kommst du zurück zu `Luft_blu` - was in der Funktion aber nicht wirklich vorgesehen ist, weil der Blütephasezähler nie zurück gesetzt wird.
    • Wenn dein Prog crasht und du es neu startest (was automatisiert über einen systemd Unit ja kein Problem ist), dann fängt das Programm von vorne an, also mit 0 Tage Blütephase. Das ist sicherlich nicht Sinn der Sache. Hier solltest du dir mal über Datenpersistenz der wichtigen Zähler Gedanken machen.
      Grundsätzlich ist es IMHO auch nicht sinnvoll, das Skript primär mit 900 Sekunden (=15 Minuten) warten zu "beschäftigen". Dann macht es viel mehr Sinn, dass Skript alle 15 Minuten über eine systemd Timer Unit aufzurufen. Was ja kein Problem ist, wenn du die Datenpersistenz der Zähler umgesetzt hat.
    • Python 2 ist 2020 End of Life. Von daher solltest du hier vielleicht jetzt schon mal Gedanken machen, wie du das dann machen willst.


    Gruß, noisefloor

  • Du liest zwar humidity und temperature innerhalb Deiner Schleife neu ein, fragst aber nur die Variablen c und lf ab

    D.h. ich muss vom Ding her nur c und lf durch humidity und temperature ersetzen? oder die c = temperature lf = humidity hinter die while schleife setze?

    (warum eigentlich?).

    ich hab vorher trockenübung mit c und lf gemacht, ob das ganze auch so klappt wie ich mir das vorstelle, erst dann kam der Sensor an... Ich dachte das reicht wenn ich  c = humidity setze.

  • puh... gute antwort... die muss ich nun erstmal verarbeiten... Danke euch beiden schonmal

  • Hallo,


    Quote

    D.h. ich muss vom Ding her nur c und lf durch humidity und temperature ersetzen?

    Genau.


    Quote

    oder die c = temperature lf = humidity hinter die while schleife setze?

    Nein. Wie gesagt, diese Zeilen sind im Programm sinnlos. Damit bindest du `temperature` und `humidity` zu diesem Zeitpunkt nur an weitere Namen. Was überflüssig ist.


    Quote


    die muss ich nun erstmal verarbeiten

    :) - falls du es noch nicht gelesen hat, wäre JETZT ein guter Zeitpunkt, das offizielle Python-Tutorial auf docs.python.org zu lesen: https://docs.python.org/3.6/tutorial/index.html


    Gruß, noisefloor

    • Die Zeilen 26 und 27 sowie alle Zeilen, wo nur `humidity` und `temperature` steht, sind sinnlos -> weg damit.
    • `print` ist in Python 2 ein Statement und keine Funktion -> du brauchst keine Klammern.
    • Strings formatiert man auch in Python 2.7 mit der `format()` Methode von String.
    • Variablenname sollen _aussagekräftig_ sein und nicht kryptisch oder nur aus einem Buchstaben bestehen. Das erhöht die Lesbarkeit des Codes deutlich.
    • Statt selber relativ umständlich die Zeit zu zählen, solltest du dir lieber jedes Mal die aktuelle Zeit aus einem datetime-Objekt aus dem `datetime` Modul holten und in den if-Abfragen verarbeiten.
    • `humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)` solltest du an den Anfang der `while` Schleife setzen und nicht in jeden if-elif` Zweig. Spart dir etliche Zeilen redundanten Code.

    ist geschehen und scheint zu funktionieren :) Ich lass heute über Nacht mal ein Versuch laufen.

    • Die ganze Struktur des Programms ist suboptimal. Die definierst eine Endlosschleife, verlässt diese aber nie explizit, sondern springst nur irgendwann zur Funktion `Luft_blu`. Wenn diese irgendwann zu Ende ist, kommst du zurück zu `Luft_blu` - was in der Funktion aber nicht wirklich vorgesehen ist, weil der Blütephasezähler nie zurück gesetzt wird.
    • Wenn dein Prog crasht und du es neu startest (was automatisiert über einen systemd Unit ja kein Problem ist), dann fängt das Programm von vorne an, also mit 0 Tage Blütephase. Das ist sicherlich nicht Sinn der Sache. Hier solltest du dir mal über Datenpersistenz der wichtigen Zähler Gedanken machen.
    • Grundsätzlich ist es IMHO auch nicht sinnvoll, das Skript primär mit 900 Sekunden (=15 Minuten) warten zu "beschäftigen". Dann macht es viel mehr Sinn, dass Skript alle 15 Minuten über eine systemd Timer Unit aufzurufen. Was ja kein Problem ist, wenn du die Datenpersistenz der Zähler umgesetzt hat.
    • Python 2 ist 2020 End of Life. Von daher solltest du hier vielleicht jetzt schon mal Gedanken machen, wie du das dann machen willst.

    -Die Endlosschleife im Luft_blu ist gewollt. Sobald die Funktion eintritt soll sich ja nichts ändern. Wenn z.B. am Tag 100 die Beleuchtung und Belüftung einfach ausgeht, geht auch die Pflanze ein, da ich viel Unterwegs bin, kann es sein das ich die Pflanze auch erst eine Woche nach Tag X ernten kann und da wäre es schön wenn bis dahin für die Pflanze die Sonne noch scheint.

    -Das Prog darf einfach nicht crashen:neutral: zumindest bin ich noch nicht so weit, wie man das ganze sichern kann.


    -Das sehe ich durchaus ein. Ich muss mich auch unbedingt nochmal mit datetime auseinandersetzten, damit könnte man halt auch das Problem von Punkt 2 in den Griff bekommen. Brauch man dafür nicht auch noch ein Modul mit einer Knopfzellen Batterie, welche die Innere Uhr des Rapi speichert (Wohne im Busch und habe nur Handy Hotspot zur Verfügung und keine permanente Internetverbindung)?


    Das Tutorial werd ich mir mal ansehen, danke für den Tipp!;)


    LG Ivan

  • Hallo,


    Quote


    Die Endlosschleife im Luft_blu ist gewollt. Sobald die Funktion eintritt soll sich ja nichts ändern.

    Da du `Luft_blu` nicht gezeigt hast, kann man da nix zu sagen.


    Quote

    Das Prog darf einfach nicht crashen

    Dürfen und tatsächlich nicht tun ist zweierlei. Es kann ja auch sein, dass dein Raspi einfach crasht, hängenbleibt etc. Wenn das nicht passieren darf, dann kontrolliere dein Gewächshäuschen mit einem Mikrocontroller und nicht nicht mit einem Computer. Mikrocontroller sind genau dafür gemacht, eine Aufgabe "für immer" zuverlässig auszuführen, Computer nicht wirklich.


    Quote

    Brauch man dafür nicht auch noch ein Modul mit einer Knopfzellen Batterie, welche die Innere Uhr des Rapi speichert

    Grundsätzlich nein. Wenn du Wert auf eine genaue Uhrzeit legst, dann macht das Nachrüsten einer RTC (Real Time Clock) aber Sinn. Und du bis sicher, dass die Uhrzeit immer stimmt, egal, wie lange der Raspi sich nicht mit einem Zeitserver im Internet synchronisiert hat.


    Gruß, noisefloor

  • Es kann ja auch sein, dass dein Raspi einfach crasht, hängenbleibt etc. Wenn das nicht passieren darf, dann kontrolliere dein Gewächshäuschen mit einem Mikrocontroller und nicht nicht mit einem Computer. Mikrocontroller sind genau dafür gemacht, eine Aufgabe "für immer" zuverlässig auszuführen, Computer nicht wirklich.

    das passiert öfter als man denkt, einige SD Karten sind mir am PI schon kaputt geschrieben worden, das schlimmste Erlebnis ich wollte aus der Ferne ran und bekam die Antwort open ssh abgelaufen. meine AVR Arduino nano laufen seit 3 Jahren durch ohne derlei Vergnüglichkeiten.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)