Python schleife wo ist der Fehler?

  • Hallo

    http://codepad.org/dZzZtqRH

    [code=php]#!/usr/bin/python
    import time
    import RPi.GPIO as GPIO
    import Adafruit_DHT

    import datetime

    # Zuordnung der GPIO Pins (ggf. anpassen)
    sensor = Adafruit_DHT.DHT11
    pin = 27
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

    LCD_RS = 4
    LCD_E = 17
    LCD_DATA4 = 18
    LCD_DATA5 = 22
    LCD_DATA6 = 23
    LCD_DATA7 = 24

    LCD_WIDTH = 16 # Zeichen je Zeile
    LCD_LINE_1 = 0x80 # Adresse der ersten Display Zeile
    LCD_LINE_2 = 0xC0 # Adresse der zweiten Display Zeile
    LCD_CHR = GPIO.HIGH
    LCD_CMD = GPIO.LOW
    E_PULSE = 0.0005
    E_DELAY = 0.0005

    def lcd_send_byte(bits, mode):
    # Pins auf LOW setzen
    GPIO.output(LCD_RS, mode)
    GPIO.output(LCD_DATA4, GPIO.LOW)
    GPIO.output(LCD_DATA5, GPIO.LOW)
    GPIO.output(LCD_DATA6, GPIO.LOW)
    GPIO.output(LCD_DATA7, GPIO.LOW)
    if bits & 0x10 == 0x10:
    GPIO.output(LCD_DATA4, GPIO.HIGH)
    if bits & 0x20 == 0x20:
    GPIO.output(LCD_DATA5, GPIO.HIGH)
    if bits & 0x40 == 0x40:
    GPIO.output(LCD_DATA6, GPIO.HIGH)
    if bits & 0x80 == 0x80:
    GPIO.output(LCD_DATA7, GPIO.HIGH)
    time.sleep(E_DELAY)
    GPIO.output(LCD_E, GPIO.HIGH)
    time.sleep(E_PULSE)
    GPIO.output(LCD_E, GPIO.LOW)
    time.sleep(E_DELAY)
    GPIO.output(LCD_DATA4, GPIO.LOW)
    GPIO.output(LCD_DATA5, GPIO.LOW)
    GPIO.output(LCD_DATA6, GPIO.LOW)
    GPIO.output(LCD_DATA7, GPIO.LOW)
    if bits&0x01==0x01:
    GPIO.output(LCD_DATA4, GPIO.HIGH)
    if bits&0x02==0x02:
    GPIO.output(LCD_DATA5, GPIO.HIGH)
    if bits&0x04==0x04:
    GPIO.output(LCD_DATA6, GPIO.HIGH)
    if bits&0x08==0x08:
    GPIO.output(LCD_DATA7, GPIO.HIGH)
    time.sleep(E_DELAY)
    GPIO.output(LCD_E, GPIO.HIGH)
    time.sleep(E_PULSE)
    GPIO.output(LCD_E, GPIO.LOW)
    time.sleep(E_DELAY)

    def display_init():
    lcd_send_byte(0x33, LCD_CMD)
    lcd_send_byte(0x32, LCD_CMD)
    lcd_send_byte(0x28, LCD_CMD)
    lcd_send_byte(0x0C, LCD_CMD)
    lcd_send_byte(0x06, LCD_CMD)
    lcd_send_byte(0x01, LCD_CMD)

    def lcd_message(message):
    message = message.ljust(LCD_WIDTH," ")
    for i in range(LCD_WIDTH):
    lcd_send_byte(ord(message[i]),LCD_CHR)

    while __name__ == '__main__':
    # initialisieren
    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    GPIO.setup(LCD_E, GPIO.OUT)
    GPIO.setup(LCD_RS, GPIO.OUT)
    GPIO.setup(LCD_DATA4, GPIO.OUT)
    GPIO.setup(LCD_DATA5, GPIO.OUT)
    GPIO.setup(LCD_DATA6, GPIO.OUT)
    GPIO.setup(LCD_DATA7, GPIO.OUT)

    display_init()


    lcd_send_byte(LCD_LINE_1, LCD_CMD)
    lcd_message('{0:0.1f}*C {1:0.1f}%'.format(temperature, humidity))
    lcd_send_byte(LCD_LINE_2, LCD_CMD)
    lcd_message('{:%d.%m.%Y %H:%M}'.format(datetime.datetime.now()))

    time.sleep(5)


    [/php]

    erstmal vorweg dies ist mein Code, das wichtige steht jedoch ganz am Ende.
    Ich bin relativ frisch in Python und im Pi möchte aber gerne bzw habe schon gesteckt auf einem Breadboard:

    DH11 Temp & Humidity Messen
    LCD Display 16x2 + Poti für Helligkeit
    Alles per Cobbler Connector aufm Board

    Läuft alles mit diesem Code sobald er bootet. Habe dies in rc.loc irgendwas rein geschrieben ^^
    Leider aktualisiert er nur die Zeit aber nicht die Temperatur und Humidity die bleiben gleich.

    Was muss ich in die Schleife mit rein nehmen damit es klappt?

    Viele Grüße
    Zakuma

    Einmal editiert, zuletzt von Zakuma (6. April 2017 um 22:33)

  • Hallo,

    leider bekomme ich es weder über die direkte Pi Oberfläche aus dem Python 3 noch von Windows so herauskopiert das die Einrückungen mit ins Forum übertragen werden.
    Werder PHP noch die Code Funktion machen das mit.
    Gibt es eine weitere Möglichkeit?

  • Zeile 79 macht nicht viel Sinn. Aus "__name__ == '__main__':" kannst du keine while Schleife machen. Das ist normalerweise eine Abfrage "if __name__ == "__main__":" und dient dazu dass dieser Teil nur dann ausgeführt wird wenn das Script direkt ausgeführt wird, nicht aber wenn es importiert wird.

    Du musst Zeile 79 also dahingehend ändern sodass es tatsächlich eine Schleife wird, typischerweise "while True:"


    PS: Gewöhn dir lieber jetzt schon an Einheitliche Einrückungen zu verwenden, nicht mal 8 und mal 2 Leerzeichen pro Einrückung, oder wie in Deinem Fall ein TAB und die anderen Zeilen 2 Leerzeichen.
    Normalerweise nutzt man pro Einrückung 4 Leerzeichen. Man kann das normalerweise im Editor einstellen ob anstelle von TABs, Leerzeichen genutzt werden sollen und dann auch wie viele.

  • Hey,

    danke ich wusste nicht welchen Wert ich für eine While Schleife nehmen soll der Sourcecode ist quasi ein fertiger von eine Raspberry Pi Tutorial ich habe ihn lediglich ergänzt durch die Temp+Datum daher kann ich für die Einrückungen nicht ^^

    Werde ich morgen abändern vielen dank für die äußerst schnelle Hilfe!


  • PS: Gewöhn dir lieber jetzt schon an Einheitliche Einrückungen zu verwenden, nicht mal 8 und mal 2 Leerzeichen pro Einrückung, oder wie in Deinem Fall ein TAB und die anderen Zeilen 2 Leerzeichen.
    Normalerweise nutzt man pro Einrückung 4 Leerzeichen. Man kann das normalerweise im Editor einstellen ob anstelle von TABs, Leerzeichen genutzt werden sollen und dann auch wie viele.

    In Python 2.x werden TABs toleriert, ab Python 3.x sind TABs = "bäh" :lol:

    Es gibt einen Style-Guide für Pythonprogramme, an den sollte man sich weitest gehend halten, um es den Helfern, die sich deinen Code ggf. mal ansehen sollen, nicht zusätzlich schwer zu machen
    ==>Tabs oder Spaces: https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces
    bzw:
    ==> Allgemein: https://www.python.org/dev/peps/pep-0008/

  • Vielen Dank,

    Muss mich noch für ein Ide unter Windows entscheiden,
    Für C++ nutze ich C::B das läuft super aber python kann der wohl nicht ohne weiteres.

    Werde mal den Quellcode neu ein tippen mit den genannten Tips für eine bessere Übersicht :)

    Gesendet von meinem D6603 mit Tapatalk

  • Ich verwende PyCharm, gibt es für Windows und auch Linux.

    Recht gute IDE incl. Debugger (auch remote)..., Projektfähig..., bedingt eine installierten Java-Stack, aber der ist ja schnell installiert... (JRE von Oracle aufspielen und gut)
    Automatisch zusammengefügt:
    .
    .
    .


    Wofür extra eine IDE ? Nimm einfach Notepad++ ;)

    Ja, selbst der vi würde gehen :)

    Aber mit einer IDE hat man einfach einen besseren Code-Überblick, wenn man mit mehr als nur 1,2 Files hantiert und bei Problemen auch mal Debuggen will...

    Ich mach beides: Vor Ort (also auf dem RP) aus Resorcengründen (headless, keine GUI) nehme ich nano/vi, ansonsten PyCharm...

  • Hallo Zakuma,

    die Luftfeuchte und Temperatur wird nur einmal ausgelesen.

    mit den Funktionen
    def GetHumidity():
    return humidity, temperature
    humidity, temperature = GetHumidity()

    sollte es funktionieren.
    Nicht getestet da kein Sensor vorhanden.


    Ergänzungen:


    # DHT Sensor auslesen

    def GetHumidity():

    # Zuordnung der GPIO Pins (ggf. anpassen)
    sensor = Adafruit_DHT.DHT11
    pin = 27
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

    return humidity, temperature

    # Luftfeuchte anzeigen

    display_init()

    humidity, temperature = GetHumidity()

    lcd_send_byte(LCD_LINE_1, LCD_CMD)
    lcd_message('{0:0.1f}*C {1:0.1f}%'.format(temperature, humidity))
    lcd_send_byte(LCD_LINE_2, LCD_CMD)
    lcd_message('{:%d.%m.%Y %H:%M}'.format(datetime.datetime.now()))

    time.sleep(5)

    mfg. Rosty

  • Also ich definiere erst einmal als Funktion mit

    [PHP]
    def GetHumidity():
    return humidity, temperature
    humidity, temperature = GetHumidity()
    [/PHP]

    oder muss ich darein die zuordnung der GPIO Pins rein schreiben? Weil dies hab ich ja schon am Anfang gemacht? Was genau macht der Befehl return?

    /Edit:

    Hab es hin bekommen und verstanden ^^ hätte das glaube gar nicht oben in mein Code schreiben müssen nur die Bibliothek rein und die definition er fragt nun in 2Sekunden Takt ab (schneller ist der Sensor nicht) gibt halt Ganzzahlen aus kann wohl keine Kommastellen der DHT11

    Einmal editiert, zuletzt von Zakuma (7. April 2017 um 21:20)

Jetzt mitmachen!

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