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.
-
Brincando com ideias (Para iniciar)
-
WR Kits (Para aprofundar)
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ê.