Modifications

Sauter à la navigation Sauter à la recherche
3 154 octets ajoutés ,  28 décembre 2015 à 18:50
Ligne 172 : Ligne 172 :     
Sans cette diode, c'est le transistor qui devrait prendre en charge cet effet transitoire... et généralement, le transistor n'apprécie pas du tout le job! Sans une diode anti-retour (aussi dite "en roue libre"), votre transistor rendrait rapidement l'âme.
 
Sans cette diode, c'est le transistor qui devrait prendre en charge cet effet transitoire... et généralement, le transistor n'apprécie pas du tout le job! Sans une diode anti-retour (aussi dite "en roue libre"), votre transistor rendrait rapidement l'âme.
 +
 +
=== Classe PullUpButton ===
 +
Voici une petite classe dont le but est de détecter UNE SEULE FOIS la pression d'un bouton.
 +
 +
La méthode {{fname|is_pressed()}} permet de capturer la pression d'un bouton sur une entrée, et retourne True lorsque l'entrée passe au niveau bas (lorsque le bouton est pressé).
 +
 +
<nowiki>""" Classe pour gérer un bouton pull-up sur une broche X.
 +
    Détecte lorsque la broche passe à 0 """
 +
class PullUpButton:
 +
    p = None # Pin object
 +
    state = None # Last known state
 +
 +
    def __init__( self, button_pin ):
 +
        self.p = pyb.Pin( button_pin, pyb.Pin.IN, pull=pyb.Pin.PULL_UP )
 +
        self.state = self.p.value()
 +
   
 +
    def is_pressed(self):
 +
        """ vérifie si le bouton est pressé / détecte le changement
 +
    d'état. Ne sera signalé qu'une seule fois! """
 +
        val = self.p.value()
 +
        result = False
 +
        if val != self.state:
 +
            # relecture dans 10 ms (deboucing)
 +
            pyb.delay( 10 )
 +
            val2 = self.p.value()
 +
            if val == val2: # valeur stable :)
 +
                self.state = val
 +
                result = (val == 0) # Is pressed
 +
        return result</nowiki>
 +
 +
La détection de la pression se fait comme suit:
 +
 +
<nowiki>b = PullUpButton( pyb.Pin.board.X5 )
 +
while True:
 +
    if b.is_pressed():
 +
        print('le bouton a été enfoncé')</nowiki>
 +
 +
Vous pouvez remarquer que le message "le bouton a été enfoncé" n'apparaît qu'une seule fois lorsque vous pressez le bouton.
 +
 +
{{underline|Limite de cette implémentation:}}<br />
 +
Si votre programme fait beaucoup de traitement et que les appels sont trop occasionnel ALORS l'utilisateur pourrait presser sur le bouton entre deux appels à {{fname|is_pressed()}} et dans ce cas, l'action n'est pas détectée.
    
=== Réaliser un temporisateur ===
 
=== Réaliser un temporisateur ===
Ligne 181 : Ligne 222 :     
Comme vous pouvez le constater sur le montage ci-dessus, le bouton ramène la broche X5 à la masse lorsque celui-ci est pressé.
 
Comme vous pouvez le constater sur le montage ci-dessus, le bouton ramène la broche X5 à la masse lorsque celui-ci est pressé.
 +
 +
<nowiki># Contrôle d'un relais branché sur le X8
 +
from pyb import delay
 +
 +
# Relais
 +
RELAY_PIN = pyb.Pin.board.X8
 +
relais = pyb.Pin( RELAY_PIN, pyb.Pin.OUT_PP )
 +
relais.low()
 +
 +
""" Classe pour gérer un bouton pull-up sur une broche X.
 +
    Détecte lorsque la broche passe à 0 """
 +
class PullUpButton:
 +
    p = None # Pin object
 +
    state = None # Last known state
 +
 +
    def __init__( self, button_pin ):
 +
        self.p = pyb.Pin( button_pin, pyb.Pin.IN, pull=pyb.Pin.PULL_UP )
 +
        self.state = self.p.value()
 +
   
 +
    def is_pressed(self):
 +
        """ vérifie si le bouton est pressé / détecte le changement
 +
    d'état. Ne sera signalé qu'une seule fois! """
 +
        val = self.p.value()
 +
        result = False
 +
        if val != self.state:
 +
            # relecture dans 10 ms (deboucing)
 +
            pyb.delay( 10 )
 +
            val2 = self.p.value()
 +
            if val == val2: # valeur stable :)
 +
                self.state = val
 +
                result = (val == 0) # Is pressed
 +
        return result
 +
 +
# Bouton
 +
BTN_PIN = pyb.Pin.board.X5
 +
b = PullUpButton( BTN_PIN )
 +
 +
# Temps d'activation
 +
ACTIVE_TIME_MS = 10000
 +
 +
t_on = 0 # Temps d activation restant
 +
while True:
 +
    if b.is_pressed():
 +
        t_on = ACTIVE_TIME_MS
 +
   
 +
    if t_on > 0:
 +
        relais.high()
 +
    else:
 +
        relais.low()
 +
       
 +
    t_on = t_on - 50
 +
    if t_on <= 0:
 +
        t_on = 0
 +
   
 +
    delay( 50 )
 +
</nowiki>
    
== Plus, plus et encore plus ==
 
== Plus, plus et encore plus ==
29 836

modifications

Menu de navigation