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

sekmani52 Messages postés 5 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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.

1 réponse

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    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