Trilha de aprendizado · Nível 9 · Tutorial 6

Leitura de botões nas entradas do Uno R3

Leia um botão com o pull-up interno do Uno R3 e faça um LED acompanhar o estado pressionado, interpretando corretamente o comando ativo em nível baixo.

  • Nível: Iniciante
  • Duração: 15 min
  • 7 passos
Leitura de botões nas entradas do Uno R3

O que você vai percorrer

  1. Identifique os contatos do botão Mapeie os contatos do botão momentâneo com segurança antes de conectá-lo à placa. 2 min
  2. Planeje a entrada com INPUT_PULLUP Planeje a entrada do botão no D2 usando o resistor de pull-up interno e retorno por GND. 2 min
  3. Traduza LOW em botão pressionado Converta a leitura elétrica de D2 em uma variável booleana que represente corretamente o botão pressionado. 2 min
  4. Faça o LED acompanhar a leitura Grave um sketch que lê D2 com pull-up interno e faz o LED integrado acompanhar diretamente o estado pressionado do botão. 3 min
  5. Monte e confira os estados estáveis Monte o botão entre D2 e GND com a placa desenergizada e verifique que o LED integrado acompanha os estados mantidos. 3 min
  6. Diferencie leitura repetida de novo acionamento Diferencie o estado que permanece pressionado de um novo acionamento físico e reconheça o limite do programa atual. 2 min
  7. Revise e valide a leitura do botão Revisão integrada da ligação, da leitura ativa em nível baixo e do controle do LED pelo estado mantido. 2 min

O que você vai aprender

  • Identificar os contatos do botão antes de conectá-lo à placa.
  • Configurar INPUT_PULLUP e realizar a ligação correspondente.
  • Converter a leitura elétrica em uma condição de botão pressionado.
  • Controlar o LED conforme o nível mantido do botão.
  • Explicar por que leituras sucessivas não correspondem necessariamente a novos acionamentos.

Antes de começar

  • Decisões com if e else no firmware
  • Entradas definidas com pull-up e pull-down
  • Resistência e continuidade com o multímetro

Passo 1 de 7

Identifique os contatos do botão

Mapeie os contatos do botão momentâneo com segurança antes de conectá-lo à placa.

Separe e isole o botão

Prepare a identificação

Antes da montagem, separe seu Uno R3, computador com a IDE Arduino já configurada, cabo USB de dados, protoboard, jumpers, botão momentâneo normalmente aberto e multímetro.

Neste step, use somente o botão e o multímetro. Deixe o botão fora da protoboard e sem qualquer ligação ao Uno ou ao USB. O objetivo é descobrir quais terminais realmente mudam de conexão ao pressionar.

Atenção

Segurança

Não teste continuidade em um componente conectado a um circuito alimentado. Desconecte o USB da placa e mantenha o botão isolado durante este mapeamento.

Entenda os pares internos

Dois grupos elétricos

Um botão momentâneo normalmente aberto tem dois grupos elétricos. Com o botão solto, não há continuidade entre os grupos. Ao pressioná-lo, um grupo passa a se conectar ao outro.

Em muitos modelos com quatro terminais, os dois terminais de um mesmo lado já têm continuidade permanente entre si. Portanto, quatro terminais físicos não significam quatro contatos independentes.

Como interpretar quatro terminais

Diagrama de um botão de quatro terminais: dois pinos de cada lado pertencem ao mesmo grupo elétrico; pressionar une os dois grupos.

Escolha um terminal de cada grupo, e não dois terminais que já estejam unidos permanentemente.

Teste fora do circuito

Mapeie o botão próprio

Com o multímetro no teste de continuidade, investigue seu botão sem confiar apenas na aparência:

  1. Encoste as pontas de prova em dois terminais e observe se há sinal de continuidade com o botão solto.
  2. Mantenha as pontas e pressione o botão. Observe se o resultado muda.
  3. Repita com outros pares até identificar dois grupos: os pares que conduzem sempre pertencem ao mesmo grupo.
  4. Escolha um terminal de um grupo e um terminal do outro grupo.

O par escolhido deve ficar desconectado quando solto e conectado somente durante o pressionamento.

Dica

Não presuma a pinagem

Se o seu botão tiver formato ou terminais diferentes do desenho, isso não é um problema. A medição de continuidade é a evidência: use os dois terminais cujo estado muda entre solto e pressionado.

Pratique a seleção do par

Confira sua interpretação

Relacione cada situação ao resultado esperado de continuidade em um botão normalmente aberto de quatro terminais.

Faça as correspondências.

Toque em um item e depois no par correspondente.

Confirme o par escolhido

Registre a verificação

No seu botão, descreva o resultado do teste de continuidade no par que você selecionou: o que ocorre com o botão solto e o que ocorre quando ele é pressionado?

Escreva pelo menos 20 caracteres (0/20).

Passo 2 de 7

Planeje a entrada com INPUT_PULLUP

Planeje a entrada do botão no D2 usando o resistor de pull-up interno e retorno por GND.

Defina o circuito antes de montar

Entrada com pull-up interno

Com o par de contatos do botão já identificado, planeje uma entrada definida sem resistor externo: use o pull-up interno do Uno R3.

INPUT apenas coloca o pino no modo de entrada; ele não habilita o resistor interno. Já INPUT_PULLUP configura a entrada e habilita esse resistor no ATmega328P. Assim, quando o botão está aberto, D2 não fica flutuando.

Nesta prática, o botão não leva alimentação externa ao pino. Ele apenas fecha o caminho entre D2 e GND quando pressionado.

Ligação planejada

Diagrama de D2 ligado a um lado do botão e GND ao outro, com um resistor de pull-up interno ligado à entrada.

O botão fecha D2 com GND; o pull-up já está dentro do microcontrolador.

Relacione placa, código e modo

Pontos da ligação

A identificação na placa e o número usado no sketch correspondem diretamente: o pino marcado como D2 no Uno R3 é o pino 2 nas funções do Arduino. GND é o retorno do contato.

Use somente estes dois pontos para o botão: D2 → botão → GND. Não acrescente resistor de pull-up externo e não conecte 5 V, VIN ou outra fonte ao sinal D2 nesta prática.

INPUT ou INPUT_PULLUP?

Comparação dos modos de entrada para este botão.

Para a montagem proposta, escolha INPUT_PULLUP.
Modo em D2Resistor internoResultado com botão aberto
INPUTDesabilitadoD2 pode ficar sem nível definido
INPUT_PULLUPHabilitadoD2 fica definido pelo pull-up interno

Configuração de D2

Coloque esta configuração dentro de setup(). O pino 2 é uma entrada; portanto, ele não deve ser configurado como OUTPUT. O programa completo será apresentado no próximo step.

cpp
void setup() {
  pinMode(2, INPUT_PULLUP);
}

Verifique o plano

Escolha a ligação compatível

Qual plano combina corretamente a configuração INPUT_PULLUP com a ligação do botão?

Configure a entrada

Complete o modo de configuração usado com o botão entre D2 e GND.

cpp
void setup() {
  pinMode(2, );
}

Atenção

Sequência segura de montagem

Ainda não conecte o botão à placa. Primeiro, grave o programa completo da prática, apresentado adiante. Depois, desconecte o cabo USB antes de montar ou corrigir fios.

Na montagem final, use apenas a alimentação USB e confira novamente se os fios chegam a D2 e GND. Mantenha os pinos 0 e 1 livres.

Passo 3 de 7

Traduza LOW em botão pressionado

Converta a leitura elétrica de D2 em uma variável booleana que represente corretamente o botão pressionado.

Do contato ao nível elétrico

Leia o nível, não o significado

Com a ligação planejada entre D2 e GND e o modo INPUT_PULLUP, digitalRead(2) consulta o nível elétrico que está presente no pino naquele instante. Ela não comanda o pino nem altera o botão.

O resultado pode ser HIGH ou LOW. Nesta montagem:

  • botão solto → HIGH;
  • botão pressionado → LOW.

Isso ocorre porque o pull-up interno mantém D2 em nível alto enquanto o contato está aberto. Ao pressionar, o botão conecta D2 ao GND.

Estados elétricos de D2

Diagrama comparando o botão solto, que deixa D2 em nível alto pelo pull-up interno, ao botão pressionado, que conecta D2 ao GND e produz nível baixo.

Com INPUT_PULLUP, o nível baixo é produzido quando o botão fecha o caminho entre D2 e GND.

Transforme a leitura em bool

Separe nível e significado

Guarde primeiro a leitura elétrica em uma variável. Depois, crie uma variável bool com o significado desejado: “o botão está pressionado?”.

A comparação explícita evita inverter mentalmente a lógica ativa em nível baixo. Embora LOW seja o nível elétrico baixo, a expressão (nivel == LOW) vale true quando o botão está pressionado.

Exemplo

Exemplo de tradução

A segunda variável traduz o nível físico em uma condição que o programa pode usar depois. Neste step, vamos apenas fazer essa leitura e interpretação; o comando do LED será tratado a seguir.

Leitura e interpretação

Trecho para estudar; ele faz uma leitura e interpreta seu significado, sem controlar nenhuma saída.

cpp
int nivel = digitalRead(2);
bool pressionado = (nivel == LOW);

Dois valores, dois papéis

Confira como cada variável representa uma coisa diferente.

Estados esperados com o botão ligado entre D2 e GND.
Estado físiconivelpressionado
Botão soltoHIGHfalse
Botão pressionadoLOWtrue

Complete a interpretação

Pratique a lógica ativa em nível baixo

Complete o trecho que lê D2 e transforma a leitura em uma condição de botão pressionado.

cpp
int nivel = ;
bool pressionado = (nivel == );

Passo 4 de 7

Faça o LED acompanhar a leitura

Grave um sketch que lê D2 com pull-up interno e faz o LED integrado acompanhar diretamente o estado pressionado do botão.

Leia, interprete e atualize

Fluxo da resposta direta

A cada passagem por loop(), o programa faz o mesmo fluxo: consulta D2 uma vez, transforma o nível elétrico em pressionado e atualiza o LED integrado.

Nesta ligação com INPUT_PULLUP, pressionado é verdadeiro quando a leitura é LOW. Portanto, o LED recebe HIGH enquanto o botão está mantido pressionado e LOW quando está solto.

Não há delay() nem espera pela soltura: a resposta acompanha o estado atual da entrada.

Da leitura ao LED

Diagrama do fluxo repetido: leitura de D2, interpretação de LOW como botão pressionado e atualização do LED integrado.

Em cada passagem por loop, o LED é atualizado conforme a leitura atual de D2.

Prepare e grave o sketch

Sketch para gravar no Uno R3

Crie ou substitua o conteúdo de um sketch na IDE Arduino por este programa completo. Com o botão ainda desconectado, conecte somente o Uno R3 ao computador por USB, selecione a placa e a porta corretas e grave o sketch.

A gravação configura D2 como entrada com pull-up interno antes da montagem física do próximo step.

cpp
const uint8_t PINO_BOTAO = 2;

void setup() {
  pinMode(PINO_BOTAO, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop() {
  int nivelBotao = digitalRead(PINO_BOTAO);
  bool pressionado = (nivelBotao == LOW);

  if (pressionado) {
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
}
Saída esperada
Após a gravação, com o botão ainda desconectado:
D2 permanece em HIGH pelo pull-up interno.
LED integrado: apagado.

Este é o resultado observável esperado após a gravação, antes de conectar o botão. Não há texto de saída no programa.

Dica

Leia o código por etapas

setup() configura D2 e o LED uma única vez; também começa com o LED apagado. Depois, cada chamada de loop() lê o pino, calcula pressionado e executa exatamente um dos ramos do if.

O programa não alterna o LED a cada acionamento. Ele apenas reflete o nível presente agora. A montagem do botão será feita no próximo step, com o USB desconectado.

Valide a decisão no código

Complete a resposta ao botão

Complete as partes essenciais para que o LED integrado acompanhe o botão ativo em nível baixo.

cpp
const uint8_t PINO_BOTAO = 2;

void setup() {
  pinMode(PINO_BOTAO, );
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop() {
  int nivelBotao = digitalRead(PINO_BOTAO);
  bool pressionado = (nivelBotao == );

  if (pressionado) {
    digitalWrite(LED_BUILTIN, );
  } else {
    digitalWrite(LED_BUILTIN, );
  }
}

Confira os dois ramos

Rastreie os estados estáveis do programa:

  • Botão solto: digitalRead retorna HIGH; pressionado vale false; o ramo else apaga o LED.
  • Botão pressionado: digitalRead retorna LOW; pressionado vale true; o primeiro ramo acende o LED.

Como ambos os ramos escrevem no LED, a saída recebe uma decisão definida em toda passagem por loop().

Passo 5 de 7

Monte e confira os estados estáveis

Monte o botão entre D2 e GND com a placa desenergizada e verifique que o LED integrado acompanha os estados mantidos.

1. Faça a ligação com segurança

Monte com a placa desenergizada

Antes de montar ou corrigir qualquer ligação, desconecte o cabo USB do Uno. Nesta prática, use somente o USB como alimentação depois de conferir o circuito; não conecte fonte externa ao sinal nem aos pinos de alimentação.

O programa já foi gravado e configura D2 como INPUT_PULLUP. Agora conecte um contato do botão a D2 e o outro contato ao GND. Use exatamente o par que você confirmou: solto, ele fica desconectado; pressionado, ele fecha o contato.

Mantenha os pinos 0 e 1 livres.

Ligação física da prática

Diagrama do Uno R3 desenergizado com um botão na protoboard ligado entre D2 e GND; os pinos 0 e 1 estão sem fios.

Escolha um terminal de cada grupo elétrico do botão: D2–botão–GND.

Atenção

Atenção aos quatro terminais

Não escolha dois terminais que já têm continuidade permanente entre si. Nessa situação, apertar o botão não altera a conexão elétrica e a entrada não terá o comportamento esperado.

2. Preveja os estados estáveis

Confira antes de energizar

Com o USB ainda desconectado, revise o caminho completo antes de religar:

  1. Um jumper sai de D2 e chega a um terminal do botão.
  2. Um jumper sai do terminal eletricamente oposto e chega a GND.
  3. Os terminais usados só ficam conectados quando o botão é pressionado.
  4. Não há fios externos em D0 ou D1.

Só depois dessa conferência, conecte o USB. Aguarde a inicialização da placa.

Dica

O que a montagem deve produzir

O LED integrado é a saída observada. Com o pull-up interno, D2 fica em HIGH quando o botão está solto; ao pressionar, o botão conecta D2 ao GND. O programa interpreta esse LOW como botão pressionado e comanda o LED.

Estados esperados

Estado do botão e LED integrado esperado após a inicialização.

O LED acompanha o estado mantido; não é um indicador de cliques.
MomentoNível em D2LED integrado
Botão soltoHIGHApagado
Botão pressionado e mantidoLOWAceso
Botão solto novamenteHIGHApagado

3. Observe e relate

Teste o circuito

Faça esta verificação no seu equipamento:

  • Com o botão solto, observe o LED integrado apagado.
  • Mantenha o botão pressionado e observe o LED aceso enquanto ele permanecer pressionado.
  • Solte o botão e confirme que o LED apaga novamente.

A resposta esperada é direta: o LED muda conforme o nível que está presente naquele momento em D2.

Registre sua verificação

Descreva o que aconteceu nas três etapas: botão solto, botão mantido pressionado e botão solto outra vez. Se algum resultado foi diferente, indique uma conferência segura que você faria com o USB desconectado.

Escreva pelo menos 60 caracteres (0/60).

4. Corrija por conferências locais

Se o resultado não foi o esperado

Um resultado divergente não aponta uma causa única. Desconecte o USB antes de mexer na montagem e confira, com calma, itens locais e verificáveis.

Roteiro de conferência

Conferências úteis, sempre com a placa desenergizada.

Corrija uma ligação por vez e repita o teste dos estados estáveis.
O que conferirComo verificar localmente
Par do botãoOs dois terminais só ganham continuidade ao pressionar?
Caminho até GNDO terminal oposto ao D2 chega realmente a um pino GND?
Pino de entradaO jumper está no D2, não em um pino vizinho?
ProtoboardOs jumpers estão nas mesmas trilhas planejadas?
Programa gravadoD2 usa INPUT_PULLUP e a condição compara a leitura com LOW?

Atenção

Evite diagnósticos apressados

Não tente concluir pelo sintoma que há uma causa específica. Por exemplo, LED sempre aceso pode envolver tanto a escolha dos contatos quanto uma ligação na protoboard ou a configuração do programa. Confira cada ponto de forma separada.

Passo 6 de 7

Diferencie leitura repetida de novo acionamento

Diferencie o estado que permanece pressionado de um novo acionamento físico e reconheça o limite do programa atual.

Leitura não é acionamento

Uma ação física, muitas leituras

O loop() passa repetidamente pelo mesmo trecho de programa. Assim, enquanto você mantém o botão pressionado, cada nova consulta a D2 pode retornar LOW.

Isso significa apenas que o contato continua levando a entrada ao nível baixo. Não significa que você pressionou o botão outra vez.

Amostras durante o pressionamento

Diagrama mostra um botão mantido pressionado e diversas amostras consecutivas no nível baixo.

Um único pressionamento mantido pode ser observado várias vezes pelo programa como LOW.

Exemplo

Leia a sequência corretamente

Imagine que, durante um único pressionamento, o programa faz quatro leituras:

LOW, LOW, LOW, LOW

Em todas elas, a condição pressionado é verdadeira e o LED permanece aceso. Há quatro consultas ao mesmo estado físico, não quatro novos acionamentos.

Estado mantido e transição

A mudança não é ideal

Quando o botão se move entre solto e pressionado — ou no caminho inverso — os contatos mecânicos podem oscilar brevemente. Portanto, a leitura pode variar por um curto intervalo durante a mudança.

Não suponha que todo movimento do botão produz exatamente uma única transição elétrica, nem que cada leitura diferente seja um novo clique.

Oscilações breves no contato

Gráfico conceitual mostra um sinal alto que oscila brevemente antes de se estabilizar em nível baixo.

Durante o movimento do contato, podem ocorrer oscilações breves antes de o nível se estabilizar.

Dica

Limite deste programa

O programa atual tem uma tarefa simples: fazer o LED acompanhar o nível que está presente agora. Ele não conta cliques e não cria um aviso único de pressionamento.

Reconhecer um novo acionamento e lidar com oscilações dos contatos exigirá recursos que serão estudados depois.

Teste rápido

Verifique sua interpretação

Você mantém o botão pressionado por um instante e o programa lê LOW em seis passagens consecutivas por loop(). Isso prova que ocorreram seis acionamentos independentes?

Passo 7 de 7

Revise e valide a leitura do botão

Revisão integrada da ligação, da leitura ativa em nível baixo e do controle do LED pelo estado mantido.

Conecte as quatro etapas

Resumo

Revisão do percurso

Do contato ao LED

  • Use um terminal de cada grupo elétrico do botão, para que o contato mude ao pressionar.
  • Com INPUT_PULLUP, o botão liga D2 ao GND: solto, D2 fica em HIGH; pressionado, fica em LOW.
  • O programa traduz nivelBotao == LOW para a condição booleana pressionado.
  • Se pressionado for verdadeiro, o LED integrado recebe HIGH; caso contrário, recebe LOW.
  • O LED acompanha um estado mantido. Várias leituras LOW durante a mesma pressão não são vários cliques.

Veja a cadeia completa

Nesta montagem, o botão não fornece HIGH ao pino. O pull-up interno mantém D2 em HIGH enquanto o contato está aberto. Ao pressionar, o botão cria o caminho entre D2 e GND, levando a leitura a LOW.

Diagrama do Uno ligado a um botão entre D2 e GND, com pull-up interno e LED integrado acompanhando o estado do botão.

Contato fechado: D2 em LOW, condição pressionado verdadeira e LED aceso.

Complete a decisão

Aplique a lógica ativa em LOW

Complete a versão integrada do programa. Ela usa o mesmo identificador PINO_BOTAO do sketch da prática e mantém o LED como resposta direta ao estado atual do botão.

cpp
const uint8_t PINO_BOTAO = 2;

void setup() {
  pinMode(PINO_BOTAO, );
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  int nivelBotao = digitalRead(PINO_BOTAO);
  bool pressionado = (nivelBotao == );

  if (pressionado) {
    digitalWrite(LED_BUILTIN, );
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
}

Registre e conclua

Valide sua prática

Com o USB desconectado, confira se você usou um contato de cada grupo elétrico do botão e se os fios chegam a D2 e GND. Religue o USB somente com o programa já gravado. Registre os resultados para botão solto, mantido pressionado e solto outra vez. Depois, explique por que várias leituras LOW enquanto você segura o botão não representam novos acionamentos.

Escreva pelo menos 120 caracteres (0/120).

Concluído

Parabéns! Você concluiu: Leitura de botões nas entradas do Uno R3

Você validou uma entrada ativa em nível baixo no Uno R3.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso