Início
/
Software
/
Dicas de Software
/
Como usar push button com Arduino (programação)
Como usar push button com Arduino (programação)
Angelo Luis Ferreira | 14/09/2018
Acessos: 55.871
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. Leia também: Onze maneiras diferentes de ligar e desligar um led com push button e 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").
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:
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).
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.
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.
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
O anúncio abaixo ajuda a manter o Squids Arduino funcionando
Comentários