Como ler um sensor no Arduino (entrada digital e analógica)

Todo projeto de eletrônica que interage com o mundo real precisa de sensores. Um botão que você aperta, um potenciômetro que você gira, um sensor de luz que percebe se está claro ou escuro: tudo isso são entradas que o Arduino consegue ler. Neste artigo você vai aprender os dois jeitos de ler um sensor: a entrada digital e a entrada analógica. São conceitos simples, e depois que você entende a diferença, um mundo de projetos se abre.

Digital x analógica: qual a diferença?

A diferença é direta:

TipoO que lêValores possíveisExemplos de sensor
DigitalSó dois estadosHIGH (ligado) ou LOW (desligado)Botão, chave, sensor de presença
AnalógicaUma faixa contínuaUm número de 0 a 1023Potenciômetro, LDR (luz), sensor de temperatura

Pense assim: a entrada digital é como um interruptor de parede, só liga ou desliga. A analógica é como o dimmer que regula a intensidade da luz, tem mil posições entre o mínimo e o máximo.

Lendo uma entrada digital (botão)

Um botão comum tem dois estados: apertado ou solto. Para o Arduino ler isso, usamos o comando digitalRead(), que devolve HIGH ou LOW.

Mas tem um detalhe importante. Quando o botão está solto, o pino fica "solto no ar" (o pessoal chama de flutuante), e o Arduino lê valores aleatórios. Para resolver isso, usamos um resistor de pull-up ou pull-down:

  • Pull-up: um resistor puxa o pino para o nível alto (5V) quando o botão está solto. Apertar o botão leva o pino ao LOW.
  • Pull-down: um resistor puxa o pino para o nível baixo (GND) quando solto. Apertar leva ao HIGH.

A boa notícia: o próprio Arduino tem resistores de pull-up internos. Você ativa com INPUT_PULLUP e nem precisa de resistor externo. Ligue um lado do botão no pino 2 e o outro lado no GND:

const int pinoBotao = 2;

void setup() {
  pinMode(pinoBotao, INPUT_PULLUP); // ativa o pull-up interno
  Serial.begin(9600);
}

void loop() {
  int estado = digitalRead(pinoBotao);

  // Com pull-up, botão SOLTO = HIGH e botão APERTADO = LOW
  if (estado == LOW) {
    Serial.println("Botao APERTADO");
  } else {
    Serial.println("Botao solto");
  }

  delay(100); // evita floodar o Monitor Serial
}

Repare na lógica invertida: com INPUT_PULLUP, o botão apertado retorna LOW. Isso confunde no começo, mas é o jeito mais limpo de ligar um botão, porque dispensa resistor externo.

Lendo uma entrada analógica (potenciômetro e LDR)

Aqui entra o comando analogRead(). Ele lê os pinos analógicos (marcados como A0, A1, etc.) e devolve um número de 0 a 1023. Por quê esse número esquisito? Porque o Arduino usa um conversor de 10 bits, e 2 elevado a 10 dá 1024 possibilidades: de 0 até 1023.

Na prática:

  • 0 significa 0 volts no pino.
  • 1023 significa 5 volts no pino.
  • Qualquer valor no meio é uma tensão proporcional.

Potenciômetro

O potenciômetro é o sensor perfeito para começar. Ligue os pinos das pontas em 5V e GND, e o pino do meio (o cursor) em A0. Ao girar o botão, a tensão no meio varia de 0 a 5V:

const int pinoPot = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int valor = analogRead(pinoPot); // le de 0 a 1023
  Serial.print("Valor do potenciometro: ");
  Serial.println(valor);
  delay(200);
}

Gire o potenciômetro e veja o número mudar suavemente de 0 a 1023.

LDR (sensor de luz)

O LDR é um resistor que muda conforme a luz que recebe. Ele não liga sozinho no analógico: precisa de um resistor fixo (por exemplo, 10k ohms) formando um divisor de tensão. Ligue o LDR entre 5V e o pino A0, e o resistor de 10k entre o pino A0 e o GND. O código é idêntico ao do potenciômetro, só muda o que você faz com o valor:

const int pinoLDR = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int luz = analogRead(pinoLDR);
  Serial.print("Nivel de luz: ");
  Serial.println(luz);

  if (luz < 300) {
    Serial.println("Esta escuro!");
  }

  delay(200);
}

Tampe o LDR com a mão e veja o número cair. Aponte uma lanterna e ele sobe. Simples assim.

Como ver os valores no Monitor Serial

Você reparou no Serial.begin(9600) e no Serial.println()? Essa é a ferramenta que transforma você num detetive de eletrônica. O Monitor Serial mostra na tela do computador o que o Arduino está lendo.

Para abrir, no Arduino IDE clique no ícone da lupa no canto superior direito, ou use o atalho Ctrl + Shift + M. Um detalhe que pega muita gente: a velocidade (baud rate) do canto inferior do Monitor precisa ser a mesma do seu código. Se você escreveu Serial.begin(9600), selecione 9600 no Monitor, senão vai aparecer só caracteres embaralhados na tela.

Erros comuns

  • Confundir os comandos: digitalRead() é só para botões e chaves (HIGH/LOW). analogRead() é para sensores de faixa (0 a 1023). Não misture.
  • Ler pino digital com analogRead: você pode ler pinos analógicos com digitalRead, mas não o contrário na maioria dos pinos. Para sensores de faixa, use sempre os pinos A0 a A5.
  • Esquecer o pull-up no botão: sem INPUT_PULLUP (ou um resistor externo), o botão vai dar leituras malucas. Sempre defina o modo do pino no setup().
  • Baud rate errado: código em 9600 e Monitor em 115200 mostra lixo na tela. Deixe os dois iguais.
  • Achar que 5V vira 1023 no digital: no digitalRead, uma tensão bem alta (perto de 5V) é lida como HIGH e uma bem baixa (perto de 0V) como LOW; no meio da faixa a leitura é indefinida. A escala 0-1023 só existe no analógico.
  • Lógica invertida do pull-up: lembre que com INPUT_PULLUP o botão apertado retorna LOW. Não é bug, é o esperado.

O próximo passo

Ler um sensor é a base de praticamente todo projeto maker: um robô que desvia de obstáculos, uma horta que rega sozinha quando o solo seca, uma lâmpada que acende no escuro. Tudo começa com um digitalRead ou um analogRead e um olho no Monitor Serial.

Pegue seu Arduino, um botão e um potenciômetro, e brinque com esses dois códigos até os números fazerem sentido na sua cabeça. Quando você quiser ir além (transformar essas leituras em ações, controlar motores, montar projetos completos do zero), é exatamente isso que a gente constrói passo a passo no Curso Maker.