Boutons poussoirs recevant trop d'événements

12

J'écris un lecteur mp3 qui écrit des informations sur un écran LCD, je voudrais le convertir en utilisant le clavier pour utiliser des boutons poussoirs mais je reçois constamment trop de touches. J'ai essayé de tirer vers le haut et le front descendant / montant, mais j'obtiens toujours le même résultat. Quelqu'un sait-il si c'est un problème connu ou est-ce que je fais juste quelque chose de mal? Oh, je fais aussi cela entièrement en C en utilisant le câblagePi.

linuxgnuru
la source
1
Juste pour ajouter au pot de solutions logicielles, consultez notre ami en micro-contrôleurs. arduino.cc/en/Tutorial/Debounce
Cammy_the_block
Voici un extrait de quelque chose que j'ai écrit il y a quelque temps. if(digitalRead(data) && millis()-startTime > 10){et définissez startTime chaque fois qu'il entre en boucle.
Cammy_the_block
je me demandais juste; à quoi exactement définirais-je startTime?
linuxgnuru
Un compteur de temps sorta. Arduino a la fonction millis qui donne le temps depuis le démarrage.
Cammy_the_block
Ah ok, tout comme le câblagePi câblagepi.com
reference

Réponses:

12

Les boutons et commutateurs mécaniques peuvent souffrir d'un rebond du commutateur où ils basculent rapidement entre ouvert et fermé pendant plusieurs millisecondes.

Vous pouvez essayer de faire rebondir le bouton / commutateur dans le logiciel ou le matériel.

Probablement le plus simple des logiciels.

Si le niveau change (on à off, ou off à on) attendez x millisecondes et relisez le gpio. S'il est toujours dans le nouvel état, supposez qu'il s'agit d'une véritable transition. La valeur de x pourrait être quelque chose comme 20.

Pour les solutions matérielles, recherchez ce type de message

joan
la source
8

Prenez le temps de lire le guide anti-rebond de Jack Ganssle . La première page illustre le problème en détail, et la seconde comment le traiter dans le matériel ou les logiciels. Il n'y a pas de méthode anti-rebond «parfaite», mais il y en a beaucoup de mauvaises!

C'est un problème que vous rencontrerez à plusieurs reprises si vous connectez un logiciel à des commutateurs, il vaut donc la peine de prendre le temps de le comprendre, et l'article de Jack est la manière la plus concise que j'ai vue de le faire.

rolinger
la source
2

Dans les applications qui ont un ticker système, j'implémente généralement un registre à décalage.

unsigned char button_checker;

// inside the system ticker

button_checker <<= 1; 
button_checker += INPUT;

if (button_checker == 0xFF) 
{ 
    // button was pressed 
}

Bien sûr, vous ne devez effectuer l'événement de pression de bouton que sur un front montant.

vsz
la source
1
Voilà une méthode intéressante. Facilement personnalisable (en masquant les bits les plus significatifs de button_checker) pour nécessiter un nombre variable de lectures consécutives.
joan