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 == |