brauche hilfe bei einen script

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
SniffySplash769
User
Beiträge: 2
Registriert: Mittwoch 29. Januar 2020, 05:31

mit deisen script versuche ich gerade eine chinesische qlocktwo zu programmieren, doch ich habe einen syntax Fehler den ich gerade nicht finde.

import RPi.GPIO as GPIO
from datetime import datetime
import time
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

GPIO.setup(2, GPIO.OUT)
GPIO.setup(3, GPIO.OUT)
GPIO.setup(4, GPIO.OUT)
GPIO.setup(5, GPIO.OUT)
GPIO.setup(6, GPIO.OUT)
GPIO.setup(7, GPIO.OUT)
GPIO.setup(8, GPIO.OUT)
GPIO.setup(9, GPIO.OUT)
GPIO.setup(10, GPIO.OUT)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(12, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(16, GPIO.OUT)
GPIO.setup(17, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)
GPIO.setup(19, GPIO.OUT)

GPIO.output(2, GPIO.HIGH)
GPIO.output(3, GPIO.HIGH)
GPIO.output(4, GPIO.HIGH)
GPIO.output(5, GPIO.HIGH)
GPIO.output(6, GPIO.HIGH)
GPIO.output(7, GPIO.HIGH)
GPIO.output(8, GPIO.HIGH)
GPIO.output(9, GPIO.HIGH)
GPIO.output(10, GPIO.HIGH)
GPIO.output(11, GPIO.HIGH)
GPIO.output(12, GPIO.HIGH)
GPIO.output(13, GPIO.HIGH)
GPIO.output(16, GPIO.HIGH)
GPIO.output(17, GPIO.HIGH)
GPIO.output(18, GPIO.HIGH)
GPIO.output(19, GPIO.HIGH)


while True:
hour = time.localtime().tm_hour
minute = time.localtime().tm_min - 50
#minute = time.strftime("%M")
#gesamtzeit = (hour, minute)

# if (minute == 1):
# GPIO.output(2, GPIO.LOW)
#
# else :
# if (minute == 2):
# GPIO.output(2, GPIO.HIGH)
# GPIO.output(3, GPIO.LOW)
# else :
#
# if (minute == 3):
# GPIO.output(3, GPIO.HIGH)
# GPIO.output(4, GPIO.LOW)
#
# else :
# GPIO.output(4, GPIO.HIGH)
#
# if (minute == 4):
# GPIO.output(5, GPIO.LOW)
# else :
#
if (minute == 5 or minute== 25 or minute == 25 or minute == 55):
GPIO.output(6, GPIO.LOW)

else :

if(minute == 15):
GPIO.output(17, GPIO.LOW)
GPIO.output(18, GPIO.LOW)

else :
GPIO.output(17, GPIO.HIGH)
GPIO.output(18, GPIO.HIGH)

if (minute == 45):
GPIO.output(17, GPIO.LOW)
GPIO.output(18, GPIO.LOW)

else :
GPIO.output(17, GPIO.HIGH)
GPIO.output(18, GPIO.HIGH)

if (minute == 30):
GPIO.output(19, GPIO.LOW)
else :
GPIO.output(19, GPIO.HIGH)


if (minute > 39 or minute < 50 and minute != 45):
GPIO.output(20, GPIO.LOW)

else :
GPIO.output(20, GPIO.HIGH)

if (minute == 11):
GPIO.output(11, GPIO.LOW)
GPIO.output(2, GPIO.LOW)

else :
if (minute == 12):
GPIO.output(11, GPIO.LOW)
GPIO.output(3, GPIO.LOW)

else :
if (minute == 13):
GPIO.output(11, GPIO.HIGH)
GPIO.output(4, GPIO.HIGH)

else:
if (minute == 14):
GPIO.output(11, GPIO.LOW)
GPIO.output(5, GPIO.LOW)

else :
if (minute == 15):
GPIO.output(11, GPIO.LOW)
GPIO.output(6, GPIO.LOW)

else :
if (minute == 16):
GPIO.output(11, GPIO.LOW)
GPIO.output(7, GPIO.LOW)

else :
if (minute == 17):
GPIO.output(11, GPIO.LOW)
GPIO.output(8, GPIO.LOW)

else :
if (minute == 18):
GPIO.output(11, GPIO.LOW)
GPIO.output(9, GPIO.LOW)

else :
GPIO.output(2, GPIO.HIGH)
GPIO.output(3, GPIO.HIGH)
GPIO.output(4, GPIO.HIGH)
GPIO.output(5, GPIO.HIGH)
GPIO.output(6, GPIO.HIGH)
GPIO.output(7, GPIO.HIGH)
GPIO.output(8, GPIO.HIGH)
GPIO.output(9, GPIO.HIGH)
GPIO.output(10, GPIO.HIGH)
GPIO.output(11, GPIO.HIGH)
GPIO.output(12, GPIO.HIGH)
GPIO.output(13, GPIO.HIGH)
GPIO.output(16, GPIO.HIGH)
GPIO.output(17, GPIO.HIGH)
GPIO.output(18, GPIO.HIGH)
GPIO.output(19, GPIO.HIGH)


ich wuerde mich auf eine Antwort freuen :wink:
Vielen Dank vorraus.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte den Code in Code Tags packen damit er leserlich ist. Und natürlich brauchen wir auch den Fehler. Vollständig.
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SniffySplash769: Führe es einfach mal aus, dann verrät Dir der Compiler *wo* der Fehler ist:

Code: Alles auswählen

$ python3 ./forum7.py 
  File "./forum7.py", line 91
    if (minute == 30):
                     ^
IndentationError: unindent does not match any outer indentation level
Zeile 91. Die Einrückung passt ganz offensichtlich nicht.

Um die Bedingungen bei ``if`` gehören übrigens keine überflüssigen Klammern. Und zwischen ``else`` und dem ``:`` kein Leerzeichen. Zudem kennt Python ``elif`` mit dem sich hier wohl einiges an Einrückebenen sparen lässt, womit man vielleicht auch eine Chance hat das auf eine sinnvolle maximale Zeilenlänge zu begrenzen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Warnungen sind dazu da, dass man sie behebt, nicht dass man sie ignoriert. Dazu muß man aber auch verläßlich GPIO.cleanup aufrufen, z.B. in einem finally-Block.
Zweimal localtime aufzurufen, um einmal die Minuten und einmal die Stunden abzufragen, ist falsch, da die beiden Zeiten dann nicht zusammen gehören.
Um die Bedingung von if gehört keine Klammern.
Es gibt so etwas wie elif, damit man keine achtzehn! Einrückebenen braucht. Eingerückt wird überigens immer mit 4 Leerzeichen pro Ebene, bei Dir kommst Du ungefähr bei Minute 30 mit der Einrückung total durcheinander. Bei Minute 11 dann wieder. Wie es genau aussehen müßte kann ich nicht sagen, weil ich ja nicht weiß, was Du machen willst.

Welche GPIOs werden denn bei welcher Minute geschaltet? Fass das mal in einer Tabelle zusammen. Dann kannst Du diese Tabelle benutzen um alle if-Abfragen zu ersetzen.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Für diese lange Initialisierung oben bietet sich ja eine Schleife an.

Code: Alles auswählen

    for gpio_port in range(2, 14):
        GPIO.setup(gpio_port, GPIO.OUT)
        GPIO.output(gpio_port, GPIO.HIGH)
    for gpio_port in range(16, 20):
        GPIO.setup(gpio_port, GPIO.OUT)
        GPIO.output(gpio_port, GPIO.HIGH)
Man kann das auch kombinieren.

Code: Alles auswählen

    import itertools
    for gpio_port in itertools.chain(range(2, 14), range(16, 20)):
        GPIO.setup(gpio_port, GPIO.OUT)
        GPIO.output(gpio_port, GPIO.HIGH)
Alternativ baust du dir einmalig eine Liste aller Ports auf und iterierst dann darüber.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@/me: man kann auch ausnutzen, dass setup mit Listen klar kommt und den Initialwert setzen kann:

Code: Alles auswählen

gpio_ports = list(range(2,14)) + list(range(16,20))
GPIO.setup(gpio_ports, GPIO.OUT, initial=GPIO.HIGH)
Antworten