Arduino Nano ESP32 - Botón

El botón es un componente básico y se utiliza ampliamente en muchos proyectos con Arduino Nano ESP32. No es tan simple como parece (debido a sus características mecánicas y físicas). Los principiantes pueden tener muchos problemas con él. Este tutorial facilita las cosas para los principiantes. ¡Comencemos!

※ Nota:

Antes de presentar sobre el botón, nos gustaría señalar que hay dos errores comunes que suelen encontrar los principiantes:

  1. El problema de entrada flotante:
    • Síntoma: Al conectar un botón al pin de entrada de una Arduino Nano ESP32, el estado del pin de entrada es aleatorio y no coincide con el estado de pulsación del botón.
    • Causa: Al pin del botón no se le está utilizando una resistencia pull-down o una resistencia pull-up.
    • Solución: ⇒ Utilice una resistencia pull-down o pull-up en el pin de entrada. El detalle se describirá más adelante en este tutorial.
  • El fenómeno de rebote
    • Síntoma: El código en Arduino Nano ESP32 lee el estado del botón e identifica el evento de pulsación detectando el cambio de estado (ALTO a BAJO, o BAJO a ALTO). Cuando el botón se pulsa realmente solo una vez, el código de Arduino Nano ESP32 detecta múltiples pulsaciones en lugar de una sola.
    • Causa: Debido a las características mecánicas y físicas, cuando se realiza una sola pulsación en un botón, el estado del pin de entrada cambia rápidamente entre BAJO y ALTO varias veces en lugar de una.
    • Solución: ⇒ Debounce. El detalle se describirá en Arduino Nano ESP32 - Button - Debounce tutorial.

    El fenómeno de rebote provoca el mal funcionamiento solo en algunos tipos de aplicaciones que necesitan detectar exactamente el número de pulsaciones. En algunas aplicaciones, es inofensivo.

    Botón Acerca de

    El pulsador, también conocido como pushbutton, botón táctil o interruptor momentáneo, es un tipo de interruptor que se cierra al presionarlo y mantenerlo presionado, y se abre al soltarlo. Existen varios tipos de pulsadores, que se clasifican en dos grupos principales:

    • PCB-mount push buttons (suitable for breadboard mounting)
    • Panel-mount push buttons
    Botón pulsador para Arduino Nano ESP32

    Pinout del botón

    Un botón montado en una placa de circuito impreso suele tener cuatro pines que están conectados internamente en pares.

    Pinout del botón

    Solo necesitamos usar dos de los cuatro pines, que NO están en el mismo par conectado. Por consiguiente, hay cuatro formas de realizar el cableado del botón (ver la imagen abajo).

    Cómo usar el botón

    En realidad, debido a la simetría, estas cuatro formas se convierten en dos. El resto de este tutorial usará dos pines: Pin A y Pin B que no están conectados entre sí.

    ¿Por qué el botón tiene cuatro pines mientras que solo necesitamos dos pines?

    El botón recibe la fuerza que ejercen los usuarios. Para que se mantenga estable y firme en la PCB (placa de circuito impreso), tiene cuatro pines para resistir la fuerza de pulsación.

    Un botón de montaje en panel suele tener dos pines.

    Pinout de un pulsador de dos pines
    image source: diyables.io

    El módulo de pulsador incluye una resistencia de pull-down integrada, lo que garantiza que la salida permanezca en nivel bajo cuando el botón no esté presionado. Tiene tres pines:

    • GND: Conecta este pin a tierra.
    • VCC: Conecta este pin a una fuente de 3.3V.
    • OUT: Conecta este pin a una entrada digital de tu Arduino Nano ESP32.

    Con esta configuración, el módulo genera nivel bajo cuando el botón no está presionado y genera nivel alto cuando el botón está presionado.

    Cómo funciona el botón

    • Cuando el botón está presionado, el pin A está conectado al pin B
    • Cuando el botón no está presionado, el pin A no está conectado al pin B
    Cómo funciona el botón

    Arduino Nano ESP32 - Botón

    El pin de un botón está conectado a un pin de entrada digital de Arduino Nano ESP32. El otro pin está conectado a VCC o GND. En el código de Arduino Nano ESP32, al leer el estado del pin de entrada, podemos inferir si el botón está presionado o no.

    Estado de entrada y estado de pulsación

    La relación entre el estado del pin de entrada y el estado de pulsación del botón depende de cómo conectamos el botón con Arduino Nano ESP32 y de la configuración del pin del ESP32. Hay dos formas de usar un botón con ESP32:

    1. El pin de un botón está conectado a un pin de entrada digital del ESP32, el otro pin está conectado a VCC:
      • Se debe usar una resistencia pull-down
      • Si se pulsa el botón, el estado del pin del ESP32 es ALTO. De lo contrario, el estado del pin del ESP32 es BAJO
  • El pin de un botón está conectado a un pin de entrada digital del ESP32, el otro pin está conectado a GND:
    • Se debe usar una resistencia pull-up
    • Si se pulsa el botón, el estado del pin del ESP32 es BAJO. De lo contrario, el estado del pin del ESP32 es ALTO

    ※ Nota:

    Si no se utiliza una resistencia pull-down ni una resistencia pull-up, el estado del pin de entrada es aleatorio entre HIGH o LOW (inestable, no fijado) cuando el botón NO está presionado. Esto se llama “problema de entrada flotante”. Esto resulta en el mal funcionamiento.

    Para facilitar las cosas a los principiantes, este tutorial recomienda encarecidamente usar una resistencia pull-up interna para el pin del Arduino Nano ESP32. No se requiere resistencia externa. Esto ahorra hardware y simplifica el esquema de cableado.

    Diagrama de cableado entre el botón y Arduino Nano ESP32

    • Diagrama de cableado entre Arduino Nano ESP32 y un botón montado en PCB
    Diagrama de cableado del botón Arduino Nano ESP32

    This image is created using Fritzing. Click to enlarge image

    • Diagrama de cableado entre Arduino Nano ESP32 y botón de montaje en panel
    Diagrama de cableado de un pulsador de dos pines para Arduino Nano ESP32

    This image is created using Fritzing. Click to enlarge image

    Cómo programar un botón

    • Inicializa el pin del Arduino Nano ESP32 como una entrada con pull-up interno utilizando la función pinMode(). Por ejemplo, el pin D2:
    pinMode(D2, INPUT_PULLUP); // config D2 as input pin and enable the internal pull-up resistor
    • Lee el estado del pin de entrada utilizando la función digitalRead().
    int button_state = digitalRead(BUTTON_PIN);

    ※ Nota:

    Hay dos casos de uso muy usados:

    • El primer caso de uso: Si el estado de la entrada es ALTO, haz algo. Si el estado de la entrada es BAJO, haz otra cosa.
    • El segundo caso de uso: Si el estado de la entrada cambia de BAJO a ALTO, haz algo. Si el estado de la entrada cambia de ALTO a BAJO, haz otra cosa.

    Dependiendo de la aplicación, se usa uno de ellos. Por ejemplo, en el caso de usar un botón para controlar un LED:

    • Si queremos encender el LED cuando se presiona el botón y apagarlo cuando no se presiona el botón, DEBEMOS usar el primer caso.
    • Si queremos alternar el LED entre ENCENDIDO y APAGADO cada vez que se presione el botón, DEBEMOS usar el segundo caso.

    El código de ejemplo a continuación muestra cómo detectar el cambio de estado de LOW a HIGH.

    #define BUTTON_PIN D2 // D2 pin connected to button int prev_state = HIGH; // the previous state from the input pin int button_state; // the current reading from the input pin void setup() { Serial.begin(9600); // initialize the pushbutton pin as an pull-up input pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); if(prev_state == LOW && button_state == HIGH) Serial.println("The state changed from LOW to HIGH"); // save the last state prev_state = button_state; }

    Código Arduino Nano ESP32

    Pasos R\u00e1pidos

    Para empezar con Arduino Nano ESP32, siga estos pasos:

    • Si eres nuevo en Arduino Nano ESP32, consulta el tutorial sobre cómo configurar el entorno para Arduino Nano ESP32 en el IDE de Arduino.
    • Conecta los componentes de acuerdo con el diagrama proporcionado.
    • Conecta la placa Arduino Nano ESP32 a tu computadora usando un cable USB.
    • Inicia el IDE de Arduino en tu computadora.
    • Selecciona la placa Arduino Nano ESP32 y su puerto COM correspondiente.
    • Copia el código que se muestra a continuación y pégalo en el IDE de Arduino.
    #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // initialize the button pin as an pull-up input (HIGH when the switch is open and LOW when the switch is closed) pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: int button_state = digitalRead(BUTTON_PIN); // print out the button's state Serial.println(button_state); }
    • Compila y carga el código en la placa Arduino Nano ESP32 haciendo clic en el botón Cargar en el IDE de Arduino
    Cómo subir código de Arduino Nano ESP32 al IDE de Arduino
    • Abrir el Monitor Serial en el IDE de Arduino
    Cómo abrir el monitor serie en el IDE de Arduino
    • Presiona y suelta el botón varias veces
    • Revisa el resultado en el Monitor Serial. Se ve como lo que se muestra abajo.
    COM6
    Send
    1 1 1 0 0 0 0 0 0 1 1 1
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    1 es alto, 0 es bajo.

    Explicación del código línea por línea

    El código anterior de Arduino Nano ESP32 contiene una explicación línea por línea. Por favor, lea los comentarios en el código.

    Modificando el código de Arduino Nano ESP32

    Vamos a modificar el código para detectar los eventos de pulsación y liberación.

    Pasos R\u00e1pidos

    /* * Este código de Arduino Nano ESP32 fue desarrollado por es.newbiely.com * Este código de Arduino Nano ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-button */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button int prev_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // initialize the button pin as an pull-up input (HIGH when the switch is open and LOW when the switch is closed) pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); if (prev_state == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if (prev_state == LOW && button_state == HIGH) Serial.println("The button is released"); // save the the last state prev_state = button_state; }
    • Compila y sube el código a la placa Arduino Nano ESP32 haciendo clic en el botón Subir en el IDE de Arduino.
    • Abre el Monitor Serial en el IDE de Arduino.
    • Presiona el botón y luego suéltalo.
    • Consulta el resultado en el Monitor Serial. Se muestra a continuación:
    COM6
    Send
    The button is pressed The button is released
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ Nota:

    • El Monitor Serial puede mostrar varios eventos de pulsación y liberación, aunque solo hayas realizado una pulsación y liberación. Este es un comportamiento normal del botón. Este comportamiento se llama el “fenómeno de rebote”. En algunas aplicaciones, necesitamos un método para eliminarlo. Puedes aprender más en Arduino Nano ESP32 - Button Debounce tutorial.
    • Para hacerlo más sencillo para principiantes, especialmente cuando se usan varios botones, creamos una biblioteca llamada ezButton. Puedes aprender sobre la biblioteca ezButton aquí.
    • Cuando uses el módulo de botón, configura el pin como pinMode(BUTTON_PIN, INPUT). El módulo emite LOW cuando no está pulsado y HIGH cuando está pulsado.

    Video Tutorial

    Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

    Conocimientos adicionales

    ¿Cuándo se debe usar una resistencia pull-down o pull-up y cuándo no?

    • DEBERÍA: Si el sensor tiene dos estados: cerrado y abierto, necesita una resistencia pull-up o pull-down para hacer que estos estados se conviertan en dos estados: BAJO y ALTO. Por ejemplo, pulsador, interruptor, interruptor de contacto magnético (sensor de puerta)...
    • NO DEBERÍA: Si el sensor produce dos niveles de voltaje (BAJO y ALTO), NO necesita una resistencia pull-up o pull-down. Por ejemplo, sensor de movimiento, sensor táctil ...

    Referencias de idiomas

    ※ NUESTROS MENSAJES

    • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!