Como usar o push button com Arduino (programação)

Objetivo

Nesta dica vamos mostrar como usar chaves tácteis, também denominadas de push buttons ou botões de pressão, em programação com Arduino.

Chave tátil (push button):  é um dos componentes eletrônicos mais utilizados em projetos. Um Push button (botão de pressão) é uma chave que contém um botão que ao ser pressionado abre ou fecha os contatos do dispositivo, abrindo ou fechando o circuito onde ele está conectado. É comum que um push button possua ação de contato momentânea, o que significa que a conexão é aberta ou fechada apenas momentaneamente, enquanto o botão estiver sendo pressionado.

 

Esse tipo de chave pode ser normalmente aberta (NOPB - Normally Open Push button) quando a conexão entre os contatos é estabelecida ao pressionarmos o botão e normalmente fechada (NCPB - Normally Closed Pushbutton), quando a conexão é interrompida ao pressionarmos o botão.

Para o nosso exemplo vamos utilizar o tipo de push button mais comum que é o push button normalmente aberto, ou seja, um botão que conduz corrente elétrica somente quando está pressionado.

Push button normalmente aberto: NOPB (Normally Open Push button), é um interruptor que fecha o circuito e deixa a corrente passar quando pressionado; ao soltar o botão, o circuito é interrompido novamente (daí o nome "normalmente aberto").

Pushbutton Normalmente Aberto

 

Formas de montagem do push button

Ao montarmos um circuito utilizando um push button, podemos faze-los de 3 formas: Resistor Pull-down, Resistor Pull-up e Pull-up interno do Arduino.

Pull-down e Pull-up

Observe no circuito abaixo onde mostramos 2 formas de montagem do push button: Resistor Pull-down e Resistor Pull-up.

Obs.: Os resistores pull-up e pull-down garantem um nível lógico estável quando por exemplo uma tecla não está pressionada. Geralmente utiliza-se um resistor de 10KΩ para esse propósito. A seguir é exibida a ligação desses resistores no circuito para leitura de tecla do botão:

Entradas-e-Saídas-digitais-Arduino-pull-up-pull-down

Desta forma obteremos:

Circuito com resistor Pull-down: Nível lógico (LOW ou 0) no estado normal (não passa corrente para a entrada do Arduino) e Nível lógico (HIGH ou 1) quando pressionado (passa corrente para a entrada do Arduino).

Imagem relacionada

Circuito com resistor Pull-up: Nível lógico (HIGH ou 1) no estado normal e Nível lógico (LOW ou 0) quando pressionado.

Resultado de imagem para pull-up resistor arduino low and high

Circuito Pull-up interno do Arduíno: Nível lógico  (HIGH ou 1) no estado normal e Nível lógico (LOW ou 0) quando pressionado. Neste caso não precisaremos utilizar um resistor para garantir um nível estável, pois utilizaremos um resistor interno do Arduino. Para isto, basta habilitar o resitor pull-up interno do Arduino através da programação.

 Resultado de imagem para pull-up VS pull-down resistor arduino (low high)

 Veja a tabela abaixo com um resumo:

TIPO RESISTOR RESISTOR NÍVEL LÓGICO NORMAL NÍVEL LÓGICO PRESSIONADO pinMode()
Pull-down Resistor de 10KΩ

LOW (0)

Baixo ou 0V

HIGH (1)

Alto ou 5V

 INPUT
Pull-up Resistor de 10KΩ

HIGH (1)

Alto ou 5V

LOW (0)

Baixo ou 0V

INPUT
Pull-up interno Arduino Não precisa resistor

HIGH (1)

Alto ou 5V

LOW (0)

Baixo ou 0V

INPUT_PULLUP

Identificar se o botão está pressionado

Quando utilizamos um botão (push button), a primeira coisa que precisamos saber é se o botão está ou não pressionado.  Veja o código abaixo, onde utilizamos um resistor Pull-down (veja um exemplo similar no Projeto 02 - Led acende com push button pressionado - resistor pull-down).

/*******************************************************************************
*
*   Push button liga led quando pressionado (pull down)
*                   http://squids.com.br/arduino
*
*******************************************************************************/

const int ledPin = 2; //led no pino 2
const int Botao = 12; //botao no pino 12
int estado; //Variavel para ler o status do pushbutton

void setup(){
    pinMode(ledPin, OUTPUT); //Pino do led será saída
    pinMode(Botao, INPUT); //Pino com botão será entrada
}

void loop(){
    estado = digitalRead(Botao); //le o estado do botão - HIGH OU LOW

    if (estado == HIGH){ //Se botão estiver pressionado (HIGH)
        digitalWrite(ledPin, HIGH); // acende o led do pino 2.
    }
    else{ //se não estiver pressionado (LOW)
        digitalWrite(ledPin, LOW); //deixa o led do pino 2 apagado
    }
}

Como montamos o circuito com um resistor Pull-down, podemos identificar se o botão está pressionado através do comando if (estado == HIGH), pois o nível lógico do botão pressionado é alto.

Portanto, se montarmos o circuito com um resistor Pull-up ou Pull-up interno, utilizaremos o comando if (estado == LOW) para identificarmos se o botão está pressionado, pois neste caso o nível lógico do botão pressionado é baixo (veja os projetos Projeto 02a - Led apaga com push button pressionado - resistor pull-up e Projeto 02b - Led apaga com push button pressionado - pull-up interno do Arduino)

NOTA: Para padronizarmos os comandos sem fazer confusão se o circuito foi montado com resistor Pull-down ou Pull-up, podemos utilizar o comando if (!estado) para identificar se o botão está pressionado , ou seja, quando estado == false e o nível lógico do botão for LOW (0). Também podemos utilizar o comando if (estado) para identificar se o botão está pressionado, ou seja, quando estado == true e o nível lógico do botão for HIGH (1).

Veja o código abaixo utilizando o comando padronizado :

/*******************************************************************************
*
*      Push button apaga led quando pressionado (pull down)
*                   http://squids.com.br/arduino
*
*******************************************************************************/

const int ledPin = 2; //led no pino 2
const int Botao = 12; //botao no pino 12
int estado; //Variavel para ler o status do pushbutton

void setup(){
    pinMode(ledPin, OUTPUT); //Pino do led será saída
    pinMode(Botao, INPUT); //Pino com botão será entrada
}

void loop(){
    estado = digitalRead(Botao); //le o estado do botão - HIGH (1) OU LOW (0)
    
  
    if (!estado){ // Verdadeiro se estado = 0 (LOW)  
        digitalWrite(ledPin, HIGH); // acende  led do pino 2.
    }
    else{ // verdadeiro se o estado = 1 (HIGH)
        digitalWrite(ledPin, LOW); //deixa o led do pino 2 apagado
    }
} 

OBSERVAÇÃO: Não esqueça, se você utilizar a montagem do circuito com resistor pull-up interno do Arduino, utilize pinMode(Botao, INPUT_PULLUP).

Veja abaixo o resumo para o nosso exemplo:

Tipo Resistor
pinMode() Verificar se o botão está pressionado Nível lógico pressionado botão pressionado usando if (!estado) botão pressionado usando if (estado)
Pull-down  INPUT if (estado == HIGH)

HIGH (1)

Alto ou 5V

 false (apaga o led) true (acende o led)
Pull-up INPUT if (estado == LOW)

LOW (0)

Baixo ou 0V

true (acende o led)  false (apaga o led)
Pull-up interno Arduino INPUT_PULLUP if (estado == LOW)

LOW (0)

Baixo ou 0V

true (acende o led)  false (apaga o led)

Experimente: Teste o códigos de exemplo acima utilizando os 3 circuitos, pull-down, pull-up e pull-up interno do arduino.

Utilizando o push button como interruptor (função liga e desliga)

Como vimos anteriormente, os botões de pressão (push buttons) apenas mudam seu estado quando pressionados, voltando ao seu estado original quando o botão é liberado. Neste tópico, vamos criar uma rotina padrão para atribuir a um só botão duas funções de ligar e desligar um componente eletrônico qualquer.

Como exemplo, vamos apresentar um circuito onde o botão servirá como um interruptor para ligar e desligar um led. O código que apresentaremos servirá para as 3 formas de montagem do push button. Veja o projeto completo: Projeto 04a - Push Button como interruptor - padrão para resistor pull-up e pull-down

Utilize o código abaixo para os seus projetos:

Obs.: Use o código abaixo para circuito pull-down quando quiser acender ou apagar o led ao pressionar o botão.  Para circuitos pull-up, altere para if(estado) e while (digitalRead(buttonPin) sem o operador ( ! ), caso contrário o led irá acender ou apagar apenas quando soltar o botão. Teste o código abaixo nas duas formas:

/*******************************************************************************
*
*       Push button com funão liga / desliga (qualquer montagem)
*                   http://squids.com.br/arduino
*
*******************************************************************************/

const int buttonPin = 2; // número do pino pushbutton
const int ledPin = 12; // número do pino LED
 
int estado = 0; // variável para leitura do pushbutton
int guarda_estado;  // variável para armazenar valores do pushbutton
 
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT); // utilize INPUT_PULLUP com resistor interno do Arduino
}
 
void loop(){
// le o estado pushbutton: ligado (HIGH) ou desligado (LOW)
estado = digitalRead(buttonPin); // le o estado do push button HIGH ou LOW

if (!estado) {  // verifica se o estado é LOW ou 0 (true)       
    guarda_estado = !guarda_estado; // inverte valor da variável guarda_estado
    while (!digitalRead(buttonPin)) {  } //esperera soltar o botão
    delay(50); 
}
 
if (guarda_estado == HIGH) {
    digitalWrite(ledPin, HIGH); // liga o led
} else {
    digitalWrite(ledPin, LOW); // liga o led
}
}

Veja o resumo abaixo:

Tipo Resistor
pinMode() Nível lógico pressionado ligar e desligar ao pressionar o botão ligar e desligar ao   soltar o botão
Pull-down  INPUT

HIGH (1)

Alto ou 5V

 if(!estado)

!digitalRead(buttonPin)

(false - LOW)

 if(estado)

digitalRead(buttonPin)

(true - HIGH)

Pull-up INPUT

LOW (0)

Baixo ou 0V

if(estado)

digitalRead(buttonPin)

(true - HIGH)

if(!estado)

!digitalRead(buttonPin)

(false - LOW)

Pull-up interno Arduino INPUT_PULLUP

LOW (0)

Baixo ou 0V

if(estado)

digitalRead(buttonPin)

(true - HIGH)

if(!estado)

!digitalRead(buttonPin)

(false - LOW)

 Experimente: Teste o código de exemplo acima utilizando os 3 circuitos, pull-down, pull-up e pull-up interno do arduino.

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Compartilhe:

Doações

Contribua pra manter o site online :)

Inscreva-se no canal Squids

Squids Arduino News

CB09 : Dimmer para leds com CI 555 sem Arduino Objetivo Criar um circuito gerador de pulsos modulados (PWM - Pulse Width Modulation) para alterar a intensidade do brilho de um led. Para este pro...

Como usar temporizadores no Arduino

Funções de temporização na programação com Arduino Objetivo Nesta dica vamos mostrar utilizar as diversas funções de temporização disponíveis na programação com Arduino. As funções de Temporizaç...

Intermediário - Projeto 11 Contador de acessos utilizando leds infravermelhos e Arduino Objetivo O objetivo deste projeto é criar um sistema de contagem de visitantes que entram e saem de uma s...

Básico - Projeto 94 Simulando um botão na tela do display OLED Objetivo O objetivo deste projeto é simular um botão de controle no display OLED. O botão servirá para controlar a iluminação de u...

Básico - Projeto 93 Criando um relógio analógico com Oled SSD1306 Objetivo O objetivo deste projeto é exibir no display OLED um relógio com estilo analógico, ou seja, com ponteiros. Utilizaremo...

Outros artigos

Mais: Circuitos básicos Dicas de Software Projetos Intermediários Projetos Básicos Desafios Jogos

Você está preparado?

Topo