Ligne 244 : |
Ligne 244 : |
| Vous pouvez télécharger le fichier '''debounce.py''' et le placer directement dans le répertoire {{fname|/flash/lib/}} de votre WiPy. | | Vous pouvez télécharger le fichier '''debounce.py''' et le placer directement dans le répertoire {{fname|/flash/lib/}} de votre WiPy. |
| | | |
− | {{traduction}} | + | {{download-box|Téléchargez debounce.py|http://df.mchobby.be/wipy/debounce.py}} |
| | | |
| [[Fichier:Hack-wipy-button-debounce.jpg|800px]] | | [[Fichier:Hack-wipy-button-debounce.jpg|800px]] |
| + | |
| + | Voici comment exploiter la classe {{fname|PullUpButton}}, cet exemple attends que le bouton soit presser 5x pour sortir de la boucle de comptage. |
| | | |
| <syntaxhighlight lang="python"> | | <syntaxhighlight lang="python"> |
| from debounce import PullUpButton | | from debounce import PullUpButton |
| import time | | import time |
| + | |
| btn = PullUpButton( 'GP8' ) | | btn = PullUpButton( 'GP8' ) |
| | | |
| counter=0 | | counter=0 |
| while counter < 5: | | while counter < 5: |
− | print( 'Pressez le boutton svp' ) | + | print( 'presser le bouton svp' ) |
| while not btn.is_pressed(): | | while not btn.is_pressed(): |
| time.sleep_ms( 100 ) | | time.sleep_ms( 100 ) |
− | counter = counter+1 | + | counter=counter+1 |
| print( 'counter = %i' % counter ) | | print( 'counter = %i' % counter ) |
− | print( 'voila, c est finit' )
| + | </syntaxhighlight> |
| + | |
| + | ce qui produit le résultat suivant après '''exactement''' 5 pressions physiques sur le bouton... les rebonds de contact ne viennent plus nous importuner. |
| + | |
| + | <nowiki>presser le bouton svp |
| + | counter = 1 |
| + | presser le bouton svp |
| + | counter = 2 |
| + | presser le bouton svp |
| + | counter = 3 |
| + | presser le bouton svp |
| + | counter = 4 |
| + | presser le bouton svp |
| + | counter = 5</nowiki> |
| + | |
| + | ==== Classe PullUpButton ==== |
| + | Pour les plus curieux, voici l'implémentation de la classe {{fname|PullUpButton}} que vous trouverez dans le fichier {{fname|debounce.py}}. |
| + | |
| + | Vous pouvez clairement y voir une seconde relecture de l'entrée après un délais de 10 millisecondes. C'est là qu'intervient le déparasitage logicielle de l'entrée. |
| + | |
| + | <syntaxhighlight lang="python"> |
| + | from machine import Pin |
| + | import time |
| + | |
| + | class PullUpButton: |
| + | """ Classe pour gérer un bouton pull-up sur une broche X. |
| + | Détecte lorsque la broche passe à 0 """ |
| + | p = None # Pin object |
| + | state = None # Last known state |
| + | |
| + | def __init__( self, button_pin ): |
| + | self.p = Pin( button_pin, Pin.IN, pull=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) |
| + | time.sleep_ms( 10 ) |
| + | val2 = self.p.value() |
| + | if val == val2: # valeur stable :) |
| + | self.state = val |
| + | result = (val == 0) # Is pressed |
| + | return result |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
| {{HACK-WIPY-TRAILER}} | | {{HACK-WIPY-TRAILER}} |