ESP32 - Botão

O botão é um componente básico e muito usado em diversos projetos com ESP32. Ele não é tão simples quanto parece (por causa de suas características mecânicas e físicas). Iniciantes podem ter muitos problemas com ele. Este tutorial deixa tudo fácil para os iniciantes. Vamos começar!

※ Nota:

Antes de apresentar o botão, gostaríamos de avisar que existem dois erros comuns que os iniciantes costumam cometer:

  1. O problema da entrada flutuante:
    • Sintoma: Ao conectar um botão a um pino de entrada do ESP32, o estado do pino de entrada é aleatório e não corresponde ao estado de pressionamento do botão.
    • Causa: O pino do botão NÃO usa um resistor de pull-down ou um resistor de pull-up.
    • Solução: ⇒ Use um resistor de pull-down ou um resistor de pull-up no pino de entrada. Os detalhes serão descritos mais adiante neste tutorial.
  • O fenômeno de trepidação (chattering)
    • Sintoma: O código no ESP32 lê o estado do botão e identifica o evento de pressionamento detectando a mudança de estado (de HIGH para LOW, ou de LOW para HIGH). Quando o botão é realmente pressionado apenas uma vez, o código do ESP32 detecta vários pressionamentos em vez de um.
    • Causa: Devido às características mecânicas e físicas, quando você pressiona um botão uma única vez, o estado do pino de entrada alterna rapidamente entre LOW e HIGH várias vezes em vez de uma
    • Solução: ⇒ Debounce. Os detalhes serão descritos no tutorial ESP32 - Botão - Debounce.

    O fenômeno de trepidação causa mau funcionamento apenas em alguns tipos de aplicação que precisam detectar exatamente o número de pressionamentos. Em alguns tipos de aplicação, ele é inofensivo.

    Sobre o Botão

    O botão de pressão, também chamado de pushbutton, botão tátil ou chave momentânea, é um tipo de chave que fecha quando é pressionado e mantido, e abre quando é solto. Existem vários tipos de botões de pressão, divididos de forma geral em dois grupos:

    • Botões de pressão para montagem em PCB (adequados para montagem em protoboard)
    • Botões de pressão para montagem em painel
    Botão de pressão ESP32

    Pinagem do Botão

    Um botão para montagem em PCB normalmente tem quatro pinos que são conectados internamente em pares.

    Pinagem do Botão

    Precisamos usar apenas dois dos quatro pinos, que NÃO estejam no mesmo par conectado. Assim, existem quatro formas de fazer a ligação com o botão (veja a imagem abaixo)

    Como Usar o Botão

    Na verdade, por causa da simetria, essas quatro formas se tornam duas. O restante deste tutorial vai usar dois pinos: o Pino A e o Pino B, que não estão conectados entre si.

    Por que o botão tem quatro pinos se precisamos apenas de dois?

    ⇒ O botão recebe a força dos usuários. Para ficar estável e firme na PCB (placa), ele tem quatro pinos que resistem à força do pressionamento.

    Um botão para montagem em painel normalmente tem dois pinos.

    Pinagem do botão de pressão de dois pinos
    image source: diyables.io

    O módulo de botão de pressão inclui um resistor de pull-down embutido, que garante que a saída permaneça em LOW quando o botão não está pressionado. Ele tem três pinos:

    • GND: Conecte este pino ao terra.
    • VCC: Conecte este pino a uma fonte de alimentação de 3.3V.
    • OUT: Conecte este pino a uma entrada digital do seu ESP32.

    Com essa configuração, o módulo envia LOW quando o botão não está pressionado e envia HIGH quando o botão está pressionado.

    Como o Botão Funciona

    • Quando o botão é pressionado, o pino A é conectado ao pino B
    • Quando o botão NÃO é pressionado, o pino A NÃO é conectado ao pino B
    Como o Botão Funciona

    ESP32 - Botão

    Um pino do botão é conectado a um pino de entrada digital do ESP32. O outro pino é conectado ao VCC ou ao GND. No código do ESP32, lendo o estado do pino de entrada, podemos saber se o botão está pressionado ou NÃO.

    Estado da Entrada e Estado de Pressionamento

    A relação entre o estado do pino de entrada e o estado de pressionamento do botão depende de como conectamos o botão ao ESP32 e da configuração do pino do ESP32. Existem duas formas de usar um botão com o ESP32:

    1. Um pino do botão é conectado a um pino de entrada digital do ESP32, e o outro pino é conectado ao VCC:
      • É OBRIGATÓRIO usar um resistor de pull-down
      • Se o botão for pressionado, o estado do pino do ESP32 é HIGH. Caso contrário, o estado do pino do ESP32 é LOW
  • Um pino do botão é conectado a um pino de entrada digital do ESP32, e o outro pino é conectado ao GND:
    • É OBRIGATÓRIO usar um resistor de pull-up
    • Se o botão for pressionado, o estado do pino do ESP32 é LOW. Caso contrário, o estado do pino do ESP32 é HIGH

    ※ Nota:

    Se nenhum resistor de pull-down ou de pull-up for usado, o estado do pino de entrada fica aleatório entre HIGH e LOW (instável, indefinido) quando o botão NÃO está pressionado. Isso é chamado de “problema da entrada flutuante”. Isso resulta em mau funcionamento.

    Para facilitar para os iniciantes, este tutorial recomenda fortemente que os iniciantes usem um resistor de pull-up interno no pino do ESP32. Nenhum resistor externo é necessário. Isso economiza hardware e simplifica o diagrama de ligação.

    Diagrama de Ligação entre o Botão e o ESP32

    • Diagrama de Ligação entre o ESP32 e o botão para montagem em PCB
    Diagrama de Ligação do Botão com ESP32

    This image is created using Fritzing. Click to enlarge image

    Se você não sabe como alimentar o ESP32 e outros componentes, veja as instruções no tutorial a seguir: Como alimentar o ESP32.

    • Diagrama de Ligação entre o ESP32 e o botão para montagem em painel
    Diagrama de Ligação do botão de pressão de dois pinos com ESP32

    This image is created using Fritzing. Click to enlarge image

    Como Programar o Botão

    • Inicializa o pino do ESP32 como entrada com pull-up interno usando a função pinMode(). Por exemplo, o pino GPIO21:
    pinMode(21, INPUT_PULLUP); // config GPIO21 as input pin and enable the internal pull-up resistor
    • Lê o estado do pino de entrada usando a função digitalRead().
    int buttonState = digitalRead(BUTTON_PIN);

    ※ Nota:

    Existem dois casos de uso muito comuns:

    • O primeiro caso de uso: se o estado da entrada for HIGH, faça algo. Se o estado da entrada for LOW, faça outra coisa.
    • O segundo caso de uso: se o estado da entrada mudar de LOW para HIGH, faça algo. Se o estado da entrada mudar de HIGH para LOW, faça outra coisa.

    Dependendo da aplicação, um deles é usado. Por exemplo, no caso de usar um botão para controlar um LED:

    • Se quisermos LIGAR o LED quando o botão for pressionado e DESLIGÁ-LO quando o botão NÃO estiver pressionado, DEVEMOS usar o primeiro caso.
    • Se quisermos alternar o LED entre LIGADO e DESLIGADO cada vez que o botão for pressionado, DEVEMOS usar o segundo caso.

    O código de exemplo abaixo mostra como detectar a mudança de estado de LOW para 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

    Passos Rápidos

    • Se esta é a primeira vez que você usa o ESP32, veja como configurar o ambiente para o ESP32 no Arduino IDE.
    • Faça a ligação como na imagem acima.
    • Conecte a placa ESP32 ao seu PC por um cabo USB Type-C
    • Abra o Arduino IDE no seu PC.
    • Selecione a placa ESP32 correta (por exemplo, ESP32 Dev Module) e a porta COM.
    • Copie o código abaixo e cole-o no 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); }
    • Compile e faça upload do código para a placa ESP32 clicando no botão Upload no Arduino IDE
    Como fazer upload do código ESP32 no Arduino IDE
    • Abra o Serial Monitor no Arduino IDE
    Como abrir o Serial Monitor no Arduino IDE
    • Pressione e solte o botão várias vezes
    • Veja o resultado no Serial Monitor. Ele se parece com o abaixo::
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    ESP32 Dev Module
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
    New Line
    9600 baud
    1 1 1 0 0 0 0 0 0 1 1 1
    Ln 11, Col 1
    ESP32 Dev Module on COM15
    2

    1 é HIGH, 0 é LOW.

    Explicação do Código Linha por Linha

    O código ESP32 acima contém explicações linha por linha. Por favor, leia os comentários no código!

    Modificando o Código ESP32

    Vamos modificar o código para detectar os eventos de pressionar e soltar

    Passos Rápidos

    /* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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; }
    • Compile e faça upload do código para a placa ESP32 clicando no botão Upload no Arduino IDE
    Carregar Código no Arduino IDE
    • Abra o Serial Monitor no Arduino IDE
    Como abrir o Serial Monitor no Arduino IDE
    • Pressione o botão e depois solte
    • Veja o resultado no Serial Monitor. Ele se parece com o abaixo:
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    ESP32 Dev Module
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
    New Line
    9600 baud
    The button is pressed The button is released
    Ln 11, Col 1
    ESP32 Dev Module on COM15
    2

    ※ Nota:

    • O Serial Monitor pode imprimir vários eventos de pressionar e soltar mesmo que você tenha pressionado e soltado apenas uma vez. Esse é um comportamento normal do botão. Esse comportamento é chamado de “fenômeno de trepidação”. Em algumas aplicações, precisamos de um método para eliminá-lo. Você pode aprender mais no tutorial ESP32 - Botão Debounce.
    • Para facilitar para os iniciantes, principalmente ao usar vários botões, criamos uma biblioteca chamada ezButton. Você pode aprender sobre a biblioteca ezButton aqui.
    • Para o módulo de botão, use pinMode(BUTTON_PIN, INPUT). Ele envia LOW quando não está pressionado e HIGH quando está pressionado.

    Vídeo

    Conhecimento Adicional

    Quando DEVEMOS e quando NÃO DEVEMOS usar um resistor de pull-down/pull-up?
    • DEVEMOS: Se o sensor tem dois estados: fechado e aberto, ele precisa de um resistor de pull-up ou pull-down para transformar esses estados em dois estados: LOW e HIGH. Por exemplo, botão de pressão, chave, chave de contato magnético (sensor de porta)...
    • NÃO DEVEMOS: Se o sensor envia dois níveis de tensão (LOW e HIGH), ele NÃO precisa de um resistor de pull-up ou pull-down. Por exemplo, sensor de movimento, sensor de toque ...

    Referências da Linguagem

    ※ NOSSAS MENSAGENS

    • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!