Temperaturabhängig GPIO Port schalten

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,

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

    Code
    import Adafruit_DHT
    sensor = Adafruit_DHT.DHT22
    gpio = 4
    humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)
    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.

  • 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?

  • 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

    Meine PIs:

    RPi 3b > MediaCenter mit Libreelec daheim

    RPi 4 > Dashboard fürs Ticketsystem in der Arbeit

    Bei beiden laufen noch diverse Docker-Container für Zusatzaufgaben (Tor-Proxy, NextCloud, Pyload, etc.)

  • 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?

    • Offizieller Beitrag

    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.

  • :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...

    Meine PIs:

    RPi 3b > MediaCenter mit Libreelec daheim

    RPi 4 > Dashboard fürs Ticketsystem in der Arbeit

    Bei beiden laufen noch diverse Docker-Container für Zusatzaufgaben (Tor-Proxy, NextCloud, Pyload, etc.)

  • Für den Lüfter reichts, der springt bei mir ab 61°C an:

    Meine PIs:

    RPi 3b > MediaCenter mit Libreelec daheim

    RPi 4 > Dashboard fürs Ticketsystem in der Arbeit

    Bei beiden laufen noch diverse Docker-Container für Zusatzaufgaben (Tor-Proxy, NextCloud, Pyload, etc.)

  • 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.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!