Probleme lorsque je taper la condition d'arrèt après 10 second

Fermé
sekmani52 Messages postés 4 Date d'inscription mercredi 8 juin 2016 Statut Membre Dernière intervention 5 juillet 2017 - Modifié le 28 août 2017 à 16:10
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 28 août 2017 à 16:36
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:

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.
A voir également:

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié le 28 août 2017 à 16:38
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 des
SetHigh(l1)
, car
l1
est déjà allumée avant de rentrer dans le
while
.

Le problème c'est que
raw_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 boucle
while
. 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 utilisant
select
.
https://stackoverflow.com/questions/3471461/raw-input-and-timeout

Bonne chance
0