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

Você está preparado?

Squids Arduino News

Desafio 82 - Projeto 92 Relógio digital com temperatura, umidade e datas Com base no projeto Projeto 92 - Criando um relógio digital com OLED SSD1306, módulo DS3231 e Arduino resolva os seguin...

Básico - Projeto 92 Criando um relógio digital com Oled SSD1306 - bibliotecas Adafruit Objetivo O objetivo neste projeto é criar um relógio digital usando um display OLED junto com o Real Time ...

Desafio 81 - Projeto I09 Controlando 2 motores com driver L9110s (menu via display LCD) Com base no projeto I09 - Motores DC com Driver Ponte H L9110 e Arduino - Controle de 4 velocidades pelo ...

Intermediário - Projeto 09 Motores DC com driver ponte H L9110s e Arduino - 4 velocidades Objetivo Neste tutorial vamos mostrar como controlar a velocidade de 2 motores CC (corrente contínua) a...

Básico - Hub 008 Usar o módulo display 4 dígitos 74HC595   Sugerido por: Tim Santos Objetivo O objetivo é adaptar o  Projeto 63 - Usando o módulo TM1637 (display 4 dígitos) com Arduino e u...

Outros artigos

Mais: Desafios Projetos Básicos Projetos Intermediários Básico

Topo