Lendo um botão

Seguindo a linha de experimentos, vamos agora aprender sobre estados lógicos, e como trabalhar com dispositivos de entrada de dados.

!Informações Importantes

Até este ponto, a nossa experiência tem sido muito unilateral. Piscar LEDs, emitir som com o Buzzer, tudo considerado como saída. Vamos mudar um pouco a abordagem, e ler algum sinal de entrada.

As entradas são sinais ou valores enviados externamente para um sistema. Alguns dos componentes de entrada mais comuns são botões ou interruptores. Botões de um teclado por exemplo, são uma entrada para o seu computador, porque eles enviam dados para esse sistema.

!Identificando os Componentes

A imagem abaixo mostra os botões do Nanoshield Interface, eles estão ligados no pino A0 do Arduino (mais detalhes nos próximos projetos).

Botão Interface

!Componentes de código

Vamos introduzir uma nova função, além de um adendo no if.

Digital Input: digitalRead([pino])

A função digitalRead() é usada para ler o estado lógico de um pino. Ela é capaz de dizer se a tensão neste pino é alta (~ 5V) ou baixa (~ 0V), ou em outras palavras, dizer se o pino tem estado lógico 1 ou 0 (ou ainda HIGH/LOW). Veja que a função digitalRead() não mede efetivamente qual é a tensão no pino, ela apenas nos diz se o nível lógico é 1 ou 0, o que é suficiente quanto trabalhamos com sistemas digitais.

Há apenas um parâmetro para a função digitalRead() - o número do pino que você quer ler, como por exemplo digitalRead(A0) para ler o estado lógico do pino A0. O digitalRead() funciona com todos os pinos do Arduino de D2 até D13 e de A0 até A5 (as únicas exceções são os pinos A6 e A7).

No Arduino, por padrão, todos os pinos já vêm previamente configurados como entrada, desta forma não é necessário configurá-lo novamente para utilizar a função digitalRead().

A função digitalRead() é diferente das outras, pois ela retorna um valor, que é o estado lógico do pino. Dessa forma, ao invés de apenas escrever a chamada de função e pular para a próxima linha, nós realmente temos que usar a função digitalRead() em conjunto com outros trechos de código.

A função digitalRead() vai retornar um dos dois valores: alto ou baixo. Você pode usar esse valor de retorno como parte de um teste condicional em uma declaração se, por exemplo:

if (digitalRead(pino) == LOW)
{
    // O Botão está pressionado, faça algo!
}

Ou, você pode armazenar o valor da função digitalRead() dentro de uma variável: nome_variavel = digitalRead(2);

If/Else:if( [condição] ){ [consequência caso verdadeiro] } else { [consequência caso falso] }

Vamos usar uma extensão da declaração do if, o else. if / else nos permite tomar uma ação se a condição for verdadeira e uma ação diferente se ela é falsa.

Aqui está a estrutura de um if / else:

 
if ( [condição] )
{
    // A condição é verdadeira, faça algo..
}
else
{
    // Ops, a condição é falsa, faça outra coisa!
}

if / else é realmente útil quando você está lidando com saídas digitais, que só pode estar em um dos dois estados. Se um botão é pressionado, fazer alguma coisa, caso contrário, fazer outra coisa.

!Executando no Arduino

Execute o código abaixo no seu Arduino. Após fazer o upload do código, você pode pressionar o botão RIGHT do Nanoshield Interface para acender um dos LEDs. No código abaixo você pode conferir os comentários para entender melhor o seu funcionamento.

//Pino ligado ao push-button
int buttonPin = A0;
//Definindo a saida do pino para maior clareza ( LED Verde)
int led2 = A2;
//Variavel para fazer a checagem
int buttonState;

void setup()
{
  
  // Define o pino do botao como entrada
  pinMode(buttonPin, INPUT);
  // Define o pino do Led Verde como Saida
  pinMode(led2, OUTPUT);
}

void loop() 
{
  // Verifica se o estado do botao foi alterado
  buttonState = digitalRead(buttonPin);
  //Se o botao foi apertado
  if (buttonState == LOW) 
  {
   // Liga o LED    
    digitalWrite(led2, HIGH);  
  } 
  else 
  {
    // Apaga o LED
    digitalWrite(led2, LOW); 
  }
}

!Sua vez!

Tente modificar o código acima para que o LED amarelo sempre esteja aceso e quando o botão for apertado o buzzer emita um som.

Resposta

//Pino ligado ao push-button
int buttonPin = A0;
//Definindo a saida do pino para maior clareza ( LED Amarelo)
int led1 = A1;
//Definindo a saida do pino para maior clareza ( LED Verde)
int led2 = A2;
//Variavel para fazer a checagem
int buttonState;
//Pino ligado ao buzzer
int buzzer = 5;

void setup()
{
  // Define o pino do botao como entrada
  pinMode(buttonPin, INPUT);
  // Define o pino do Led Amarelo como Saida
  pinMode(led1, OUTPUT);
  // Define o pino do Led Verde como Saida
  pinMode(led2, OUTPUT);
  // Define o pino do Buzzer como Saida 
  pinMode(buzzer,OUTPUT);  
  // Liga o LED Amarelo
  digitalWrite(led1, HIGH);
}

void loop() 
{
  // Verifica se o estado do botao foi alterado
  buttonState = digitalRead(buttonPin);
  //Se o botao foi apertado
  if (buttonState == LOW) 
  {
   // Liga o LED Verde   
    digitalWrite(led2, HIGH);
    // Aciona o Buzzer na frequencia relativa ao Sol em Hz
    tone(buzzer,392);    
  } 
  else 
  {
    // Apaga o LED Verde
    digitalWrite(led2, LOW);
    noTone(buzzer);  
  }
}