2017-01-24 11 views
3

Ich versuche grundsätzlich ein einfaches Skript zu schreiben, das dem Lüfter (der an Pin 4 am GPIO angeschlossen ist) mitteilt, dass er bei einer bestimmten Temperatur einschaltet und wenn nicht, dann schaltet er den Lüfter aus. Ich beginne mit etwas Einfachem, nur um zu sehen, ob ich den Lüfter basierend auf der Temperatur steuern kann. Hier ist, was ich bisher:Wie kann ich einen Lüfter mit GPIO auf einem Raspberry Pi 3 mit Python steuern?

import os 
from time import sleep 
import signal 
import sys 
import RPi.GPIO as GPIO 

GPIO.setmode(GPIO.BCM) 
GPIO.setup(4, GPIO.OUT) 

temp = os.popen('vcgencmd measure_temp').readline() 

if temp > 65: 
    GPIO.output(4, True) 
else: 
    GPIO.output(4, False) 

Als ich dies ausführen, entweder es scheint zu laufen, aber der Lüfter schaltet sich nicht aus, auch wenn die Temperatur ist nicht annähernd das Niveau erreicht ich schrieb, oder es wird Sag mir, dass der Pin bereits benutzt wird, aber trotzdem weiter geht. In beiden Fällen läuft der Lüfter unabhängig von der aktuellen Temperatur.

vgencmd als zurückgibt: temp-37.0'C

Wie würde ich die nicht-numerischen Zeichen entfernen, damit ich mit einem int steckte? Als ich es ausführen ich diese:

ValueError: invalid literal for int() with base 10: "temp=37.6'C\n" 

HINWEIS: Einige der importierten Module sind noch nicht in Gebrauch ist, das ist, warum sie dort sind.

+2

Ich weiß nicht, ob dies alles reparieren, aber Sie müssen Temp in einen int konvertieren, bevor Sie es vergleichen . Probieren Sie: 'if int (temp)> 65:' Außerdem führen Sie nichts in einer Schleife aus, also wird es einmal ausgeführt und beendet. Versuchen Sie, die letzten 5 Zeilen (einschließlich der gelesenen Temp) innerhalb einer While-Schleife mit einer Verzögerung von etwa .1s – GRAYgoose124

+1

auszuführen Dies ist kein Forum, Sie müssen sich nicht für Ihre mangelnde Erfahrung entschuldigen. Ich würde empfehlen, Ihre Frage zu vereinfachen und zu fragen, was Sie eigentlich erreichen möchten. "Wie steuere ich einen Lüfter mit GPIO auf einem Raspberry Pi 3". – Soviut

+0

Bitte beachten Sie mein Update, wo ich 'measure_temp()' hinzugefügt habe. –

Antwort

4

Sie sind sehr nah dran. Diese beiden Linien sind problematisch:

temp = os.popen('vcgencmd measure_temp').readline() 

if temp > 65: 

Hier temp eine Zeichenfolge ist. Sie müssen temp in eine Ganzzahl konvertieren, bevor Sie versuchen, sie mit einer Ganzzahl zu vergleichen. die Linie Unter der Annahme, Sie lesen nur eine Dezimalstring bis zu einem gewissen Temperatur entspricht, können Sie einfach int() nennen, wie folgt aus:

temp = os.popen('vcgencmd measure_temp').readline() 
temp = int(temp) 

aktualisieren Da Sie die Ausgabe geschrieben sind Sie eigentlich zu versuchen, parsen, können wir reguläre Ausdrücke verwenden, um die Ausgabe mit der re module übereinstimmen. Wir werden dies auch in Funktion setzen:

def measure_temp(): 
    raw = os.popen('vcgencmd measure_temp').readline() 
    m = re.match("temp=(\d+\.?\d*)'C", raw) 
    if not m: 
     raise ValueError("Unexpected temperature string: " + raw) 
    return float(m.group(1)) 

temp = measure_temp() 

Bitte beachte, dass ich um die tatsächliche Temperatur dezimal in der Zeichenfolge eine Capture-Gruppe verwendet, und der Zugriff auf sie m.group(1) verwenden.


Lass es uns jetzt zusammensetzen. Auch wenn der Code nicht tut, was Sie erwarten, es ist extrem hilfreich, einige „Debug-prints“ enthalten, wie folgt aus:

def measure_temp(): 
    raw = os.popen('vcgencmd measure_temp').readline() 
    m = re.match("temp=(\d+\.?\d*)'C", raw) 
    if not m: 
     raise ValueError("Unexpected temperature string: " + raw) 
    return float(m.group(1)) 

temp = measure_temp() 
print 'Temperature from vcgencmd: {}'.format(temp) 

if temp > 65: 
    print 'Turning on GPIO 4' 
    GPIO.output(4, True) 
else: 
    print 'Turning off GPIO 4' 
    GPIO.output(4, False) 

Sobald Sie die Grundlagen erhalten arbeiten, gibt es eine paar andere Dinge, die Sie laufen werden:

Ihr Skript überprüft die Temperatur und schaltet den GPIO einmal. Wenn Sie möchten, dass dieses Gerät wie ein Thermostat funktioniert, müssen Sie diese Aktionen mit einer while-Schleife fortsetzen.

Wenn Ihre while Schleife läuft sehr schnell, und die Temperatur schwankt direkt um Ihr Soll (65), Sie gehen Ihren Code schnell drehen Sie den Lüfter an/aus zu finden. Es kann helfen, dem System ein Bit hysteresis hinzuzufügen.Wenn Sie z. B. Ihr Heim-Thermostat (Heizung) auf 70 Grad einstellen, wird es möglicherweise bei 69 eingeschaltet, bei 71 jedoch ausgeschaltet. Oder es ändert einfach keine Zustände, wenn es innerhalb der letzten X Sekunden bereits Zustände geändert hat.

wäre die einfachste Lösung für einen kurzen Zeitraum zwischen den Prüfungen zu sleep() sein:

while True:  # Loop forever 

    # Read the current temperature 
    temp = os.popen('vcgencmd measure_temp').readline() 
    temp = int(temp) 
    print 'Temperature from vcgencmd: {}'.format(temp) 

    # Control the fan 
    if temp > 65: 
     print 'Turning on GPIO 4' 
     GPIO.output(4, True) 
    else: 
     print 'Turning off GPIO 4' 
     GPIO.output(4, False) 

    # Wait before the next iteration 
    time.sleep(5) 
Verwandte Themen