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:

Post original no meu blog; http://meetarduino.wordpress.com

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

Até a próxima!


Exibições: 48111

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de EDMILSON HIPOLITO em 20 março 2017 às 9:24

Bom dia, teria como  colocar se atingisse um exemplo de 10 sequencias corretas, acender um led para indicar campeão? Abraços.

Comentário de Jorge Moises em 24 março 2016 às 10:31

Ola.
Ótimo !!
Teria como colocar um display 7 segmentos de dois digito para contar acertos ?

Comentário de Thiago S. Malavasi em 4 janeiro 2013 às 10:11

Rodou perfeito aqui!
Meus parabéns!

Comentário de Leandro Amorim em 9 junho 2012 às 13:01

Show de bola! Parabéns!

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço