Arduino 4: entrada digital

Em um circuito Arduino, chaves não são usadas para ligar ou desligar um componente diretamente (como em circuitos eletrônicos tradicionais) mas para fornecer um dado de entrada para o programa, que poderá usá-lo para tomar decisões (a decisão pode ser inclusive para ligar ou desligar o componente.) Portanto, uma chave deve ser ligada diretamente a um pino digital de entrada.

Não é preciso chamar a instrução pinMode() no setup para configurar entradas (se for usada, deve declarar a funcionalidade do pino como INPUT.) Nesse modo, quando a chave estiver fechada ela deverá fornecer ou 5V ou 0V para o pino. Quando aberta, o estado do pino é indefinido.

Experimento 25 – Reagindo ao acionamento de chaves liga-desliga

Material necessário:

  • Arduino Nano + cabo USB + computador
  • Um LED de qualquer cor
  • Resistor de 220 Ω
  • 1 chave táctil de pressão
  • Protoboard, fios e jumpers

Monte o circuito abaixo (é o mesmo circuito do experimento anterior, acrescentando a chave):

Ligamos uma chave de pressão (normalmente aberta) entre o pino 3 e GND. Quando ela não estiver pressionada, não haverá sinal algum no pino 3 (estado indefinido), mas quando ela estiver apertada, ela fará a conexão entre o pino D3 e GND e seu estado será LOW. Usamos uma expressão condicional para testar o estado do pino, com a seguinte regra: se o estado do pino 3 for LOW, o LED será aceso, caso controário (se for qualquer outro estado – indefinido ou HIGH), o LED será apagado:

#define CHAVE 3
#define LED   8

void setup() {
    pinMode(LED, OUTPUT);
}

void loop() {
    int estado = digitalRead(CHAVE);
    delay(10); // espera 10 milissegundos antes de testar
    if(estado == LOW) {
        digitalWrite(LED, HIGH);
    } else {
        digitalWrite(LED, LOW);
    }
}

O loop repete continuamente lendo o estado da chave e usando o estado lido para comparar com o valor LOW (0V).

Se a chave estiver aberta, o estado não é LOW. É indefinido, portanto, o conteúdo do bloco if é ignorado, mas o bloco else é executado. A instrução dentro do else mantém o LED apagado, já que fornece 0V (LOW) para a saída 8.

Se a chave estiver apertada, ela faz uma ligação direta entre o pino 3 e GND, fazendo-o ter o estado LOW. Neste caso, a instrução executada muda o estado do pino 8 para HIGH, e o LED acende. Soltando o botão, ele volta ao estado indefinido, e em pouco mais de 10 milissegundos, o estado do pino 3 será testado de novo, desta vez apagando o LED. Portanto, o LED só acende enquanto o botão estiver apertado.

Entrada digital

A instrução digitalRead(número-do-pino) serve para ler o nível lógico de um pino de entrada. O valor pode ser ALTO (HIGH) ou BAIXO (LOW). Normalmente HIGH corresponde a 5V e LOW corresponde a 0V (mas na prática o Arduino irá considerar como HIGH qualquer valor de tensão de 3 volts ou mais. Valores abaixo de 3V serão considerados nível lógico LOW.

HIGH e LOW são variáveis que guardam valores inteiros (respectivamente 1 e 0), portanto o valor lido por digitalRead() deve ser armazenado em uma variável declarada como int:

int valor = digitalRead(3);

Os pinos digitais são inicialmente configurados como entradas, portanto não é necessário usar pinMode() para declará-los como tal. Se for usada deve conter a opção INPUT:

pinMode(3, INPUT);     // pino 3 é uma entrada

Lógica condicional e bloco if-else

If” significa “se”. O bloco condicional if(condição) {} recebe entre parênteses uma expressão lógica booleana, e entre as chaves uma lista de instruções que devem ser executadas somente se a expressão for verdadeira.

Expressões lógicas podem ser igualdade (operador ==), diferença (operador !=) e desigualdade (operadores >, <, >= e <=).

Observe que para testar a igualdade usa-se um duplo igual ==, já que o sinal de igual isolado é usado como operador de atribuição.

Blocos if() devem ser usados dentro de blocos loop() ou setup(), portanto é uma boa prática, ao escrever programas, endentar o conteúdo do bloco para facilitar a leitura do código (ex: digitar quatro espaços antes, para cada novo nível de chaves {…}).

Por exemplo, as instruções que começam com “int” e “if” abaixo estão dentro de loop() e endentadas 4 espaços. A instrução “digitalWrite” está dentro de if, que está dentro de loop, e endentada 8 espaços:

void loop() {
    int estado = digitalRead(3);
    if (estado == HIGH) {         // testa se estado é 5V
        digitalWrite(8, HIGH);   // “acende” componente que está no pino 8
    }
}

Um bloco if() pode ser seguido por um bloco else {}, que significa “caso contrário” e executa quando a condição não for verdadeira:

if (estado == HIGH) {         // somente se o valor de estado for 5V
    digitalWrite(8, HIGH);     // “acende” componente que está no pino 8
} else {                     // caso contrário
    digitalWrite(10, HIGH);   // acende o componente do pino 10
}

Alteração 25.1 – Invertendo o estado de acionamento

Altere o programa do último experimento para que ele acione o LED quando:

  • O estado do pino não for LOW (requer apenas alteração no código).
  • O estado do pino for HIGH (que alteração precisará ser feita no circuito?)