Criando uma Biblioteca de Botões para Arduino

Criando uma Biblioteca de Botões para Arduino
Este post faz parte da série ESP32-C6 na Prática

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.

Biblioteca de Botões para Arduino
Figura 1: Placa Franzininho WiFi Lab01

Estrutura de pasta

Criamos uma pasta chamada button e no VS Code criaremos a seguinte estrutura de arquivos.

Biblioteca de Botões para Arduino
  • 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
};


#endif

button.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:

  1. Faça um .zip da pasta button que criamos ou baixe a biblioteca como .zip
    1. Acesse o site DownGit, uma ferramenta que permite baixar pastas individuais de repositórios no GitHub
    2. Cole o seguinte link no campo indicado: https://github.com/guilhermefernandesk/ESP32-C6/tree/main/button
    3. Clique em “Download” para baixar a pasta button como um arquivo .zip.
  2. Vá em Sketch -> Include library -> add .zip library…
Biblioteca de Botões para Arduino
  1. 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.

Referências

ESP32-C6 na Prática

ESP32-C6 na Prática: Criando um Web Server de Tempo Real ESP32-C6 na Prática: Sincronizando a Hora com NTP Server
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Hardware » Microcontroladores » Criando uma Biblioteca de Botões para Arduino

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: