Frage:
Steuern eines Lüfters an einem Relais mit Python
Sandbird
2015-06-01 21:42:13 UTC
view on stackexchange narkive permalink

Ich habe einen Raspberry Pi Model B Revision 2 und einen Mini-5-V-Lüfter an einem Relaisschalter eingerichtet, den ich jetzt mit Python steuern möchte. Ich werde jede Stunde eine Crontab laufen lassen, um die Temperatur des Pi zu überprüfen, und wenn die Temperatur über 50 ° C liegt, werde ich den Lüfter etwa 10 Minuten lang laufen lassen. Dies ist mein aktuelles Setup:

enter image description here

Das Relais ist hier wie in diesem Diagramm dargestellt:

enter image description here

Ich habe das Relais auf diese Weise eingerichtet, da oben ein Licht darauf leuchtet (ein rotes Licht), das ich möchte, dass es eingeschaltet ist, wenn der Lüfter arbeitet ... und ausgeschaltet, wenn es nicht funktioniert.

Hier ist mein Skript:

  #! / usr / bin / python3import timeimport osimport sysimport RPi.GPIO als GPIO # Identifizieren Sie, welcher Pin das Relais steuertFAN_PIN = 3 # Temperaturprüfung. Lüfter nach 50 ° C starten, unter 50CFAN_START = 50def herunterfahren GPIOsetup (): GPIO.setmode (GPIO.BCM) GPIO.setup (FAN_PIN, GPIO.OUT) GPIO.setwarnings (False) def getCPUtemperature (): res = os.popen ( 'vcgencmd Measure_temp'). readline () return (res.replace ("temp =", ""). replace ("'C \ n", "")) def fanON (): GPIO.output (FAN_PIN, 0) print "fan on" return () def fanOFF (): GPIO.output (FAN_PIN, 1) print "fan off" return () def getTEMP (): CPU_temp = float (getCPUtemperature ()) wenn CPU_temp>FAN_START: fanON () else: fanOFF () return () def main (): GPIOsetup () getTEMP () try: main () endlich: print ("Finish") # GPIO.cleanup ()  

Nun das Problem ist, dass ich einige Warnungen bekomme, die ich einfach nicht loswerden kann:

  root @ raspberrypi: / home / pi # python fan.pyfan.py:14: RuntimeWarning: Dieser Kanal ist bereits in benutze, trotzdem weiter. Verwenden Sie GPIO.setwarnings (False), um Warnungen zu deaktivieren. GPIO.setup (FAN_PIN, GPIO.OUT) fan.py:14: RuntimeWarning: Auf diesem Kanal ist ein physikalischer Pull-up-Widerstand installiert! GPIO.setup (FAN_PIN, GPIO.OUT) Lüfter offFinish  

Die fragliche Zeile lautet wie folgt:

  GPIO.setup (FAN_PIN, GPIO.OUT)  

Warum erhalte ich diesen Fehler? Ich habe GPIO.setwarnings (False) in meinem Code. Und sollte ich diesen Pin auch zur Steuerung des Relais verwenden? Gibt es einen optionalen Pin, den ich verwenden sollte? Danke.

Kann nicht sicher sagen, weil ich dies nie auf die Probe gestellt habe, aber möglicherweise, weil dieses GPIO Teil der I2C-Schnittstelle ist. Wenn Ihnen diese nicht ausgehen, können Sie auch GPIOs verwenden, die standardmäßig nicht für einen höheren Zweck vorgesehen sind. Ich denke, in Ihrem Diagramm sind dies die gelben. Wenn sich herausstellt, dass dies das Problem ist und Sie diesen Pin wirklich verwenden möchten, sollten Sie in der Lage sein, den Zweck mithilfe einer der pi-spezifischen Bibliotheken (z. B. pigpio) entsprechend festzulegen.
Hmm, ich verstehe. Ich habe im Internet ein Bild von einem Typen gesehen, der Pin12 verwendet. Ich denke, das ist der Grund. Danke, ich werde es versuchen
Sind Sie sicher, dass Sie das Relais direkt an den GPIO-Pin anschließen möchten, wie in den Schaltplänen angegeben? (Ich weiß nicht, ob das Relaismodul einen Transistor an Bord hat). Außerdem: Das Schema ist irreführend, da das Relais ständig eingeschaltet ist - es ist an 5 V und GND gebunden -, während der GPIO-Pin mit nichts verbunden ist.
Ja, ich hätte ein besseres Relaisbild aufnehmen sollen. So sieht es aus: http://www.driscocity.com/wp-content/uploads/2014/05/connectrelay1.jpg. Es hat 4 Pins, + , -, ch1, ch2 wobei ch die Steuerungen für die Tore sind. Es gibt keine andere Möglichkeit, es an den Pi anzuschließen, also bin ich mir ziemlich sicher, dass ich es so einrichten muss. Lustige Sache ... ich habe dieses Diagramm zufällig gefunden :)
Vielen Dank für die Veröffentlichung (und die Antwort). Hier ist eine weitere Ressource für alle, die danach suchen: [Es werden ein Transistor und ein 5-V-Lüfter verwendet] (https://hackernoon.com/how-to-control-a-fan-to-cool-the-cpu-of-your- Himbeerpi-3313b6e7f92c)
Zwei antworten:
Sandbird
2016-08-03 13:42:54 UTC
view on stackexchange narkive permalink

Endgültiger Code:

  #! / usr / bin / env python3import osimport RPi.GPIO als GPIOimport timeimport datetimeimport sys # 5 * * * * sudo python /home/pi/fan.py# Eine Crontab wird stündlich ausgeführt und überprüft die Temperatur. Wenn die Temperatur > 49 ist, startet das Skript den Lüfter #, bis die Temperatur auf 28 sinkt. Wenn dies der Fall ist, wird das Skript beendet und der Lüfter wird ebenfalls heruntergefahren. # Wenn das Skript erneut ausgeführt wird, während ein vorheriges Skript ausgeführt wird, Letzterer verlässt # ... was bedeutet, dass sich der Pi in der Hölle befindet und erhält niemals den folgenden FAN_END-Wert: P # Identifizieren Sie, welcher Pin das Relais steuert. FAN_PIN = 18 # das gelbe Kästchen ex: GPIO18 # Temperaturprüfung. Starten Sie den Lüfter, wenn die Temperatur > 49CFAN_START = 49 # Temperaturprüfung. Herunterfahren unter 28CFAN_END = 28 # Welche Aktion abrufen. Wenn Sie die fanaction = sys.argv.pop () def GPIOsetup () manuell ein- und ausschalten: GPIO.setwarnings (False) GPIO.setmode (GPIO.BCM) GPIO.setup (FAN_PIN, GPIO.OUT) def fanON () : GPIOsetup () GPIO.output (FAN_PIN, 0) #fan on return () def fanOFF (): GPIOsetup () GPIO.output (FAN_PIN, 1) #fan off return () def get_temp_from_system (): res = os.popen ('vcgencmd Measure_temp'). readline () return (res.replace ("temp =", ""). replace ("'C \ n", "")) def check_fan (pin): GPIOsetup () gibt GPIO zurück. input (pin) def run (pin): current_date = datetime.datetime.now () temp = get_temp_from_system () wenn float (temp) > = FAN_START: print (temp + '@' + str (current_date)) wenn check_fan (pin) == 1: print ('Lüfter ist ausgeschaltet ... Lüfter wird gestartet') fanON () else: time.sleep (5) # Entfernen Sie, wenn Sie den Druck in Echtzeit überprüfen möchten ('Lüfter ist eingeschaltet') elif float (temp ) < = FAN_END: ​​print (temp + '@' + str (aktuelles_Datum)) wenn check_fan (pin) == 0: print ('Lüfter ist eingeschaltet ... wird heruntergefahren') fanOFF () GPIO.cleanup () gibt 1 # Exit-Skript zurück. Der Pi hat sich sonst abgekühlt: time.sleep (5) # Entfernen, wenn Sie eine Echtzeitprüfung wünschen
print ('Fan is OFF') else: pass # während das Skript hier durchläuft, wird keine Ausgabe für screenif action == "on" ausgegeben: print "Lüfter einschalten" fanON () elif action == "off" : print "Lüfter ausschalten" fanOFF () # prüfe zuerst, ob das Skript bereits ausgeführt wird, wenn check_fan (FAN_PIN) == 0: print ('Lüfter ist eingeschaltet, Skript muss von einer anderen Instanz ausgeführt werden ...') else: temp = get_temp_from_system () wenn float (temp) < FAN_START: print ('Pi arbeitet unter normalen Temperaturen.') else: try: while (True): tmp = run (FAN_PIN) wenn tmp == 1: # Wert aus Zeile 60 zurückgegeben außer KeyboardInterrupt: fanOFF () GPIO.cleanup () endlich: fanOFF () GPIO.cleanup ()  
Coach443
2016-08-03 02:59:08 UTC
view on stackexchange narkive permalink

Zusätzlich zum Entfernen des I2C-Pins möchten Sie die letzte Zeile auskommentieren (# entfernen), damit Ihr GPIO bereinigt wird. Dadurch wird der GPIO zurückgesetzt und Ihre Warnungen und Fehler werden bei der nächsten Ausführung Ihres Skripts entfernt.

Ich habe den Code seitdem sehr geändert ... und bereits eine Anleitung für das Ganze erstellt: http://www.instructables.com/id/Automated-cooling-fan-for-Pi/


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...