Estado do botão mudando aleatoriamente

14

Eu tenho um botão de pressão conectado ao meu Arduino, mas parece estar disparando aleatoriamente.

Eu tenho um pino do botão conectado ao pino 2 no arduino e o outro conectado ao terra.

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

    pinMode(2, INPUT);
}

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

Espero que imprima 1 continuamente e vá para 0 quando pressiono o botão, mas às vezes mostra 0 mesmo quando não o toco.

sachleen
fonte

Respostas:

17

Quando um botão é conectado nessa configuração, a entrada é chamada flutuante , o que significa que não é um 0 ou um 1. Quando o botão é pressionado, ele é conectado ao terra, então esse é definitivamente um 0, mas quando não é pressionado, não sabemos o valor do alfinete.

Resistor de tração

Precisamos incluir o que é chamado de resistor "pull-up" para elevar o sinal até a lógica 1 quando o botão não é pressionado.

puxe o resistor

Imagem de Sparkfun

O que isto significa é que quando o botão não é pressionado, o Arduino lê uma lógica 1. Quando o botão é pressionado, a corrente flui através do resistor para o terra e o Arduino lê uma lógica 0.

Resistor de tração interno

O Arduino também possui resistores pull up internos, para que você não precise necessariamente adicionar um componente extra ao seu circuito. Existem algumas maneiras de usar isso.

Você costumava fazer assim:

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

Agora podemos fazer isso simplesmente em uma linha:

pinMode(pin, INPUT_PULLUP);

Isso permite que o resistor de tração de 20k desse pino. A entrada não estará mais flutuando quando o botão não for pressionado.

Nota: Isso funciona apenas quando a outra extremidade está conectada ao terra.

sachleen
fonte
1
Vale a pena notar que a mesma idéia também funciona para resistores pull-down; ou seja, o resistor normalmente puxa o pino para baixo, mas pressionar o botão o eleva. Obviamente, ele precisa ser externo, pois não há um pull-down interno nos Arduinos padrão.
Peter Bloomfield