L'état des boutons change de façon aléatoire

14

J'ai un bouton-poussoir connecté à mon Arduino mais il semble se déclencher de manière aléatoire.

J'ai une broche du bouton connectée à la broche 2 de l'arduino et l'autre connectée à la terre.

void setup() {
    Serial.begin(9600);

    pinMode(2, INPUT);
}

void loop() {
    Serial.println(digitalRead(2));
}

Je m'attends à ce qu'il imprime 1 en continu et passe à 0 lorsque j'appuie sur le bouton, mais parfois il affiche 0 même lorsque je ne le touche pas.

sachleen
la source

Réponses:

17

Lorsqu'un bouton est connecté dans cette configuration, l'entrée est ce qu'on appelle flottant , ce qui signifie que ce n'est pas un 0 ou un 1. Lorsque le bouton est enfoncé, il est connecté à la masse, c'est donc définitivement un 0, mais lorsqu'il n'est pas enfoncé, nous ne connaissons pas la valeur de la broche.

Pull Up Resistor

Nous devons inclure ce qu'on appelle une résistance "pull-up" pour tirer le signal jusqu'à une logique 1 lorsque le bouton n'est pas enfoncé.

tirer la résistance

Image de Sparkfun

Cela signifie que lorsque le bouton n'est pas enfoncé, l'Arduino lit une logique 1. Lorsque le bouton est enfoncé, le courant traverse la résistance à la masse et l'Arduino lit un 0 logique.

Résistance de traction interne

L'Arduino possède également des résistances de rappel internes, vous n'avez donc pas nécessairement à ajouter un composant supplémentaire à votre circuit. Il y a plusieurs façons de l'utiliser.

Vous deviez le faire comme ceci:

pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors

Maintenant, nous pouvons le faire simplement en une seule ligne:

pinMode(pin, INPUT_PULLUP);

Cela permet à la résistance de rappel de 20k sur cette broche. L'entrée ne sera plus flottante lorsque le bouton n'est pas enfoncé.

Remarque: cela ne fonctionne que lorsque l'autre extrémité est connectée à la terre.

sachleen
la source
1
Il convient de noter que la même idée fonctionne également pour les résistances de retrait; c'est-à-dire que la résistance tire normalement la broche vers le bas, mais en appuyant sur le bouton, elle est élevée. Évidemment, il doit être externe, car il n'y a pas de menu déroulant interne sur les Arduinos standard.
Peter Bloomfield