blog-eletrogate-logo-desktop blog-eletrogate-logo-mobile
  • Categorias
    • Voltar
    • INICIANTES
    • INTERMEDIÁRIOS
    • AVANÇADOS
    • divide
    • Automação Residencial
    • Componentes Eletrônicos
    • Impressão 3D
    • IoT
    • Modelagem 3D
    • Módulos Wifi
    • Por trás da tecnologia
    • Projetos
    • Raspberry Pi
    • Robótica
    • Sensores
    • Shields
    • Sistemas Operacionais
    • Tipos de Arduino
    • Tutoriais
  • Apostilas
  • Quem Somos
  • Seja um redator
  • Trabalhe Conosco
    • Categorias
      • Voltar
      • INICIANTES
      • INTERMEDIÁRIOS
      • AVANÇADOS
      • divide
      • Automação Residencial
      • Componentes Eletrônicos
      • Impressão 3D
      • IoT
      • Modelagem 3D
      • Módulos Wifi
      • Por trás da tecnologia
      • Projetos
      • Raspberry Pi
      • Robótica
      • Sensores
      • Shields
      • Sistemas Operacionais
      • Tipos de Arduino
      • Tutoriais
    • Apostilas
    • Quem Somos
    • Seja um redator
    • Trabalhe Conosco
Loja Eletrogate
voltar
  • Introdução
  • Montagem
  • Código
  • Finalizando
  • Sobre o Autor
Projetos

Jogo do Reflexo: Divirta-se e Melhore os seus Reflexos

Eletrogate 20 de julho de 2020Atualizado em: 15 set 202215 min

Introdução

Já pensou em fazer um joguinho com Arduino? Com mais um par de LEDs e botões é possível desenvolver coisas interessantes, dentre elas, um teste de reflexo. Isso mesmo, vamos medir seu reflexo e de mais alguém, e em seguida compará-los. Quem de vocês é o mais rápido?

A proposta deste projeto subir um pouco o nível de dificuldade integrando conceitos de entrada, saída e temporização.

O algoritmo é o seguinte:

  1. Gerar um intervalo randômico de no máximo 7 segundos;
  2. Piscar os LEDs de forma emocionante;
  3. Aguardar os botões serem pressionados e registrar o tempo;
  4. Apagar ambos os LEDs e aguardar 1 segundo (suspense);
  5. Acender estaticamente o LED de quem pressionou mais rápido.

Também será impresso via serial algumas mensagens e valores.


Montagem

Materiais necessários para o projeto Jogo do Reflexo: Divirta-se e Melhore os seus Reflexos

  • 1x Uno R3 + Cabo Usb para Arduino
  • 2x LED Difuso 5mm Vermelho
  • 2x Push Button (Chave Táctil) 6x6x6mm
  • 1x Jumpers – Macho/Macho – 20 Unidades de 20cm
  • 1x Protoboard 400 Pontos
  • 1x Resistor 220R 1/4W (10 Unidades)
  • 1x Resistor 10K 1/4W (10 Unidades)

cta_cart

Para ilustrar o circuito, nada melhor do que o Fritzing. Já ouviu falar dele? Você deve ter visto outros circuitos aqui no blog e em outros lugares que também que o utilizam. Se quiser aprender mais a respeito, dá uma olhada neste tutorial.

Faça com calma para evitar problemas:

Ilustração do circuíto

Cuidado!

Não negligencie os resistores, pessoa que está lendo. Eles protegem o chip ATmega328 do seu estimado Arduino contra sobrecarga de corrente, por isso não deixe de utilizá-los! Os resistores ligados aos LEDs são de 220 ohms e os ligados aos botões, 10K ohms.


Código

Agora vamos ao código. Basta copiar, colar na IDE e carregá-lo para o Arduino:

#define LED_ESQ 11 // A porta do LED esquerdo
#define LED_DIR 9 // A porta do LED direito

#define BT_ESQ 7 // A porta do botão esquerdo
#define BT_DIR 5 // A porta do botão esquerdo

#define PWM_MAX 255 // O valor máximo de saídas PWM
#define PWM_MIN 0 // O valor mínimo de saídas PWM

#define TEMPO_MIN 1000 // O intervalo mínimo do tempo de espera
#define TEMPO_MAX 7000 // O intervalo máximo do tempo de espera
#define FLASH 150 // Atraso para piscar os LEDs

void setup() {
  // Configuração dos pinos, definir o que é entrada e saída
  pinMode(LED_ESQ, OUTPUT);
  pinMode(LED_DIR, OUTPUT);
  pinMode(BT_ESQ, INPUT);
  pinMode(BT_DIR, INPUT);
  Serial.begin(9600);
  Serial.println("----------");
  Serial.println("ELETROGATE");
  Serial.println("----------");
  Serial.println("");
  Serial.println("Jogo do reflexo");
  Serial.println("(っ▀¯▀)つ");
  Serial.println("");
  
  delay(1000);

  // Acender os leds
  byte pwAtual = PWM_MAX;
  analogWrite(LED_ESQ, pwAtual);
  analogWrite(LED_DIR, pwAtual);
  
  Serial.println("Começando em 3...");
  delay(1000);
  Serial.println("             2");
  delay(1000);
  Serial.println("             1");
  
  // Apagar os LEDs suavemente em aproximadamente 1 segundo
  while(pwAtual > 0) {
    pwAtual -= 17; // A cada loop, reduzir a potência em 17, assim em 15 ciclos os LEDs se apagarão
    analogWrite(LED_ESQ, pwAtual);
    analogWrite(LED_DIR, pwAtual);
    delay(66);
  }
}

void loop() {
  Serial.println("");
  Serial.print("Aguarde...");
  unsigned int tempoRandomico = random(TEMPO_MIN, TEMPO_MAX); // Gerar o tempo de espera aleatório
  delay(tempoRandomico); // Aguardar o tempo aleatório
  unsigned long millisInicial = millis(); // Salvar o tempo inicial
  unsigned long millisEsq;
  unsigned long millisDir;
  bool btEsqPressionado = false;
  bool btDirPressionado = false;
  bool ledEsqAceso = false;
  bool ledDirAceso = false;
  Serial.print("Pressione seu botão!!!");
  while (!btEsqPressionado || !btDirPressionado) { // Loop para executar enquanto os botões não forem pressionados
    if (digitalRead(BT_ESQ) && !btEsqPressionado) { // Verficar se o botão esquerdo foi pressionado, mas só na primeira vez
      btEsqPressionado = true; // Salvar que o botão foi pressionado
      millisEsq = millis(); // Salvar o tempo em que o botão esquerdo foi pressionado
      analogWrite(LED_ESQ, PWM_MIN); // Apagar o LED esquerdo
    }

    if (digitalRead(BT_DIR) && !btDirPressionado) { // Verficar se o botão direito foi pressionado, mas só na primeira vez
      btDirPressionado = true; // Salvar que o botão foi pressionado
      millisDir = millis(); // Salvar o tempo em que o botão direito foi pressionado
      analogWrite(LED_DIR, PWM_MIN); // Apagar o LED direito
    }

    if (millis() - millisInicial > FLASH) { // Condição para apagar ou acender os LEDs fazendo-os piscarem
      if (!btEsqPressionado) { // O LED esquerdo só pisca se o botão esquerdo ainda não foi pressionado
        if (ledEsqAceso) {
          analogWrite(LED_ESQ, PWM_MIN);
        }
        else {
          analogWrite(LED_ESQ, PWM_MAX);
        }

        ledEsqAceso = !ledEsqAceso; // Apagar se estiver aceso e acender se estiver apagado
      }
      
      if (!btDirPressionado) { // O LED direito só pisca se o botão direito ainda não foi pressionado
        if (ledDirAceso) {
          analogWrite(LED_DIR, PWM_MIN);
        }
        else {
          analogWrite(LED_DIR, PWM_MAX);
        }

        ledDirAceso = !ledDirAceso; // Apagar se estiver aceso e acender se estiver apagado
      }
    }
  }

  Serial.println("Que rufem os tambores!"); // Suspense
  delay(2000);
  Serial.println("");

  if (millisEsq != millisDir) { // Verificar se não houve empate
    Serial.print("O botão ");
    if (millisEsq < millisDir) { // Verfiricar se o botão esquerdo foi pressionado mais rapidamente
      Serial.print("esquerdo");
      analogWrite(LED_ESQ, PWM_MAX); // Acender led esquerdo indicando vencedor
    }
    else {
      Serial.print("direito");
      analogWrite(LED_DIR, PWM_MAX); // Acender led direito indicando vencedor
    }
    
    Serial.println(" foi pressionado mais rapidamente");
  }
  else {
    Serial.println("Houve um empate! Uau, isso é tão raro...");
  }
  
  Serial.println("");
  delay(1000);
  Serial.println("(っ▀¯▀)つ");
  Serial.println("Parabéns!");
  Serial.println("");
  Serial.println("Tempos:");
  Serial.print("Esquerdo = ");
  Serial.print(millisEsq - millisInicial); // Exibir o tempo demorado para o botão esquerdo ser pressionado
  Serial.println(" ms");
  delay(1000);
  
  Serial.print("Direito = ");
  Serial.print(millisDir - millisInicial); // Exibir o tempo demorado para o botão direito ser pressionado
  Serial.println(" ms");
  delay(1000);
  
  Serial.println("");
  Serial.println("Pressione um botão para jogar de novo");
  Serial.println("");
  // Apagar LEDs
  analogWrite(LED_ESQ, PWM_MIN);
  analogWrite(LED_DIR, PWM_MIN);
  while(!digitalRead(BT_ESQ) && !digitalRead(BT_DIR)) { } // Fazer nada enquanto algum botão não é pressionado
}

Reparou na função millis? Ela retorna o tempo em milissegundos desde quando o Arduino é ligado e é super importante para nosso jogo. É uma função nativa, útil para trabalharmos com tempo. Neste tópico em inglês do fórum oficial do Arduino há mais explicações.

Lembre-se de abrir o Monitor Serial para visualizar as mensagens:

Abra o Monitor Serial com Ctrl + Shift + M


Finalizando

É notável o potencial do Arduino como base para criar montagens interativas e para entretenimento. Devemos lembrar que nem todo projeto precisa necessariamente de uma finalidade prática, isto é, a diversão pode estar intrínseca e ser o objetivo final do desenvolvimento. Afinal, é justamente essa a definição de hobby.

E então, já se sente mais confiante? A Eletrogate sugere que você leia e entenda o código linha por linha para que projetos desafiadores se tornem mais confortáveis no futuro. Que tal modificá-lo e deixá-lo do seu jeito? Ou talvez usar um Arduino diferente?

Divirta-se!

Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!


Sobre o Autor


Victor Castro

Estudante de Sistemas de Informação na UFMG, prefere desenvolver algoritmos do que fazer circuitos. Ama ensinar e surpreender o interlocutor com novas perspectivas. Joga Uno e Rummikub nos fins de semana.


Eletrogate

20 de julho de 2020 Atualizado em: 15 set 2022

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!

Projetos

Utilizando Sensores I₂C com o Mesmo Endereço

Eletrogate26 de setembro de 2023

No post de hoje, nós aprenderemos a usar dois sensores I₂C com o mesmo endereço, utilizando o CI Demultiplexador CD4051.

Projetos

Utilizando Sensores I₂C com o Mesmo Endereço

Eletrogate26 de setembro de 2023

No post de hoje, nós aprenderemos a usar dois sensores I₂C com o mesmo endereço, utilizando o CI Demultiplexador CD4051.

Projetos

Jogo da Velha na TV!

Eletrogate19 de setembro de 2023

Este é um jogo de quebra-cabeça para dois jogadores, identificados como “X” e “O”, que se revezam marcando os espaços em uma área 3 × 3.
Alguma vez na vida você já deve ter jogado este clássico jogo conhecido como Jogo-da-Velha ou Tic-Tac-Toe.

Neste post, você vai aprender a montar e programar uma versão digital deste jogo, com saída de imagem para TV, utilizando apenas alguns componentes eletrônicos básicos, uma placa Arduino UNO e um Teclado Matricial de 16 teclas.

Projetos

Jogo da Velha na TV!

Eletrogate19 de setembro de 2023

Este é um jogo de quebra-cabeça para dois jogadores, identificados como “X” e “O”, que se revezam marcando os espaços em uma área 3 × 3.
Alguma vez na vida você já deve ter jogado este clássico jogo conhecido como Jogo-da-Velha ou Tic-Tac-Toe.

Neste post, você vai aprender a montar e programar uma versão digital deste jogo, com saída de imagem para TV, utilizando apenas alguns componentes eletrônicos básicos, uma placa Arduino UNO e um Teclado Matricial de 16 teclas.

IoT

LittleFS: Alto Desempenho para RP Pico, ESP32 e ESP8266

Eletrogate12 de setembro de 2023

Aprenda neste post, a usar o sistema de arquivos LittleFS, que possui mais desempenho do que o sistema SPIFFS, nas placas Raspberry Pi Pico, ESP32 e ESP8266.

IoT

LittleFS: Alto Desempenho para RP Pico, ESP32 e ESP8266

Eletrogate12 de setembro de 2023

Aprenda neste post, a usar o sistema de arquivos LittleFS, que possui mais desempenho do que o sistema SPIFFS, nas placas Raspberry Pi Pico, ESP32 e ESP8266.

Sensores

Como Utilizar o Módulo Sensor de Cor RGB TCS34725

Eletrogate5 de setembro de 2023

Você já precisou de algum sensor para detectar as cores de objetos? Venha conferir o post de hoje! Nós vamos utilizar o sensor RGB TCS34725.

Sensores

Como Utilizar o Módulo Sensor de Cor RGB TCS34725

Eletrogate5 de setembro de 2023

Você já precisou de algum sensor para detectar as cores de objetos? Venha conferir o post de hoje! Nós vamos utilizar o sensor RGB TCS34725.

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!

blog-eletrogate-logo-footer

Rua Rio de Janeiro, 441 - Sala 1301
Centro - Belo Horizonte/MG
CEP 30160-041
*Não temos atendimento físico

ANWAR SLEIMAN HACHOUCHE - ME
CNPJ: 18.917.521/0001-73

Atendimento

(31) 3142-3800

[email protected]


Seg a Sex - das 8h às 17h

Institucional

  • Apostilas
  • Quem Somos
  • Privacidade
  • Seja um Redator
  • Trabalhe Conosco

Nos acompanhe

Facebook Instagram Youtube

© ELETROGATE 2023 - Todos os direitos reservados. Termos de uso e Política de privacidade.