Reihenfolge der Abfrag sicherstellen.

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.
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

Ich bitte um Hilfe.

Es geht um die GPIO Pins des RaspberryPis.

Code: Alles auswählen

import RPi.GPIO as GPIO
from time import sleep

IN = 21
OUT = 23

GPIO.setmode(GPIO.BOARD)
GPIO.setup(OUT, GPIO.OUT)
GPIO.setup(IN, GPIO.IN)

GPIO.output(OUT, True)

try:
    while True: 
        
        if (GPIO.output(OUT) == True) and (GPIO.input(IN) == True):
            (GPIO.output(OUT), False) 
                
        elif (GPIO.output(OUT), == False) and (GPIO.input(IN) == True):
            (GPIO.output(OUT), True)
            
except KeyboardInterrupt:
    pass
GPIO.cleanup()
Es sollte die ganze Zeit die zwei Ifs abgefragt werden. Und zwar ABABAB und nicht AABBABABB
Das wird aber nicht gemacht sonder eigentlich garnichts.
Zuletzt geändert von Jakob am Montag 27. Mai 2013, 18:59, insgesamt 7-mal geändert.
BlackJack

@Jakob: Du solltest als erstes mal das ``try``/``except`` entfernen was verhindert, dass Du irgendeine Fehlermeldung siehst, wenn da etwas im ``try``-Block eine Ausnahme auslöst.
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

Danke für die Rückmeldung.

Naja das war eigentlich so gedacht das wenn ich das Programm mit Strg+C abbreche alle Pins wieder auf standart gesetzs werden.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dann solltest du das blanke ``except`` in ``except KeyboardInterrupt`` aendern, und im Koerper dieses ``except``s dann alles auf Standard setzen.

Endlosschleifen bekommt man mit ``while True`` uebrigens einfacher hin.
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

Ahh, Stimmt das klingt aufjedenfall Sinnvoller.

Wie ist das mit dem ´s´ im körper ( was ist damit gemeint? ) ´except´ gemacht ??
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

Gibt es eigentlich einen Befehl mit dem ich im code an eine Stelle weiter oben springen kann? Sowas ähnliches wie Goto im microcontroller bereich.
BlackJack

@Jakob: Das will man nicht. Wenn man etwas wiederholen möchte, dann gibt es Schleifen.
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

@BlackJack Ok dann steig ich da einfach grad nich durch ^^. Ich würde gerne einmal Abfrage A und darauf Aufgabe A ablaufen lassen und dann Abfrage B und Aufgabe B ablaufenlasse. Und das natürlich endlos. Wie wäre sowas möglich. Was spricht gegen Goto befehle ?
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Code: Alles auswählen

while True:
    if A:
        doA()
    elif B:
        doB()
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

@webspider so hab ichs eigentlich aufgebaut oder ?
BlackJack

@Jakob: Goto führt zu undurchsichtigem Code bei dem man den Programmfluss irgendwann nur noch sehr schwer nachvollziehen kann.

Wenn Dein Code so aufgebaut ist, wo ist dann das Problem was Du denkst mit Goto lösen zu können?
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

@BlackJack

Dann könnt ich sicherstellen das die Reihenfolge immer A B A B A B ist und zB. nicht A BB AA B A
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

ich checks einfach nich :)

wenn ich einen taster betätige soll aufgabe a ausgeführt werden

wenn ich den taster ein zweitesmal betätige soll aufgabe b ausgeführt werden (und nicht aufgabe a)

das problem ist wenn ich den taster gedrückt halte werden beide aufgaben "blinkend" im wechsel ausgeführt was nicht so gut ist.
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

TypeError: function takes exactly 2 arguments (1 given)

also tut mir leid aber heut check ich irgwie garnix was sagt mir den bitte dieser fehler?
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

Danke für alle die sich das mal angeschaut haben.
Bin heut anscheinend nicht ganz auf der Höhe meine Lösung:

Code: Alles auswählen

import RPi.GPIO as GPIO
from time import sleep

IN = 21
OUT = 23

GPIO.setmode(GPIO.BOARD)
GPIO.setup(OUT, GPIO.OUT)
GPIO.setup(IN, GPIO.IN)

GPIO.output(OUT, True)

try:
    while True: 
        if(GPIO.input(IN) == True):
            if(GPIO.output(OUT) == True):
                GPIO.output(OUT, False)
                sleep(0.2)
            else:
                GPIO.output(OUT, True)
                sleep(0.2)
            
except KeyboardInterrupt:
    pass
GPIO.cleanup() 
Zuletzt geändert von Jakob am Montag 27. Mai 2013, 19:42, insgesamt 1-mal geändert.
BlackJack

@Jakob: Jetzt könntest Du noch die unnötigen Klammern um die Bedingungen bei den ``if``\s weglassen und aufhören explizit mit den literalen Wahrheitswerten, also hier mit `True` zu vergleichen.

Edit: Und das innere ``if``/``else`` kann man auch noch los werden:

Code: Alles auswählen

import RPi.GPIO as GPIO
from time import sleep

IN = 21
OUT = 23


def main():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(OUT, GPIO.OUT)
    GPIO.setup(IN, GPIO.IN)
    try:
        GPIO.output(OUT, True)
        while True: 
            if GPIO.input(IN):
                GPIO.output(OUT, not GPIO.input(OUT))
                sleep(0.2)
    except KeyboardInterrupt:
        pass
    finally:
        GPIO.cleanup()


if __name__ == '__main__':
    main()
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

wow klass DANKE :P
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

aber was ist wenn der GPIO OUT pin auf false steht??
und was bedeuten die letzten beiden zeilen??
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

also wenn ich das abfrage frage ich ja schon ob es True ist doer ? das meintest du mit den vielen True?
Jakob
User
Beiträge: 15
Registriert: Montag 27. Mai 2013, 16:34

achso er setzt es immer auf das auf das er nicht ist, oder?
Antworten