Letzte While-Schleife wird nicht abgearbeitet
Hallo zusammen.
Ich habe hier ein Quellcode der mir etwas graue Haare beschert.
Die erste While-Schleife funktioniert anstandslos, jedoch die zweite wird nicht abgearbeitet, weshalb auch immer:
Teste ich nur die zweite While-Schleife:
...fährt mir der Raspberry Pi sofort herunter, obwohl die Taster-Zeit-Abfrage funktioniert!
Und weshalb funktionieren nicht beide Schleifen nacheinander in einem Skript?
Kann jemand den eingeschlichenen Fehler entdecken bzw. mich auf den richtigen Lösungsansatz führen?
Vielen Dank.
Ich habe hier ein Quellcode der mir etwas graue Haare beschert.
Die erste While-Schleife funktioniert anstandslos, jedoch die zweite wird nicht abgearbeitet, weshalb auch immer:
import RPi.GPIO as GPIO
import time
P_BUTTON_ALARM = 12
P_BUTTON_PI = 13
P_LED_ALARM_AUS = 19
P_LED_ALARM_AN = 20
P_LED_PI_AN = 21
ZEIT=3
def setup():
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(P_BUTTON_ALARM, GPIO.IN, GPIO.PUD_UP)
GPIO.setup(P_BUTTON_PI, GPIO.IN, GPIO.PUD_UP)
GPIO.setup(P_LED_ALARM_AN, GPIO.OUT)
GPIO.setup(P_LED_ALARM_AUS, GPIO.OUT)
GPIO.setup(P_LED_PI_AN, GPIO.OUT)
setup()
isLedOn = False
isButtonReady = True
while True:
if isButtonReady and GPIO.input(P_BUTTON_ALARM) == GPIO.LOW:
isButtonReady = False
if not isLedOn:
isLedOn = True
time.sleep(5.00)
import os
os.system("sudo service motion start")
time.sleep(1.00)
GPIO.output(P_LED_ALARM_AN, GPIO.HIGH)
GPIO.output(P_LED_ALARM_AUS, GPIO.LOW)
else:
isLedOn = False
import os
os.system("sudo service motion stop")
time.sleep(1.00)
GPIO.output(P_LED_ALARM_AN, GPIO.LOW)
GPIO.output(P_LED_ALARM_AUS, GPIO.HIGH)
if GPIO.input(P_BUTTON_ALARM) == GPIO.HIGH:
isButtonReady = True
time.sleep(0.01)
while True:
GPIO.output(P_LED_PI_AN, GPIO.HIGH)
time.sleep(0.2)
if GPIO.input(P_BUTTON_PI) == False:
print "TASTER UNBETAETIGT"
pressed_time=time.time()
while GPIO.input(P_BUTTON_PI) == False:
time.sleep(0.2)
pressed_time=time.time()-pressed_time
print "TASTER BETAETIGT %d" % pressed_time
if pressed_time<ZEIT:
print "REBOOT"
import os
os.system("sudo reboot")
else:
print "SHUTDOWN"
import os
os.system("sudo shutdown -h now")
GPIO.cleanup()
Teste ich nur die zweite While-Schleife:
import RPi.GPIO as GPIO
import time
P_BUTTON_PI = 13
P_LED_PI_AN = 21
ZEIT=3
def setup():
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(P_BUTTON_PI, GPIO.IN, GPIO.PUD_UP)
GPIO.setup(P_LED_PI_AN, GPIO.OUT)
setup()
isLedOn = False
isButtonReady = True
while True:
GPIO.output(P_LED_PI_AN, GPIO.HIGH)
time.sleep(0.2)
if GPIO.input(P_BUTTON_PI) == False:
print "TASTER UNBETAETIGT"
pressed_time=time.time()
while GPIO.input(P_BUTTON_PI) == False:
time.sleep(0.2)
pressed_time=time.time()-pressed_time
print "TASTER BETAETIGT %d" % pressed_time
if pressed_time<ZEIT:
print "REBOOT"
import os
os.system("sudo reboot")
else:
print "SHUTDOWN"
import os
os.system("sudo shutdown -h now")
GPIO.cleanup()
...fährt mir der Raspberry Pi sofort herunter, obwohl die Taster-Zeit-Abfrage funktioniert!
Und weshalb funktionieren nicht beide Schleifen nacheinander in einem Skript?
Kann jemand den eingeschlichenen Fehler entdecken bzw. mich auf den richtigen Lösungsansatz führen?
Vielen Dank.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 393889
Url: https://administrator.de/forum/letzte-while-schleife-wird-nicht-abgearbeitet-393889.html
Ausgedruckt am: 22.04.2025 um 01:04 Uhr
14 Kommentare
Neuester Kommentar

Moin.
Gruß A.
Und weshalb funktionieren nicht beide Schleifen nacheinander in einem Skript?
Weil die erste Schleife ja nie verlassen wird, kann der Code nie deine zweite Schleife erreichen, deshalb! Code wird immer noch zeilenweise abgearbeitet, d.h. wenn der Code in die erste Schleife einsteigt und sich in dieser keine Abbruchbedingung befindet wird Python diese Schleife natürlich endlos fortführen und deine zweite Schleife wird so also niemals erreicht, klar? Also entweder aus der Schleife eine Funktion machen und diese aus der ersten heraus aufrufen oder den Code der zweite Schleife mit in die erste integrieren.Gruß A.
Moin,
Wenn die erste Schleife keine Abbruchbedingung hat, kommt das Programm auch nie un die zweite Schleife.
Du mußt die Schleifen etweder zusammenlegen oder Threading benutzen.
lks
Wenn die erste Schleife keine Abbruchbedingung hat, kommt das Programm auch nie un die zweite Schleife.
Du mußt die Schleifen etweder zusammenlegen oder Threading benutzen.
lks
Moin,
die GPIO-Lib sollte doch Callbacks unterstützen. D.h. eine Funktion die aufgerufen wird, wenn der Taster betätigt wird, egal wo sich dein Code gerade befindet.
Jop... 5 Sek auf Google... https://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry ...
lg,
Slainte
die GPIO-Lib sollte doch Callbacks unterstützen. D.h. eine Funktion die aufgerufen wird, wenn der Taster betätigt wird, egal wo sich dein Code gerade befindet.
Jop... 5 Sek auf Google... https://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry ...
lg,
Slainte
Was auch generell besser wäre - ehrlich gesagt hatte ich oben nich mal geguckt was in den Schleifen selbst gemacht wird sondern nur 2x "While (true)" gesehen, damit is dann klar warum die zweite nich erreicht wird... Dies kann man eben nur per Thread parallel laufen lassen...
Wenn ich aber im Code noch Taster o.ä. habe die idR. nen Event/Interrupt/whatever auslösen ist es natürlich generell besser dieses auch zu beachten. Denn natürlich kann man sagen "frage alle 5 ms nach wie der Status des Buttons ist" - kostet aber rechenzeit und je nach Einstellung würde man auch Events verpassen (derjenige war extrem schnell und hat nur für 2ms gedrückt...).
Wenn ich aber im Code noch Taster o.ä. habe die idR. nen Event/Interrupt/whatever auslösen ist es natürlich generell besser dieses auch zu beachten. Denn natürlich kann man sagen "frage alle 5 ms nach wie der Status des Buttons ist" - kostet aber rechenzeit und je nach Einstellung würde man auch Events verpassen (derjenige war extrem schnell und hat nur für 2ms gedrückt...).
Zitat von @maretz:
Was auch generell besser wäre - ehrlich gesagt hatte ich oben nich mal geguckt was in den Schleifen selbst gemacht wird sondern nur 2x "While (true)" gesehen, damit is dann klar warum die zweite nich erreicht wird... Dies kann man eben nur per Thread parallel laufen lassen...
Was auch generell besser wäre - ehrlich gesagt hatte ich oben nich mal geguckt was in den Schleifen selbst gemacht wird sondern nur 2x "While (true)" gesehen, damit is dann klar warum die zweite nich erreicht wird... Dies kann man eben nur per Thread parallel laufen lassen...
Ging mir genauso, deswegen hatte ich Threads vorgeschlagen. ob Threads oder eine "große" Schleife in diesem Fall das richtige sind, steht auf einem anderen Blatt. Interrupts mit passenden Service-Routinen sind zwar prinzipiell für eine Tastenabfrage geschickter, aber nicht jeder Programmierer kommt damit zurecht.
lks
Google anwerfen - und Interrupts verwenden .)
z.B. https://raspberrypi.stackexchange.com/questions/63512/how-can-i-detect-h ...
z.B. https://raspberrypi.stackexchange.com/questions/63512/how-can-i-detect-h ...