El estado del botón cambia al azar

14

Tengo un botón pulsador conectado a mi Arduino, pero parece que se dispara al azar.

Tengo un pin del botón conectado al pin 2 en el arduino y el otro conectado a tierra.

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

    pinMode(2, INPUT);
}

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

Espero que imprima 1 continuamente y vaya a 0 cuando presiono el botón, pero a veces muestra 0 incluso cuando no lo toco.

Sachleen
fuente

Respuestas:

17

Cuando se conecta un botón en esa configuración, la entrada es lo que se llama flotante , lo que significa que no es un 0 o un 1. Cuando se presiona el botón, se conecta a tierra, por lo que definitivamente es un 0, pero cuando no se presiona, No sabemos el valor del pin.

Tire hacia arriba de la resistencia

Necesitamos incluir lo que se llama una resistencia "pull-up" para llevar la señal a un 1 lógico cuando no se presiona el botón.

Levante la resistencia

Imagen de Sparkfun

Lo que esto significa es que cuando no se presiona el botón, el Arduino lee una lógica 1. Cuando se presiona el botón, la corriente fluye a través de la resistencia a tierra y el Arduino lee un 0 lógico.

Resistencia interna pull up

El Arduino también tiene resistencias pull up internas, por lo que no necesariamente tiene que agregar un componente adicional a su circuito. Hay un par de formas de usar esto.

Solías tener que hacerlo así:

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

Ahora podemos hacerlo simplemente en una línea:

pinMode(pin, INPUT_PULLUP);

Esto habilita la resistencia pull-up de 20k en ese pin. La entrada ya no estará flotando cuando no se presione el botón.

Nota: Esto solo funciona cuando el otro extremo está conectado a tierra.

Sachleen
fuente
1
Vale la pena señalar que la misma idea también funciona para resistencias desplegables; es decir, la resistencia normalmente tira del pin hacia abajo, pero presionar el botón lo lleva alto. Obviamente, tiene que ser externo, ya que no hay un menú desplegable interno en Arduinos estándar.
Peter Bloomfield