ESP32 - Botón

El botón es un componente básico y ampliamente utilizado en muchos proyectos con 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 hablar sobre el botón, nos gustaría señalar que hay dos errores comunes que suelen encontrar los principiantes:

  1. El problema de la entrada flotante:
    • Síntoma: Al conectar un botón al pin de entrada del ESP32, el estado del pin de entrada es aleatorio y no coincide con el estado de presión del botón.
    • Causa: El pin del botón NO utiliza una resistencia pull-down o una resistencia pull-up.
    • Solución: ⇒ Utilice una resistencia pull-down o una resistencia pull-up en el pin de entrada. Los detalles se describirán más adelante en este tutorial.
  • El fenómeno de rebote
    • Síntoma: El código en 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 presiona realmente solo una vez, el código del ESP32 detecta varias pulsaciones en lugar de una.
    • Causa: Debido a características mecánicas y físicas, cuando realizas una sola pulsación de un botón, el estado del pin de entrada cambia rápidamente entre BAJO y ALTO varias veces en lugar de una vez
    • Solución: ⇒ Rebote. Los detalles se describirán en ESP32 - Button - Debounce tutorial.

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

    Acerca del Botón

    El pulsador, también conocido como botón táctil o interruptor momentáneo, es un tipo de interruptor que se cierra cuando se pulsa y se mantiene presionado, y se abre cuando se suelta. Existen varios tipos de pulsadores, que se clasifican principalmente en dos grupos:

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

    Pinout del botón

    Un botón de montaje en PCB 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. En consecuencia, hay cuatro formas de cablear el botón (ver la imagen bimage 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 utilizará dos pines: Pin A y Pin B que no están conectados entre sí.

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

    El botón recibe la fuerza de los usuarios. Para que se mantenga estable y firme en la placa de circuito impreso (PCB), 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 pull-down integrada, que garantiza que la salida se mantenga en nivel bajo cuando el botón no está presionado. Tiene tres pines:

    • GND: Conecta este pin a la masa.
    • VCC: Conecta este pin a una fuente de alimentación de 3.3V.
    • OUT: Conecta este pin a una entrada digital en tu ESP32.

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

    Cómo funciona el botón

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

    ESP32 - Botón

    El pin de un botón está conectado a un pin de entrada digital del ESP32. El otro pin está conectado a VCC o GND. En el código del 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 conectemos el botón al ESP32 y de la configuración del pin del ESP32. Hay dos formas de usar un botón con el 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 ninguna resistencia pull-down ni pull-up, el estado del pin de entrada es aleatorio entre ALTO o BAJO (inestable, no fijado) cuando el botón no está presionado. Esto se llama el “problema de entrada flotante”. Esto provoca un mal funcionamiento.

    Para facilitarlo a los principiantes, este tutorial recomienda encarecidamente usar una resistencia pull-up interna en el pin ESP32. No se requiere resistencia externa. Esto ahorra hardware y simplifica el diagrama de cableado.

    Diagrama de cableado entre el botón y el ESP32

    • Diagrama de cableado entre ESP32 y el botón montado en la placa de circuito impreso
    Diagrama de cableado del botón ESP32

    This image is created using Fritzing. Click to enlarge image

    Si no sabe c\u00f3mo alimentar ESP32 y otros componentes, encuentre instrucciones en el siguiente tutorial: C\u00f3mo alimentar ESP32.

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

    This image is created using Fritzing. Click to enlarge image

    Cómo programar un botón

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

    ※ Nota:

    Hay dos casos de uso muy utilizados:

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

    Dependiendo de la aplicación, se utiliza 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 21 // GPIO21 pin connected to button // Variables will change: int lastState = HIGH; // the previous state from the input pin int currentState; // 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: currentState = digitalRead(BUTTON_PIN); if(lastState == LOW && currentState == HIGH) Serial.println("The state changed from LOW to HIGH"); // save the last state lastState = currentState; }

    Código ESP32

    Pasos R\u00e1pidos

    • Si es la primera vez que usas ESP32, consulta cómo configurar el entorno para ESP32 en Arduino IDE.
    • Realiza el cableado como en la imagen de arriba.
    • Conecta la placa ESP32 a tu PC mediante un cable micro USB
    • Abre Arduino IDE en tu PC.
    • Selecciona la placa ESP32 correcta (p. ej. ESP32 Dev Module) y el puerto COM.
    • Copia el código de abajo y pégualo en Arduino IDE.
    #define BUTTON_PIN 21 // GIOP21 pin connected to button void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be 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 buttonState = digitalRead(BUTTON_PIN); // print out the button's state Serial.println(buttonState); }
    • Compilar y subir el código a la placa ESP32 haciendo clic en el botón Subir en el IDE de Arduino
    Cómo subir código ESP32 al Arduino IDE
    • 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
    • Ve el resultado en el Monitor Serial. Se ve como lo siguiente:
    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 ESP32 contiene una explicación línea por línea. ¡Por favor, lea los comentarios en el código!

    Modificando el código del ESP32

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

    Pasos R\u00e1pidos

    /* * Este código de ESP32 fue desarrollado por es.newbiely.com * Este código de ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp32/esp32-button */ #define BUTTON_PIN 21 // GIOP21 pin connected to button // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be 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: currentState = digitalRead(BUTTON_PIN); if (lastState == HIGH && currentState == LOW) Serial.println("The button is pressed"); else if (lastState == LOW && currentState == HIGH) Serial.println("The button is released"); // save the the last state lastState = currentState; }
    • Compilar y subir código a la placa ESP32 haciendo clic en el botón Subir del IDE de Arduino
    Subir código al IDE de Arduino
    • Abrir el Monitor Serial en el IDE de Arduino
    ¿Cómo abrir el monitor serial en el IDE de Arduino?
    • Presiona el botón y luego suéltalo
    • Consulta el resultado en el Monitor Serial. Se ve como lo siguiente:
    COM6
    Send
    The button is pressed The button is released
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ Nota:

    • El Monitor Serial puede imprimir varios eventos de pulsación y liberación, aunque solo hayas hecho 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 ESP32 - Tutorial de rebote de botón.
    • Para simplificar las cosas para principiantes, especialmente al usar varios botones, creamos una biblioteca llamada ezButton. Puedes aprender sobre la biblioteca ezButton aquí.
    • Para el módulo de botón, usa pinMode(BUTTON_PIN, INPUT). Devuelve LOW cuando no está presionado y HIGH cuando está presionado.

    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 y cuándo no se debe usar una resistencia pull-down/pull-up?

    • DEBERÍA: Si el sensor tiene dos estados: cerrado y abierto, necesita una resistencia pull-up o pull-down para convertir estos estados en dos estados: BAJO y ALTO. Por ejemplo, pulsador, interruptor, interruptor de contacto magnético (sensor de puerta)...
    • NO DEBERÍA: Si el sensor emite 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 idioma

    ※ 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!