Executando verificação de segurança...
1

Como usar botões no Arduino?

Introdução

Contextualização

Eu sou aluno do 4º período de Engenharia Mecatrônica - Controle e Automação na Universidade de Brasília e faço parte de um grupo de robótica no qual estamos projetando um robô. Primeiro nós temos que nivelar o conhecimento dos membros do grupo tanto em programação de Arduino quanto em modelagem 3D. No momento estamos estudando Arduino e gostaria de compartilhar o meu progresso.

Objetivo

Neste post vou expor um código que desenvolvi para controlar botões no Arduino.

Código

Classe

Para poder criar um botão em qualquer pino e tornar mais simples o uso das funções pertinentes a um botão eu decidi criar uma classe.

class Button
{
  private:
    bool pressing = false;
    bool previous_state = false;
    bool read_state = false;
    bool released = false;
    
    int pin;
    int debounce = 150;
    
    unsigned long TIME = 0;
  public:
    Button(int pin)
    {
      this->pin = pin;
      pinMode(pin, INPUT_PULLUP);
    }
  
    bool clicked()
    {
      if (millis() - TIME > debounce)
      {
        read_state = !digitalRead(pin);
        if (read_state and !previous_state)
        {
          pressing = true;
          TIME = millis();
        }
        previous_state = read_state;
        if (pressing and !read_state)
        {
          pressing = false;
          released = true;
        }
        else
        {
          released = false;  
        }
      }
      return released;
    }
};

Em suma, o Arduino vai realizar a leitura da porta digital em que o botão está conectado, caso ele perceba mudanças de estado (tensão), quer dizer que o botão foi clicado. Mais especificamente, o botão solto deixa o circuito aberto, quando você o pressiona você fecha o circuito, mudando a tensão lida na porta. Eu usei a seguinte lógica: Clicar significa pressionar e soltar o botão, considere um click só quando você soltar depois de ter pressionado. Essa lógica funcionou melhor nos meus testes, considerando que o botão é um componente físico e está suscetível a ruídos quando clicado, por isso a variável debounce, para o Arduino esperar um tempo antes de realizar uma nova leitura. Além disso, essa lógica permite futuras implementações como realizar uma ação ao se pressionar o botão por um certo período de tempo.

Completo

Para testar se a classe estava funcionando eu desenvolvi um circuito simples que consiste em um Arduino UNO, um botão e um led, quando o botão é clicado ele muda o estado do led (ligado ou desligado).

#define bt_1 11
#define led_1 12

class Button
{
  private:
    bool pressing = false;
    bool previous_state = false;
    bool read_state = false;
    bool released = false;
    
    int pin;
    int debounce = 150;
    
    unsigned long TIME = 0;
  public:
    Button(int pin)
    {
      this->pin = pin;
      pinMode(pin, INPUT_PULLUP);
    }
  
    bool clicked()
    {
      if (millis() - TIME > debounce)
      {
        read_state = !digitalRead(pin);
        if (read_state and !previous_state)
        {
          pressing = true;
          TIME = millis();
        }
        previous_state = read_state;
        if (pressing and !read_state)
        {
          pressing = false;
          released = true;
        }
        else
        {
          released = false;  
        }
      }
      return released;
    }
};

Button button_1(bt_1);

bool led_state = false;

void setup()
{
  pinMode(led_1, OUTPUT);
}

void loop()
{
  if (button_1.clicked())
  {
    led_state = !led_state;
  }
  digitalWrite(led_1, led_state);
}

Circuito

Você pode observar e testar o circuito no tinkercad.

Conclusão

Eu não sei quão extenso e técnico eu devo ser, então caso queira detalhes adicionais eu posso tentar te ajudar nos comentários do post.

Se ficou interessado em Arduino eu tenho duas recomendações de canais no youtube os quais eu uso para estudar.

Você também pode colocar essa classe em uma biblioteca e apenas importá-la para os códigos que quiser, nesse vídeo do WR Kits você aprende a como fazer isso.

Vou deixar abaixo referências para alguns posts que podem ser úteis para você.

Carregando publicação patrocinada...