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:
- 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.
- 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.
Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables ESP32 Starter Kit (ESP32 included) | |
| 1 | × | DIYables ESP32 S3 Starter Kit (ESP32 S3 included) | |
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
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

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

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)

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.
⇒ 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.

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

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:
- 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
- É 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

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

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:
- Lê o estado do pino de entrada usando a função digitalRead().
※ 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
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.
- Compile e faça upload do código para a placa ESP32 clicando no botão Upload no Arduino IDE

- Abra 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::
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
- Se esta é a primeira vez que você usa o ESP32, veja como configurar o ambiente para o ESP32 no Arduino IDE.
- Modifique o código como abaixo
- Compile e faça upload do código para a placa ESP32 clicando no botão Upload no Arduino IDE

- Abra 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:
※ 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
- 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 ...