Introdução
Durante o desenvolvimento de sistemas embarcados, frequentemente nos deparamos com a necessidade de interagir com botões físicos, seja para realizar ações, testar entradas digitais ou navegar em menus.
Embora a Arduino IDE forneça exemplos básicos de botões, podemos nos deparar com problema de oscilação do sinal (bouncing), problemas de detectar pressionamento e sempre precisamos realizar a estrutura de um código de debouncing para lidar com botões.
Por isso, para simplificar o uso de botões, será mostrada a criação de uma biblioteca Button, com uma abordagem orientada a objetos usando C++.
Características da Biblioteca
- Debounce por software de 50 milisegundos
- Detecção de:
- Pressionado (wasPressed)
- Solto (wasReleased)
- Estado atual (isPressed)
- Suporte a múltiplos botões
- Configuração com ou sem pull-up interno
Materiais Necessários
Para desenvolver nossa aplicação os materiais utilizados foram:
- Franzininho WiFi Lab01
- Cabo Micro USB
- Arduino IDE
- VS Code (opcional para organização de arquivos)
Circuito
O circuito utilizado para validar a biblioteca será a placa Franzininho WiFi LAB01 com seu botão e LED. Assim, ao pressionar e soltar o botão, o LED deve acender.
Estrutura de pasta
Criamos uma pasta chamada button e no VS Code criaremos a seguinte estrutura de arquivos.
- button.h é o nosso cabeçalho responsável por definir a classe, os atributos públicos e privados, além da assinatura das funções.
- button.cpp responsável pela implementação da classe
- library.properties permite instalar a biblioteca e suas dependências
- keywords.txt é uma lista de palavras-chave para a biblioteca destacar palavras por tipo de dados, método ou função.
Para saber mais sobre a estrutura de biblioteca da Arduino, veja a documentação consultada: https://arduino.github.io/arduino-cli/1.2/library-specification
Quer aprender a desenvolver projetos profissionais para ESP32 usando o Arduino? Confira o curso: Domine o ESP32 com Arduino: Da Base aos Projetos Avançados, Um Curso completo de ESP32 com Arduino: programação, conectividade e projetos.
Código
O uso de classe orientada a objetos permite que você crie vários botões independentes, cada um com seu próprio estado interno.
A estrutura de código segue a documentação da Arduino em Writing a Library for Arduino
O código com os arquivos da biblioteca completa se encontra em https://github.com/guilhermefernandesk/ESP32-C6/tree/main/button
button.h:
#ifndef BUTTON_H
#define BUTTON_H
#include <Arduino.h> // Biblioteca para usar API Arduino
class Button {
public:
// Construtor: define o pino e o modo de entrada (padrão: INPUT_PULLUP)
Button(uint8_t pin, bool inputPullup = true);
void update(); // Atualiza o estado do botão (deve ser chamada no loop)
bool wasPressed(); // Retorna true se o botão foi pressionado (bordo de descida)
bool isPressed(); // Retorna true se o botão está pressionado
bool wasReleased(); // Retorna true se o botão foi solto (bordo de subida)
private:
uint8_t _pin; // Pino físico do botão
bool _inputPullup; // true se usa INPUT_PULLUP
bool _state; // Estado atual (HIGH/LOW)
bool _lastState; // Estado anterior
bool _pressedEvent; // Flag de evento de pressionado
bool _releasedEvent; // Flag de evento de solto
unsigned long _lastDebounceTime; // Timestamp do último bounce
unsigned long _debounceDelay; // Tempo de debounce em ms
};
#endifbutton.cpp:
#include "button.h"
// Construtor com lista de inicialização
Button::Button(uint8_t pin, bool inputPullup) :
_pin(pin),
_inputPullup(inputPullup),
_state(HIGH),
_lastState(HIGH),
_pressedEvent(false),
_releasedEvent(false),
_lastDebounceTime(0),
_debounceDelay(50)
{
pinMode(_pin, _inputPullup ? INPUT_PULLUP : INPUT);
}
// Atualiza o estado do botão e detecta eventos de borda
void Button::update() {
int reading = digitalRead(_pin);
if (reading != _lastState) {
_lastDebounceTime = millis(); // mudança detectada, zera o tempo
}
if ((millis() - _lastDebounceTime) > _debounceDelay) {
if (reading != _state) {
_state = reading;
_pressedEvent = (_state == LOW); // Botão pressionado
_releasedEvent = (_state == HIGH); // Botão liberado
}
}
_lastState = reading;
}
// Verifica se o botão foi pressionado
bool Button::wasPressed() {
if(_pressedEvent){
_pressedEvent = false; // Reseta o evento de pressionado após a leitura
return true;
}
return false;
}
// Verifica se o botão está pressionado
bool Button::isPressed() {
return _state == LOW;
}
// Verifica se o botão foi liberado
bool Button::wasReleased() {
if(_releasedEvent){
_releasedEvent = false; // Reseta o evento de liberado após a leitura
return true;
}
return false;
}Para validar vamos criar um código que ao pressionar o botão 1 da Franzininho WiFi LAB01, ligamos o LED verde e ao soltar desligamos.
#include <button.h>
//Definições de periféricos externos da placa
const uint8_t LED_VERDE = 13; // Pino do LED Verde
const uint8_t BOTAO_1 = 7; // Pino do Botão 1
// Construtor: define o pino e o modo de entrada (padrão: INPUT_PULLUP)
Button btn(BOTAO_1); // Pino conectado ao botão,
void setup() {
pinMode(LED_VERDE, OUTPUT);
}
void loop() {
btn.update();
if (btn.wasPressed()) {
digitalWrite(LED_VERDE, HIGH);
}
if (btn.wasReleased()) {
digitalWrite(LED_VERDE, LOW);
}
}
Como utilizar a biblioteca
Para utilizar a biblioteca Button no Arduino IDE, siga os passos abaixo:
- Faça um .zip da pasta button que criamos ou baixe a biblioteca como .zip
- Acesse o site DownGit, uma ferramenta que permite baixar pastas individuais de repositórios no GitHub
- Cole o seguinte link no campo indicado: https://github.com/guilhermefernandesk/ESP32-C6/tree/main/button
- Clique em “Download” para baixar a pasta button como um arquivo .zip.
- Vá em Sketch -> Include library -> add .zip library…
- Inclua a biblioteca no seu sketch com: #include <Button.h>
Resultados

Conclusão
Neste artigo, mostramos como criar uma biblioteca para seus projetos, além de apresentar conceitos de orientação a objetos do C++.
Sendo assim, a biblioteca button eliminou a necessidade de implementar debounce de botões a cada sketch.
Convidamos você a testar em seus próprios projetos e a compartilhar seus resultados com a comunidade, seja por meio de artigos, vídeos ou tutoriais.




