Uso de un push button con Arduino digitalRead

En este tutorial te indicaremos el uso de un Uso de un push button con Arduino digitalRead. Un botón es un elemento de entrada para un sistema digital. La función de Arduino digital Read permite obtener el estado lógico (alto ó bajo). Para poder usar a esta instrucción, se requiere declarar una entrada con la función pinMode. Para este tutorial se utilizará un arreglo de resistencia pull-up. En este tipo de configuración, la resistencia que se conecta a una de las terminales del botón, se conecta a voltaje. Por ejemplo, con el microcontrolador de la tarjeta Arduino, se puede utilizar una resistencia interna en pull-up. Entonces para ejecutar esta acción se declara una entrada como:

  • pinMode(PIN, INPUT_PULLUP);

Por lo tanto, dado que se usará a la resistencia interna, la conexión será muy simple. Una terminal se conectará a tierra (GND) y la otra a la entrada 7 de Arduino. Por lo tanto, la entrada 7 se declarará como:

  • pinMode(7, INPUT_PULLUP);

Sintaxis de Arduino digitalRead()

La función de Arduino digitalRead permite leer el estado o condición lógica de una entrada digital. Esta función arrojará como resultado, 1 si en la entrada hay un voltaje de entrada en estado alto. Por ejemplo, para un Arduino UNO R3, esto significa un voltaje entre: 3V y 5.5V. El resultado de la función será 0 si el voltaje de entrada esta entre un rango de: -0.5V a 1.5V. Estos parámetros considerando un voltaje de alimentación Vcc de exactamente 5V. El uso de la función es el siguiente:

int estadoLogico = digitalRead(#EntradaDigital);

Donde el parámetro de entrada, #EntradaDigital corresponde a uno de los pines que se ha configurado como entrada. Por ejemplo, este es un valor numérico, para un UNO R3, puede ser desde 0 hasta 13. Incluso se podría usar una entrada analógica (A0-A5) como entrada digital.

Diagrama de conexión de un push button con Arduino digitalRead

push button Arduino - uso de un botón

Ejemplo-1 de un push button con Arduino digitalRead y el efecto de debounce

En el primer ejemplo de un botón con Arduino digitalRead, considera el caso más sencillo. Esto es, cuando declaramos una entrada (PIN 7) y en un ciclo infinito (loop) leemos el estado lógico. Recordemos, que para leer el estado lógico se requiere usar a la función digitalRead. Entonces el propósito de este ejemplo, es demostrar un efecto que es conocido como «debounce».

El efecto «debounce» también llamado «rebote» en español, es una condición que se genera debido a la alta velocidad del procesador respecto de la reacción humana de presionar un botón. Por ejemplo, si usamos una estructura de control IF para detectar el estado de la entrada lógica, el procesador puede hacer 15 o 20 evaluaciones y en todas ellas encontrar que el botón esta presionado y aún el usuario del botón no ha terminado de soltarlo. Para tener un comprobante de que se leyo el boton, se usará a la instrucción Arduino serial Print para enviar un mensaje al monitor serial.

El siguiente código demuestra el problema. Si presionamos el botón veremos como el mensaje que indica que se presiono el botón se mostrara aproximadamente entre 12 y 15 veces. Esto depende del tiempo que dejemos presionado el push button con Arduino.

int contador = 0;

void setup() {
   pinMode(7, INPUT_PULLUP);  //Declarar el pin 7 como entrada con pull-up
   Serial.begin(9600); // Iniciar el puerto serial a 9600 BAUDs

}

void loop() {

  //Leer el estado de la entrada digital 7
  int estadoBoton = digitalRead(7); 
  //Serial.println(estadoBoton);
  
  if(estadoBoton == 0){
    //El boton esta activado
    contador++;
    Serial.print("Boton activado: ");
    Serial.println(contador);
  }
  else{
    contador=0;
    //El boton esta desactivado
   // Serial.println("Boton desactivado");
  }

}
Resultado de un boton con Arduino y digitalRead para el Ejemplo-1

Ejemplo-2 botón con Arduino y la función digitalRead para evitar el rebote o debounce

El ejemplo 2 es una demostración para usar un botón con Arduino para evitar el «rebote» eléctrico. Para evitar dicho rebote, existen dos formas. En este ejemplo, usaremos la forma más sencilla. Esto es, que al detectar la primera activación del push button, se declarará un pequeño retardo, digamos 200ms para evitar que se detecten otras activaciones. La principal desventaja de este ejemplo, es que durante 200ms el procesador de Arduino no estará haciendo absolutamente nada. Entonces esta es una forma muy pobre de utilizar el tiempo del procesador. Por lo tanto la única diferencia entre el ejemplo 2 y el primero es la línea que agrega el retardo:

  • delay(200);

Esta línea se agregará como se muestra en la siguiente imagen:

Ejemplo-2 botón con Arduino y la función digitalRead para evitar el rebote o debounce

Ejemplo-3 botón con Arduino digitalRead para evitar el debounce

En el ejemplo 3, se usará el push button con Arduino digitalRead para evitar el debounce. Para dicho propósito se utilizará a otra función del lenguaje. Esta función se llama millis(), permite leer el tiempo (en milisegundos) que ha transcurrido desde que se encendió la tarjeta. El objetivo del ejemplo 3 es el medir el tiempo que ha pasado desde la primera vez que se activo el boton. Si este tiempo es superior a 200ms, entonces se procede a ejecutar las instrucciones de la activación del botón.

Código del ejemplo 3

int contador = 0;
unsigned long tiempo0 = 0;
unsigned long tiempo1 = 0;
bool primeraVez = false;

void setup() {
   pinMode(7, INPUT_PULLUP);  //Declarar el pin 7 como entrada con pull-up
   Serial.begin(9600); // Iniciar el puerto serial a 9600 BAUDs

}

void loop() {

  //Leer el estado de la entrada digital 7
  int estadoBoton = digitalRead(7); 
  //Serial.println(estadoBoton);
  
  if(estadoBoton == 0){
    //El boton esta activado
    if(!primeraVez){ primeraVez = true; tiempo0 = millis(); }  //Se detecta la primera activacion y se guarda ese tiempo
    else{
      tiempo1 = millis();     //En los rebotes se verifica el tiempo, aqui se podria llamar a otra funcion para aprovechar el tiempo del procesador
      if((tiempo1-tiempo0)>200) {  //Si el tiempo supera los 200ms entonces activamos las instrucciones correspondientes
          //Se activo el boton y pasaron 200ms
          primeraVez = false;
          contador++;
          Serial.print("Boton activado: ");
          Serial.println(contador);
      }
    }
    
    
  }
  else{
    contador=0;
    //El boton esta desactivado
   // Serial.println("Boton desactivado");
  }

}

Autor: Dr. Rubén Estrada Marmolejo

Escríbenos tus dudas o comentarios

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Usamos Cookies en nuestro sitio WEB

Por favor confirma, si aceptas nuestras cookies de rastreo. También puedes negar el uso de cookies de rastreo y seguir navegando sin que ninguna información sea enviada a servicios de terceros.