Sempre é interessante criar uma forma de interagir com a sua programação, e uma forma de fazer isso é usar botões. Mas pra isso, precisamos aprender a como saber se algum botão foi pressionado na programação. A aula de hoje vai mostrar um comando que serve para leitura dos pinos digitais, possibilitando assim, diferentes interações entre você e o Arduino, além dos botões.

Caso você queira aprender a controlar alguns LEDs diretamente, veja a aula anterior. E, novamente, vale lembrar que você pode testar virtualmente o que vou ensinar usando o site Tinkercad, sem precisar de um Arduino.


Princípio de funcionamento

O botão, caso você não saiba, fecha o contato de um lado para o outro. Isto é, interligado um lado dele com o outro. Nas imagens abaixo, temos dois tipos de botões e o circuito que representa cada um respectivamente.

botões

esquemático dos botões

E pra saber se algum botão foi pressionado, basicamente a gente pode ligar ele, de um lado, no GND ou 5v e, do outro, em algum pino digital. Sendo assim, esse pino digital, quando o botão for pressionado, irá ler ou sinal de nível baixo (GND) ou sinal de nivel alto (5v) dependendo em qual dos dois você ligou.

Porém as leituras podem apresentar um sério problema, que é o seguinte: imagine que o botão não está sendo pressionado, qual é o valor que está sendo lido? Não tem como saber. Então, existe uma técnica que é pra deixar essa leitura constantemente em nível alto (5v) ou nível baixo (GND) até que o botão seja pressionado e isso se altere. A técnica é usar um resistor de pull-up ou pull-down, dependendo da sua alimentação. Por exemplo:

resistor de pull-up

Nesse caso, o botão está ligado ao GND e, quando ele for pressionado, o pino digital irá receber sinal de nível baixo (GND). E no caso do botão não ser pressionado, o resistor de pull-up (4,7KΩ) ligado ao 5v, irá garantir que o pino leia 5v nessa condição. Entretanto, pra nossa sorte, já existe um resistor de pull-up interno nos pinos do Arduino, que pode ser configurado pela programação. Entenda sobre resistência pull-up neste post. Veremos isso logo a frente.


Circuito

A ideia do circuito é controlar dois LEDs a partir de dois botões, sendo que cada botão controla um dos LEDs.

circuito leitura botões arduino

De acordo com o circuito acima que é bem simples, temos: dois LEDs ligados nos pinos 4 e 5 (e na outro ponta eles estão ligados em um resistor de 220Ω). E também, dois botões ligados, de um lado, no GND, e do outro nos pinos 2 e 3.


Programação

A parte da programação não tem nenhum mistério.

Explicação passo a passo

Primeiro de tudo, vamos nomear nossos pinos e colocá-los em variáveis:

1
2
3
4
int led1 = 4;
int led2 = 5;
int bot1 = 2;
int bot3 = 3;

Depois, como vimos na aula anterior, vamos configurar nossos pinos dos LEDs como saída no setup.

1
2
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);

Para o pino dos botões, nós devemos configurar eles como entrada (já que iremos ler valores deles) e, também, temos que ativar o resistor de pull up como informei anteriormente. Pra fazer isso é só digitar INPUT_PULLUP no parâmetro que você configura se o pino é entrada ou saída:

1
2
pinMode(bot1, INPUT_PULLUP);
pinMode(bot2, INPUT_PULLUP);

Agora, no loop, basta criarmos nossa condição pra testar se o botão foi pressionado. O comando que vai ajudar a gente é o “digitalRead(pino)” que faz uma leitura digital do pino que você informar e retorna o valor de 0 se o pino estiver recebendo sinal de nível baixo, ou retorna 1 se o pino estiver recebendo sinal de nível alto. Portanto, basta criar um if pra testar a condição do botão pressionado e acionar o LED.

1
2
3
4
5
if(digitalRead(bot1) == 0){
  digitalWrite(led1, HIGH);
}else{
  digitalWrite(led1, LOW);
}

E a mesma coisa deve ser feita pro botão 2 (bot2).

Código completo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int led1 = 4;
int led2 = 5;
int bot1 = 2;
int bot2 = 3;

void setup(){
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(bot1, INPUT_PULLUP);
  pinMode(bot2, INPUT_PULLUP);
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
}

void loop(){
  if(digitalRead(bot1) == 0){
    digitalWrite(led1, HIGH);
  }else{
    digitalWrite(led1, LOW);
  }

  if(digitalRead(bot2) == 0){
    digitalWrite(led2, HIGH);
  }else{
    digitalWrite(led2, LOW);
  }
}