Je surveille un bouton poussoir avec un microcontrôleur où j'essaye de m'occuper de quatre choses ensemble:
- 50 ms de rebond lors du démarrage par poussée et 25 ms après la libération du push
- identifier un appui court, défini comme lorsque le bouton est relâché dans < 1 seconde
- identifier un appui long, défini comme quand 1 seconde s'écoule depuis le début du bouton poussoir
- dormir autant que possible sans rien faire d'autre
Voici un court pseudocode de ce que j'ai implémenté jusqu'à présent. Je pense que cela couvre tous ces cas.
Voyez-vous des améliorations possibles ou des problèmes potentiels? (Par exemple, je suis intéressé par tous les cas subtils qui pourraient être des angles morts pour mon approche.)
Pseudocode:
Boucle principale {Sleep} Falling-Interrupt {Disable Falling-Interrupt Enable 50-millisecond-Debounce-Timer-Interrupt} 50-millisecond-Debounce-Timer-Interrupt {si l'état PushButton est toujours LOW {Enable Rising-Interrupt Enable 1000-millisecond-Hold-Timer-Interrupt}} 1000 -millisecond-Hold-Timer-Interrupt {Register as Pushbutton long-hold} Rising-Interrupt {if (Time since Falling-Interrupt < 1000 millisecond) {Register as Button Short-press} Désactiver 1000-millisecond-Hold-Timer-Interrupt Enable 25-millisecond-Debounce-Timer-Interrupt} 25-millisecond-Debounce-Timer-Interrupt {Enable Falling-Interrupt}