Arduino – Genius (Jogo da memória)

Olá pessoal, hoje é dia de um projeto divertido, vamos criar o jogo Genius, jogo da memória com o arduino e alguns botões e leds coloridos.

O jogo é formado por 4 leds um de cada cor (amarelo, vermelho, azul e verde) e 4 botões para cada led e um speaker para os sons.

O que vamos utilizar no projeto:

– 4 botões

-4 leds (vermelho, amarelo, verder e azul)

– speaker

-arduino Uno

– protoboard

– 8 resistores 220ohms

Fritzing:

Código Arduino:

//Vamos começar definindo as notas para os sons
#define NOTE_D4  294
#define NOTE_G4  392
#define NOTE_A4  440
#define NOTE_A5  880

// criando o array para os 4 sons para sortear um som
int tons[4] = { NOTE_A5, NOTE_A4, NOTE_G4, NOTE_D4 };
// Nossa sequência de até 100 itens vai começar vazia.
int sequencia[100] = {};
// Indica a rodada atual que o jogo se encontra.
int rodada_atual = 0;
// Indica o passo atual dentro da sequência, é usado enquanto a sequência
// está sendo reproduzida.
int passo_atual_na_sequencia = 0;

/*
 * Indica o pino de áudio, leds e botões.
 * Os pinos de leds e botões estão em ordem, relacionados uns aos outros, ou
 * seja, o primeiro led está relacionado ao primeiro botão. A ordem destas
 * sequências também estão relacionadas a ordem dos tons.
 */
int pinoAudio = 6;
int pinosLeds[4] = { 8, 9, 10, 11 };
int pinosBotoes[4] = { 2, 3, 4, 5 };

// Indica se um botão foi pressionado durante o loop principal.
int botao_pressionado = 0;
// Flag indicando se o jogo acabou.
int perdeu_o_jogo = false;

void setup() {
  // Definindo o modo dos pinos dos Leds como saída.
  for (int i = 0; i <= 3; i++) {
    pinMode(pinosLeds[i], OUTPUT);
  }

  // Definindo o modo dos pinos dos Botões como entrada.
  for (int i = 0; i <= 3; i++) {
    pinMode(pinosBotoes[i], INPUT);
  }

  // Definindo o modo do pino de Áudio como saída.
  pinMode(pinoAudio, OUTPUT);

  // Inicializando o random através de uma leitura da porta analógica.
  // Esta leitura gera um valor variável entre 0 e 1023.
  randomSeed(analogRead(0));
}

void loop() {
  // Se perdeu o jogo reinicializamos todas as variáveis.
  if (perdeu_o_jogo) {
    int sequencia[100] = {};
    rodada_atual = 0;
    passo_atual_na_sequencia = 0;
    perdeu_o_jogo = false;
  }

  // Toca um som de início para anúnicar que o jogo está começando quando é a primeira rodada.
  if (rodada_atual == 0) {
    tocarSomDeInicio();
    delay(500);
  }

  // Chama a função que inicializa a próxima rodada.
  proximaRodada();
  // Reproduz a sequência atual.
  reproduzirSequencia();
  // Aguarda os botões serem pressionados pelo jogador.
  aguardarJogador();

  // Aguarda 1 segundo entre cada jogada.
  delay(1000);
}

// Sorteia um novo item e adiciona na sequência.
void proximaRodada() {
  int numero_sorteado = random(0, 4);
  sequencia[rodada_atual++] = numero_sorteado;
}

// Reproduz a sequência para ser memorizada.
void reproduzirSequencia() {
  for (int i = 0; i < rodada_atual; i++) {
    tone(pinoAudio, tons[sequencia[i]]);
    digitalWrite(pinosLeds[sequencia[i]], HIGH);
    delay(500);
    noTone(pinoAudio);
    digitalWrite(pinosLeds[sequencia[i]], LOW);
    delay(100);
  }
  noTone(pinoAudio);
}

// Aguarda o jogador iniciar sua jogada.
void aguardarJogador() {
  for (int i = 0; i < rodada_atual; i++) {
    aguardarJogada();
    verificarJogada();

    if (perdeu_o_jogo) {
      break;
    }

    passo_atual_na_sequencia++;
  }

  // Redefine a variável para 0.
  passo_atual_na_sequencia = 0;
}

void aguardarJogada() {
  boolean jogada_efetuada = false;
  while (!jogada_efetuada) {
    for (int i = 0; i <= 3; i++) {
      if (digitalRead(pinosBotoes[i]) == HIGH) {
        // Dizendo qual foi o botao pressionado.
        botao_pressionado = i;

        tone(pinoAudio, tons[i]);
        digitalWrite(pinosLeds[i], HIGH);
        delay(300);
        digitalWrite(pinosLeds[i], LOW);
        noTone(pinoAudio);

        jogada_efetuada = true;
      }
    }
    delay(10);
  }
}

void verificarJogada() {
  if (sequencia[passo_atual_na_sequencia] != botao_pressionado) {
    // GAME OVER.
    for (int i = 0; i <= 3; i++) {
      tone(pinoAudio, tons[i]);
      digitalWrite(pinosLeds[i], HIGH);
      delay(200);
      digitalWrite(pinosLeds[i], LOW);
      noTone(pinoAudio);
    }

    tone(pinoAudio, tons[3]);
    for (int i = 0; i <= 3; i++) {
      digitalWrite(pinosLeds[0], HIGH);
      digitalWrite(pinosLeds[1], HIGH);
      digitalWrite(pinosLeds[2], HIGH);
      digitalWrite(pinosLeds[3], HIGH);
      delay(100);
      digitalWrite(pinosLeds[0], LOW);
      digitalWrite(pinosLeds[1], LOW);
      digitalWrite(pinosLeds[2], LOW);
      digitalWrite(pinosLeds[3], LOW);
      delay(100);
    }
    noTone(pinoAudio);

    perdeu_o_jogo = true;
  }
}

void tocarSomDeInicio() {
  tone(pinoAudio, tons[0]);
  digitalWrite(pinosLeds[0], HIGH);
  digitalWrite(pinosLeds[1], HIGH);
  digitalWrite(pinosLeds[2], HIGH);
  digitalWrite(pinosLeds[3], HIGH);
  delay(500);
  digitalWrite(pinosLeds[0], LOW);
  digitalWrite(pinosLeds[1], LOW);
  digitalWrite(pinosLeds[2], LOW);
  digitalWrite(pinosLeds[3], LOW);
  delay(500);
  noTone(pinoAudio);
}

Video:

Resultado Final:

Qualquer dúvida é so deixar um comentário aqui em baixo.

Até a próxima!

Anúncios
Esse post foi publicado em Arduino e marcado , , , , . Guardar link permanente.

31 respostas para Arduino – Genius (Jogo da memória)

  1. Francisco Henrique disse:

    vc esqueceu de botar ligar o 5v do arduino na protoboard no fritizzing

    • marcosschwaab disse:

      Valeu Francisco… pior que esqueci de ligar o 5v mesmo! abraço!

      • Francisco Henrique disse:

        mesmo assim ainda o meu não funcionou; começou funcionando mais não recebia botão eu apertava e nada e agora ficou maluco dizendo que errei sem ter apertado em nada

  2. edson disse:

    Marcos ,voce pode me ensinar como faço para criar uma chamada com void (), neste seu programa vc faz mas não consigo.
    exemplo seu void proximaRodada()

  3. Isadora Oliveira disse:

    Marcos, você usou para, alimentar o Arduíno uma bateria de 5 V? e quais as entradas/saídas que você utilizou para a alimentação.

  4. galera, muito bom esse tutorial.
    segui os passos e consegui fazer um genius gambiarristico aqui!
    quem quiser conferir:

  5. Este código arduino está em linguagem C?ou C++?

  6. meu querido, segui esse tutorial e montei o genius do video acima.
    agora dei um upgrade nele e ficou mais bonitinho:

    agora eu tenho uma emergência. minha equipe que fazer um gigante e preciso que me ajude com as seguintes dúvida:
    1º para cada cor quero usar 3 leds de 10mm. de onde vou tirar voltagem suficiente para alimentar os 12?
    2º como eu faço para o tom ser alto e tocar numa caixa de som. tem que ser aquelas amplificadas né?

    por favor, me ajude!!!

  7. Consegui concluir o projeto. Ficou assim:

  8. Marcos, fiz algumas modificações no projeto para diminuir o numero de componentes utilizados.
    Veja como ficou a ligação entre os componentes, note que retirei os resistores dos botões, e agora um lado dos botões e ligado na porta do arduíno e ao contrario do projeto original, o outro lado é ligado na trilha negativa e não na positiva.
    Imagem do fritzing:

    Já no código alterei as seguintes linhas:
    Linha 28:
    de:
    int botão_pressionado = 0;
    para:
    int botão_pressionado = 1;

    Linha 117:
    de:
    if (digitalRead(pinosBotoes[i]) == HIGH) {
    para:
    if (digitalRead(pinosBotoes[i]) == LOW) {

    E adicionei abaixo da linha 40 o seguinte código:
    digitalWrite(pinosBotoes[i], HIGH); //este código faz o trabalho dos resistores dos botões

    O que acha?!?

    • ops…
      variavel não pode ter acento rsss foi mal!

      int botão_pressionado = 0; // NÃO EXISTE O ACENTO NA PALAVRA BOTAO…
      para:
      int botão_pressionado = 1; // NÃO EXISTE O ACENTO NA PALAVRA BOTAO…

  9. Felipe Tartaglione disse:

    Ola Marcos Boa Noite,precisa tirar ums duvidas com vc

  10. Nathália disse:

    Boa noite!

    O meu é o arduíno MEGA. Deveria funcionar normalmente? Quando eu tento compilar, apenas aparece “Error Compiling”…

    • marcosschwaab disse:

      Deveria funcionar sim, da uma olhada no LOG da ide ver qual o erro que está dando…

      • Nathália disse:

        Só aparece “Error Compiling”. Não fala mais nada nem cita um erro específico em uma das linhas de código.

    • Diniz disse:

      Eu tenho o uno e o mega. Os dois funcionam do mesmo jeito, mas na ide, é preciso alterar o tipo de placa que você usa. Fica em tools > boards. É só escolher o nome do seu mega.

  11. Luan Westphalen disse:

    estou fazendo o jogo como tcc do meu curso… gostaria de saber como faço pra ascender 25 leds de autobrilho ao inves de ascender apenas um! obrigado

  12. Mades Almeida disse:

    Está dando erro porque ele não colocou um fio para a fonte de alimentação. Para resolver isso basta colocar um fio acima daquele fio preto que vai para a porta GND e conectar na porta 5V.
    Ele também conectou o fio vermelho da coisa que emite som na porta errada. Ele conectou na porta 7 e é na porta 6.

  13. Camila Santos disse:

    Olá, sou uma aluna do 3ºTermo do curso técnico de eletrônica, ministrado pelo Senai, meu projeto de conclusão de curso será algo parecido com o seu, gostaria de obter mais detalhes com relação ao compilador que você utilizou para o seu código (por sinal muito bem estruturado), e a respeito da confecção do projeto de forma geral, Grata Camila.

  14. leandro disse:

    Boa noite!

    Consegui fazer o projeto funcionar, porém estou tentando criar um programa, para um projeto da faculdade, que utilize mais 2 botões e 2 LED’s, além de um potenciômetro que controlará o tempo de espera para se pressionar os botões. Você saberia me informar quais linhas devo alterar.

  15. Camila Santos disse:

    Olá Marcos, boa tarde!
    esse foi o mais perto que consegui chegar do genius kkkkk
    falta apens fazer com que leds obedeçam os botões, mas está dificil fazer isso :/

  16. Camila Batista dos Santos disse:

    Acho que sou a única que não consegui concluir o projeto, os leds estão piscando em sequências aleatórias, e ja começa piscando uma sequência avançada, alguém pode me ajudar, inclusive coloquei o video no comentario anterior

  17. Como faço para implementar um placar com display lcd 16×2?
    ótimo projeto cara, parabens!!!!

  18. Hugo André disse:

    Marcos, gostei bastante desse tutorial, eu e uns amigos nos baseamos nele para fazer um genius para uma amostra na minha universidade e fez bastante sucesso, mas nele tivemos que adicionar alguns detalhes e mudar algumas coisas para funcionar com lcd e guardando a pontuação. Parabéns pelo tutorial.

    Para quem quiser olhar o código com led e marcando a pontuação:

  19. edmilson hipolito disse:

    Ola teria como adicionar um placar com display de 7 segmentos

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s