⏱️ Criando um Timer Visual com Arduino para Controlar o Tempo de Apresentações

Resumo para o Leitor

Aprenda a criar um cronômetro visual utilizando LEDs e botões no Arduino. Um projeto prático para controlar o tempo de pitches, reuniões ou estudos (Pomodoro), dominando entradas e saídas digitais.

O Problema

Quem nunca estourou o tempo em uma apresentação de trabalho ou em uma reunião? Ficar olhando para o relógio tira o foco do orador. A solução é criar um dispositivo periférico simples que nos avise visualmente o “status” do tempo.

Neste tutorial completo, vamos construir um sistema onde:

  1. LED Verde: Indica que o tempo está tranquilo.
  2. LED Amarelo: Indica “Atenção”, o tempo está acabando.
  3. LED Vermelho: Indica “Pare”, o tempo esgotou.
  4. Botão: Reinicia a contagem.

Lista de Materiais

Vamos utilizar o kit básico de Arduino:

  • 1x Arduino Uno
  • 3x LEDs (1 Verde, 1 Amarelo, 1 Vermelho)
  • 3x Resistores de 220Ω ou 330Ω (para os LEDs)
  • 1x Botão (Push-button)
  • 1x Resistor de 10kΩ (para o botão)
  • Protoboard e Jumpers

A Montagem (Hardware)

O Código Completo

Abaixo está o código funcional. Note como utilizamos variáveis para definir o tempo de cada etapa. Isso facilita ajustes futuros sem precisar caçar números mágicos no meio do código.

// --- Mapeamento de Hardware ---
const int pinVerde = 2;
const int pinAmarelo = 3;
const int pinVermelho = 4;
const int pinBotao = 12;
 
// --- Configurações de Tempo (em milissegundos) ---
// Para teste rápido, usaremos tempos curtos. 
// Num cenário real, você mudaria 3000 para 300000 (5 minutos), por exemplo.
const int tempoVerde = 3000;   // 3 segundos de tempo livre
const int tempoAmarelo = 2000; // 2 segundos de alerta
 
void setup() {
  // Configura os pinos dos LEDs como SAÍDA
  pinMode(pinVerde, OUTPUT);
  pinMode(pinAmarelo, OUTPUT);
  pinMode(pinVermelho, OUTPUT);
  
  // Configura o pino do botão como ENTRADA
  pinMode(pinBotao, INPUT);
 
  // Inicializa o sistema no estado "Pronto/Resetado" (Apenas Vermelho Aceso)
  resetarSistema();
}
 
void loop() {
  // Lê o estado do botão
  int leituraBotao = digitalRead(pinBotao);
 
  // Se o botão for pressionado, inicia a contagem do timer
  if (leituraBotao == HIGH) {
    iniciarCicloDeTempo();
  }
}
 
void resetarSistema() {
  // Estado de espera: Apenas vermelho ligado indicando "Parado"
  digitalWrite(pinVerde, LOW);
  digitalWrite(pinAmarelo, LOW);
  digitalWrite(pinVermelho, HIGH);
}
 
void iniciarCicloDeTempo() {
  // 1. Início da apresentação (Luz Verde)
  digitalWrite(pinVermelho, LOW); // Apaga o vermelho anterior
  digitalWrite(pinVerde, HIGH);   // Acende o verde
  delay(tempoVerde);              // Espera o tempo do verde
 
  // 2. Alerta (Luz Amarela)
  digitalWrite(pinVerde, LOW);    // Apaga o verde
  digitalWrite(pinAmarelo, HIGH); // Acende o amarelo
  delay(tempoAmarelo);            // Espera o tempo do amarelo
 
  // 3. Tempo Esgotado (Luz Vermelha Piscando)
  digitalWrite(pinAmarelo, LOW);  // Apaga o amarelo
  
  // Pisca o vermelho 5 vezes para chamar atenção
  for(int i = 0; i < 5; i++) {
    digitalWrite(pinVermelho, HIGH);
    delay(200);
    digitalWrite(pinVermelho, LOW);
    delay(200);
  }
 
  // Retorna ao estado de repouso (Vermelho fixo)
  digitalWrite(pinVermelho, HIGH);
}

Execução

Entendendo a Lógica

O segredo deste código está na função iniciarCicloDeTempo(). Ela é linear e bloqueante (usando delay). Isso significa que, uma vez apertado o botão, o Arduino executa cada linha uma após a outra até o fim do ciclo.

Experimente alterar as variáveis tempoVerde e tempoAmarelo para adaptar o timer às suas necessidades!