Arduino Nano ESP32 - Botão

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

※ Nota:

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

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

    O fenômeno de chattering causa mau funcionamento apenas em alguns tipos de aplicação que precisam detectar exatamente o número de pressionamentos. Em outros 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 em dois grandes 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 do Arduino Nano ESP32

    Pinagem do Botão

    Um botão para montagem em PCB geralmente tem quatro pinos ligados internamente em pares.

    Pinagem do Botão

    Só precisamos usar dois dos quatro pinos, que NÃO estejam no mesmo par conectado. Assim, existem quatro maneiras de ligar o botão (veja a imagem abaixo)

    Como Usar o Botão

    Na verdade, por causa da simetria, essas quatro maneiras se tornam duas. No restante deste tutorial, usaremos 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 só precisamos de dois?

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

    Um botão para montagem em painel geralmente 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 pull-down embutido, que garante que a saída permaneça 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 Arduino Nano ESP32.

    Com essa configuração, o módulo gera LOW quando o botão não está pressionado e gera 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

    Arduino Nano ESP32 - Botão

    Um pino do botão é conectado a um pino de entrada digital do Arduino Nano ESP32. O outro pino é conectado ao VCC ou ao GND. No código do Arduino Nano 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 Arduino Nano ESP32 e da configuração do pino do ESP32. Existem duas maneiras 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:
      • Um resistor pull-down DEVE ser usado
      • 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:
    • Um resistor pull-up DEVE ser usado
    • 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 pull-down nem pull-up for usado, o estado do pino de entrada fica aleatório entre HIGH e LOW (instável, não fixo) quando o botão NÃO está pressionado. Isso se chama “problema da entrada flutuante”. Isso resulta em mau funcionamento.

    Para deixar tudo simples para os iniciantes, este tutorial recomenda fortemente o uso de um resistor pull-up interno no pino do Arduino Nano 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 Arduino Nano ESP32

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

    This image is created using Fritzing. Click to enlarge image

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

    This image is created using Fritzing. Click to enlarge image

    Como Programar o Botão

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

    ※ Nota:

    Existem dois casos de uso muito comuns:

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

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

    • Se queremos ligar o LED quando o botão é pressionado e desligá-lo quando o botão NÃO é pressionado, DEVEMOS usar o primeiro caso.
    • Se queremos alternar o LED entre ligado e desligado a cada vez que o botão é 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 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

    Passos Rápidos

    Para começar com o Arduino Nano ESP32, siga estes passos:

    • Se você é novo no Arduino Nano ESP32, consulte o tutorial sobre como configurar o ambiente do Arduino Nano ESP32 na Arduino IDE.
    • Ligue os componentes conforme o diagrama fornecido.
    • Conecte a placa Arduino Nano ESP32 ao seu computador usando um cabo USB.
    • Abra a Arduino IDE no seu computador.
    • Selecione a placa Arduino Nano ESP32 e a porta COM correspondente.
    • Copie o código abaixo e cole na Arduino IDE.
    #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); }
    • Compile e faça o upload do código para a placa Arduino Nano ESP32 clicando no botão Upload da Arduino IDE
    Como fazer upload do código do Arduino Nano ESP32 na Arduino IDE
    • Abra o Serial Monitor na Arduino IDE
    Como abrir o Serial Monitor na 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
    Arduino Nano ESP32
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
    New Line
    9600 baud
    1 1 1 0 0 0 0 0 0 1 1 1
    Ln 11, Col 1
    Arduino Nano ESP32 on COM15
    2

    1 é HIGH, 0 é LOW.

    Explicação do Código Linha por Linha

    O código do Arduino Nano ESP32 acima contém uma explicação linha por linha. Por favor, leia os comentários no código!

    Modificando o Código do Arduino Nano ESP32

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

    Passos Rápidos

    /* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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; }
    • Compile e faça o upload do código para a placa Arduino Nano ESP32 clicando no botão Upload da Arduino IDE
    • Abra o Serial Monitor na 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
    Arduino Nano ESP32
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
    New Line
    9600 baud
    The button is pressed The button is released
    Ln 11, Col 1
    Arduino Nano ESP32 on COM15
    2

    ※ Nota:

    • O Serial Monitor pode imprimir vários eventos de pressionado e solto mesmo que você tenha pressionado e soltado só uma vez. Esse é um comportamento normal do botão. Esse comportamento é chamado de “fenômeno de chattering”. Em algumas aplicações, precisamos de um método para eliminá-lo. Você pode saber mais no tutorial Arduino Nano ESP32 - Debounce de Botão.
    • Para deixar tudo simples para iniciantes, especialmente ao usar vários botões, criamos uma biblioteca chamada ezButton. Você pode saber mais sobre a biblioteca ezButton aqui.
    • Ao usar o módulo de botão, configure o pino como pinMode(BUTTON_PIN, INPUT). O módulo gera 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 pull-down/pull-up?
    • DEVEMOS: Se o sensor tem dois estados: fechado e aberto, ele precisa de um resistor 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 gera dois níveis de tensão (LOW e HIGH), ele NÃO precisa de um resistor 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!