Probleme lorsque je taper la condition d'arrèt après 10 second
Bonjour mes amis,
Je suis débutant en python et je fais des essais avec de petits programmes. Dans celui-ci j'ai utilisé un circuit raspberry avec deux LEDs.
Les résultats attendus sont:
- lorsque le programme fonctionne, il attend jusqu'à ce que l'utilisateur tape le caractère "S".
- si l'utilisateur taper ce caractère la première LED s'allume, et il attend jusqu'à ce que l'utilisateur tape le caractère "G".
- si l'utilisateur tape ce caractère, alors la première LED s'éteint et le deuxième LED s'allume, et le programme attend 10 secondes.
- si l'utilisateur tape dans les 10 secondes le caractère "F" alors la deuxième LED reste allumée, sinon si l'utilisateur tape un caractère différent de "F", ou le temps écoulé (10 secondes dépassées), alors la deuxième LED s'éteint et le programme s'arrête.
J'ai essayé avec ce programme:
Ce programme fonctionne, sauf à la dernière étape. Après avoir tapé le caractère "G" ou quand le temps dépasse 10 secondes, le programme ne s'arrête pas (la diode reste allumée). Il s'arrête seulement si je tape un caractère différent de "F".
Je bloque ici. J'ai beaucoup essayé, mais je ne trouve pas de solution. Je travaille avec IDLE 2 (python 2) sous raspbian (raspberry pi model 3)
Merci d'avance.
Je suis débutant en python et je fais des essais avec de petits programmes. Dans celui-ci j'ai utilisé un circuit raspberry avec deux LEDs.
Les résultats attendus sont:
- lorsque le programme fonctionne, il attend jusqu'à ce que l'utilisateur tape le caractère "S".
- si l'utilisateur taper ce caractère la première LED s'allume, et il attend jusqu'à ce que l'utilisateur tape le caractère "G".
- si l'utilisateur tape ce caractère, alors la première LED s'éteint et le deuxième LED s'allume, et le programme attend 10 secondes.
- si l'utilisateur tape dans les 10 secondes le caractère "F" alors la deuxième LED reste allumée, sinon si l'utilisateur tape un caractère différent de "F", ou le temps écoulé (10 secondes dépassées), alors la deuxième LED s'éteint et le programme s'arrête.
J'ai essayé avec ce programme:
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
def SetPins(numb):
GPIO.setup(numb,GPIO.OUT)
def SetHigh(numb):
GPIO.output(numb,True)
def SetLow(numb):
GPIO.output(numb,False)
def PutChar(Ch):
b=raw_input("enter "+Ch+" char ")
while (b != Ch):
b=raw_input("enter "+Ch+" char ")
SetPins(12)
SetPins(11)
SetLow(11)
SetLow(12)
PutChar('s')
SetHigh(12)
PutChar('g')
now=time.time()
SetLow(12)
SetHigh(11)
while (1):
b=raw_input("enter f char ")
if b == 'f':
SetHigh(11)
break
else:
time2=time.time() - now
if time2 >= 10 or b != 'f':
SetLow(11)
break
Ce programme fonctionne, sauf à la dernière étape. Après avoir tapé le caractère "G" ou quand le temps dépasse 10 secondes, le programme ne s'arrête pas (la diode reste allumée). Il s'arrête seulement si je tape un caractère différent de "F".
Je bloque ici. J'ai beaucoup essayé, mais je ne trouve pas de solution. Je travaille avec IDLE 2 (python 2) sous raspbian (raspberry pi model 3)
Merci d'avance.
1 réponse
-
Bonjour,
Dans ton cas le plus simple est de créer un booléen qui va indiquer à la fin du programme si la diode doit rester allumée ou pas.
Dans l'esprit la boucle serait par exemple dans cet esprit si l'on continue dans ta logique.
stay_high = True while True: if time.time() - now > 10: break b = raw_input("enter f char") stay_high = (b == 'f') if stay_high: break if not stay_high: SetLow(l1)
Note qu'en plus dans ton code tu n'as pas besoin de refaire desSetHigh(l1)
, carl1
est déjà allumée avant de rentrer dans lewhile
.
Le problème c'est queraw_input
est a priori bloquant ce qui signifie que tu ne parviendra pas de cette manière à faire expirer ton timer. De plus tu noteras que pendant les 10s imparties, 100% du CPU est utilisé à faire des tours de bouclewhile
. Ce n'est donc pas la bonne manière de faire.
Pour implémenter correctement ton programme, il faut partir sur de la programmation asynchrone, par exemple en utilisantselect
.
https://stackoverflow.com/questions/3471461/raw-input-and-timeout
Bonne chance