Temperaturabhängig GPIO Port schalten

  • Hallo,


    ich nutze einen DHT22 an einem Raspi3. Die z.B. Temperatur lese ich per Python Script folgendermaßen aus


    Code
    1. import Adafruit_DHT
    2. sensor = Adafruit_DHT.DHT22
    3. gpio = 4
    4. humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)
    5. print '{0:0.0f}'.format(temperature,humidity)

    Soweit funktioniert das problemlos. Nun möchte ich einen Lüfter, welcher per Relais an einem GPIO Port hängt, bei 25Grad einschalten bzw bei 22Grad ausschalten. Wie müsste ich das Script erweitern, um diese Funktion ausführen zu können. Leider ist mein Python Wissen gleich null, so dass ich trotz googeln keine funktionierende Lösung finden konnte.

  • Du solltest das Script garnicht erweitern, solange das Relais direkt vom GPIO bestromt werden soll. Ein "Verbraucher" am GPIO(out) darf nur 2 - 4 mA Strom ziehen.



    Servus !

    Wer nichts weiß, muss alles glauben.

  • Hallo,

    hier mal mein Vorschlag zum Skript:


    Benötigist du an einer Stelle eine Erklärung?


    Frage in die Runde, muss ich relais in der Funktion Zeile 26 def check_temperature(temperature, relais): wieder mit return in die main() zurückübergeben?



    Desweiteren möchte ich dir dazu raten, das Relais nicht direkt mit dem GPIO des Raspberry Pi anzusteuern, sondern dazwischen einen Transistor zu schalten, welcher das Relais ansteuert.

  • Dein Programm funktioniert wegen zwei Dingen nicht ;)

    1) relais, relias...

    2) relais.active_high gibt immer True zurück. Mit value musst du prüfen


    - zudem sollte man Deutsch und Englisch nicht mischen

    - hin und wieder liefert der ein DHT Sensor None zurück weil er ggf. zur time.sleep gerade blockiert wurde oder was auch immer

    - geschlossen wird relais auch nicht. Beim Beenden kann dies zur Folge haben, dass der Pin weiterhin verwendet wird


    Frage zum schalten GPIO

  • Frage in die Runde, muss ich relais in der Funktion Zeile 26 def check_temperature(temperature, relais): wieder mit return in die main() zurückübergeben?

    Kann man machen, ich sehe den Sinn immer noch nicht. Warum solltest du? :conf:

    1) relais, relias...

    In der main ist es falsch geschrieben, es wird aber nur die Instanz von OutputDevice an die Funktion check_temperature übergeben, in der wiederum die richtige Schreibweise vorhanden ist. Ich sehe da kein Problem...


    - zudem sollte man Deutsch und Englisch nicht mischen

    :thumbup:

  • 1) relais, relias...

    Upps Schreibfehler, und durch Autovervollständigung natürlich dann bei den anderen nicht aufgefallen - korrigiert



    2) relais.active_high gibt immer True zurück. Mit value musst du prüfen

    Stimmt - hier hab ich die Doku missverstanden



    - zudem sollte man Deutsch und Englisch nicht mischen

    hier bin ich hartnäckig und belehr resistent :)



    - geschlossen wird relais auch nicht. Beim Beenden kann dies zur Folge haben, dass der Pin weiterhin verwendet wird

    guter Einwand


    Korrekturen im oberen Beitrag eingefügt


    Kann man machen, ich sehe den Sinn immer noch nicht. Warum solltest du? :conf:

    War mir nicht sicher mit den Gültigkeitsbereichen ob die Änderungen dann in der main vorhanden sind oder nicht...deshalb hab ich mir das jetzt auch nochmals visualisiert

    AWOHille ich hoffe wir konnten helfen?

  • Erst mal vielen Dank an alle, besonders an Hofei für das funktionierende Script. Habe eben getestet, funktioniert absolut zufriedenstellend. Die Funktionsweise des Scripts ist mir soweit auch klar.

  • ich habe noch eine weitere Frage. Ist es möglich, dass ich den Status des Relais in einem weiteren Script abfrage z.B. Relais ein oder Relais aus? Wie müsste da das Script aussehen?

  • AWOHille

    Hat den Titel des Themas von „Teperaturabhängig GPIO Port schalten“ zu „Temperaturabhängig GPIO Port schalten“ geändert.
  • In einem anderen Thread hier wurde mal ein ähnliches Vorhaben bearbeitet. Gelöst wurde es da über ein Python-Script, welches per Cron-Job alle 2 Minuten ausgeführt wurde.


    Habe es für Libreelec angepasst (Pfade zu RPi-Tools, etc) und den Mechanismus zum Auslesen der Temperatur von 'vcgencmd' auf die 'thermal_zone'-files umgestellt, um die CPU-Last zu senken.


    Der Lüfter muss dann auf GND (schwarzes Kabel) und GPIO14 (Pin 8, rotes Kabel) gesteckt werden.


    Crontab -e

    */2 * * * * python /storage/setup/fan-control.py


  • In einem anderen Thread hier wurde mal ein ähnliches Vorhaben bearbeitet. Gelöst wurde es da über ein Python-Script, welches per Cron-Job alle 2 Minuten ausgeführt wurde.

    Das passt nicht so ganz zu meiner Grundvoraussetzung, da hier ja keine externe Temperatur gemessen wird.


    Nochmal zurück zum Script von Hofei. Aktuell läuft das ja in einer Schleife. Ist es möglich, dies nicht in eine Schleife laufen zu lassen, so dass ich es per Cronjob laufen lassen kann? Dabei wäre noch wichtig, dass der aktuelle Status des Relais mit ausgeben wird (z.B. als True oder False). Wie müsste das Script entsprechend verändert bzw erweitert werden?

  • so dass ich es per Cronjob laufen lassen kann?

    Warum das denn? :conf:



    dass der aktuelle Status des Relais mit ausgeben wird

    Hm :denker:, ist im Grunde in den prints durch die Funktion check_temperature(temperature, relais) doch schon gegeben oder @all? Oder brauchst Du das als Variable?


    BTW: Den tatsächlichen Status der Relais kannst Du allerdings nur am Stellen / Schaltpol abnehmen.

    "Alles, was wir sind, ist Sand im Wind, Hoschi."

  • :geek:Du schließt ernsthaft einen Lüfter direkt auf einen GPIO an?

    Die GPIO-Pins liefern 3,3 Volt, das reicht für den Lüfter. Und kleine Lüfter mit 2,5 cm Durchmesser sind ja keine Hochspannungs-Geräte...

  • Das heißt dir ist nicht bewusst wie viel Leistung oder Strom du konkret entnehmen darfst?


    Ebenso ist auch nicht bekannt welchen Lüfter der TE verwendet, da wir hier beim Skript Temperaturwerte von An:25 aus:22 grad haben reden wir wohl von Raumtemperatur...solche Ratschläge gefährden den Pi.


    Abschließend noch, stellt der Lüfter eine induktive Last dar, hast du wenigstens eine Schutzdiode verbaut? Und nein einen Lüfter direkt an gpio zu betreiben kann ich echt nicht empfehlen ( jar )

  • Ist es möglich, dies nicht in eine Schleife laufen zu lassen, so dass ich es per Cronjob laufen lassen kann?

    Warum? Was für einen Sinn soll das ganze haben? Nach beendigung des Skriptes kannst du den Zustand des Pins nicht mehr garantieren.

    Dabei wäre noch wichtig, dass der aktuelle Status des Relais mit ausgeben wird (z.B. als True oder False)

    Wird doch schon gemacht, eine Ausgabe ob eingeschalten oder ausgeschalten wird.


    Du sagst du verstehst das Skript, dies dann so zu erweitern ob True or False müsste eine Leichtigkeit sein;) Probier mal - mehr als schief gehen kanns nicht.