Python Script zum Temperatur auslesen und Motor steuern funktioniert nicht

  • Hallo, ich habe jetzt mein Python Script geschrieben, welches erst die Temperatur ausließt und anschließend einen Motor für unterschiedlich lange zeit (je nach Temperatur) anschaltet. Doch es funktioniert nicht.


    Doch warum wird immer die letzte else bedingung ausgeführt? Wenn ich nur das erste Script zur Temperaturabfrage nehme, zeigt es mir 23°C an, und wenn ich dann wieder das Zweite Script dazu nehme, wird wieder die letzte else abfrage ausgeführt (

    Code
    GPIO.output(31, GPIO.LOW)
          GPIO.output(35, GPIO.HIGH)
          time.sleep(30)
          GPIO.output(31, GPIO.HIGH)
          GPIO.output(35, GPIO.LOW)
          time.sleep(1)
    
    
          time.sleep(1)

    ) .

    WARUM? :wallbash: :wallbash: :wallbash:

    Vielen Dank! :)

  • Python Script zum Temperatur auslesen und Motor steuern funktioniert nicht? Schau mal ob du hier fündig wirst!

  • DARUM!

    Die Verschachtelungen sind irgendwie komisch, wieso setzt du erst 5 if nacheinander? Trifft die erste Bedingung nicht zu wird direkt die "else" ausgeführt und somit auch nicht die darin stehenden if's. Auch ist die Reihenfolge nicht besonders schlau da <27 früher zutrifft als das später stehende <23. Ein Funktionsaufruf zum auslesen der Temperatur fehlt ebenfalls.

    "file" zu verwenden ist keine gute Idee, da das von python bereits verwendet wird.

    [code=php]
    #!/usr/bin/python
    # -*- coding: utf-8 -*-

    import os
    import sys
    import time
    from RPi import GPIO

    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(31, GPIO.OUT)
    GPIO.setup(35, GPIO.OUT)


    def aktuelleTemperatur():
    with open('/sys/bus/w1/devices/28-000007fa6c0f/w1_slave') as fileObject:
    filecontent = fileObject.read()
    stringvalue = filecontent.split('\n')[1].split(' ')[9]
    temperature = float(stringvalue[2:]) / 1000
    return '%6.2f' % temperature


    def tmpmgr():
    Temperatur = aktuelleTemperatur()
    if Temperatur < 23:
    GPIO.output(31, GPIO.HIGH)
    GPIO.output(35, GPIO.LOW)
    time.sleep(30)
    GPIO.output(31, GPIO.LOW)
    GPIO.output(35, GPIO.HIGH)

    elif Temperatur < 24:
    GPIO.output(31, GPIO.HIGH)
    GPIO.output(35, GPIO.LOW)
    time.sleep(25)
    GPIO.output(31, GPIO.LOW)
    GPIO.output(35, GPIO.HIGH)

    elif Temperatur < 25:
    GPIO.output(31, GPIO.HIGH)
    GPIO.output(35, GPIO.LOW)
    time.sleep(15)
    GPIO.output(31, GPIO.LOW)
    GPIO.output(35, GPIO.HIGH)

    elif Temperatur < 26:
    GPIO.output(31, GPIO.HIGH)
    GPIO.output(35, GPIO.LOW)
    time.sleep(7)
    GPIO.output(31, GPIO.LOW)
    GPIO.output(35, GPIO.HIGH)

    elif Temperatur < 27:
    GPIO.output(31, GPIO.LOW)
    GPIO.output(35, GPIO.HIGH)
    time.sleep(30)
    GPIO.output(31, GPIO.HIGH)
    GPIO.output(35, GPIO.LOW)

    #EOF
    [/php]

    Wenn sich Code nahezu identisch immer wieder wiederholt kann man besser eine Funktion definieren um sich Codezeilen zu sparen:
    [code=php]
    def motor(one=GPIO.HIGH, two=GPIO.LOW, pause=30):
    GPIO.output(31, one)
    GPIO.output(35, two)
    time.sleep(pause)
    GPIO.output(31, not one)
    GPIO.output(35, not two)


    def tmpmgr():
    Temperatur = aktuelleTemperatur()
    if Temperatur < 23:
    motor()

    elif Temperatur < 24:
    motor(pause=25)

    elif Temperatur < 25:
    motor(pause=15)

    elif Temperatur < 26:
    motor(one=GPIO.HIGH, two=GPIO.LOW, pause=7)

    elif Temperatur < 27:
    motor(GPIO.LOW, GPIO.HIGH, 30)

    #EOF
    [/php]

    Das "not one" sorgt dafür dass der entgegengesetzte Boolwert gesetzt wird.

    GPIO.HIGH ist ein einfaches "True" bzw 1
    GPIO.LOW ist einfach nur "False" bzw 0

    not GPIO.HIGH
    wird dann also zu False und
    not GPIO.LOW
    wird zu True umgewandelt.

    Bei der Festlegung der "motor" Funktion setze ich zudem Default Werte. Ruft man dann nur "motor()" auf und übergibt nichts, werden diese default Werte verwendet. Man kann dann aber auch den jeweiligen Wert verändern wie zum Beispiel "motor(pause=10)" dann werden die anderen "one" und "two" default Werte verwendet aber pause auf 10 gesetzt. Zuletzt zeige ich auch ein Aufruf wie er auch funktioniert, sofern man die Reihenfolge der Parameter einhält.

  • Da sehe ich eigentlich kein Problem:

  • "wert == wert2" gibt False zurück, aber wo wird das HIER verwendet?

    "wert == 292654.25" und auch "wert == float(292654.25)" gibt übrigens auch False zurück...

  • Erstmal Danke für die schnellen Antworten :thumbs1:. Doch das script funktioniert noch nicht.

    Es kommt immer folgende fehlermeldung:

  • Du kannst nicht das with-statement einfach ohne "open" benutzen:

    Code
    with open('mein/toller/datei/name') as inf:
         inf.read()


    Automatisch zusammengefügt:
    Und wie Manul schon schrieb, deine String-formatierung in getTemperatur() vernichtet alle Hoffnung, dass danach irgendwelche Vergleiche sinnvoll sein koennten. Lass die einfach weg, und gib temperature direkt zurueck.

  • Na, irgendwas fix und fertig zu posten ist ja auch blöd - irgendwas solltet ihr trotzdem noch selber machen :fies:

    Google halt mal nach der Fehlermeldung, oder nach "python with"


  • Da sehe ich eigentlich kein Problem:

    Ich schon:

  • Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Das ist mein jetziger Stand. Ich habe noch eine while schleife dran gehängt, damit das Script sich wiederholt. Doch da gibt es anscheinend irgendein Problem mit der abfrage. Nur wo liegt da der Fehler?

  • BTW wieso nutzt du print("hi") und print(Temperatur) in einer python2 Umgebung?

    Wundert mich das bootsmann deshalb nicht sofort auf die Barrikaden gesprungen is :-/


    [code=php]
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import print_function
    import os
    import sys
    import time
    from RPi import GPIO

    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(31, GPIO.OUT)
    GPIO.setup(35, GPIO.OUT)


    def aktuelleTemperatur():
    with open('/sys/bus/w1/devices/28-000007fa6c0f/w1_slave') as fileObject:
    filecontent = fileObject.read()
    stringvalue = filecontent.split('\n')[1].split(' ')[9]
    temperature = float(stringvalue[2:]) / 1000
    return '%6.2f' % temperature


    def motor(one=GPIO.HIGH, two=GPIO.LOW, pause=30):
    GPIO.output(31, one)
    GPIO.output(35, two)
    time.sleep(pause)
    GPIO.output(31, not one)
    GPIO.output(35, not two)


    def tmpmgr():
    Temperatur = int(aktuelleTemperatur())
    print(Temperatur)
    if Temperatur < 23:
    motor()
    elif Temperatur < 24:
    motor(pause=25)
    elif Temperatur < 25:
    motor(pause=15)
    elif Temperatur < 26:
    motor(one=GPIO.HIGH, two=GPIO.LOW, pause=7)
    elif Temperatur < 27:
    motor(GPIO.LOW, GPIO.HIGH, 30)


    if __name__ == '__main__':
    try:
    while True:
    tmpmgr()
    time.sleep(5)
    except (KeyboardInterrupt, SystemExit):
    GPIO.cleanup()


    #EOF
    [/php]

  • Okay, also erstmal, das

    Code
    print ("Hi")

    war nur zum testen woran es lag, dass das Script nicht funktioniert hat. Und jetzt habe ich den Fehler gefunden. Wenn ich in das Python Shell

    Code
    aktuelleTemperatur()

    eingebe, bekomme ich als ergebniss z.B. ' 23'
    Aber in der Abfrage stand:

    Code
    if Temperatur < 23:

    . Also habe ich die Abfrage in

    Code
    if Temperatur < ' 23':

    geändert, und siehe da, das Script funktioniert.
    Dennoch, Vielen dank für die Vielen Antworten :bravo2:

    So sieht der Code jetzt aus:

  • Es ist *Zufall*, dass das funktioniert. Liest du eigentlich, was man dir hier so alles schreibt? DER VERGLEICH VON STRINGS FUNKTIONIERT NICHT. Lass dir mal ausgeben, was "23" < "3" ausgibt, und frag dich, *warum* das so ist.

    Also nochmal: werd die String-Konvertierung in getTemperature() *los*, und vergleiche mit ZAHLEN.

Jetzt mitmachen!

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