back to top
domingo - 21 / 06 / 2026
domingo - 06 / 21 / 2026

Genius com Arduino

O Genius é um jogo de memória, também conhecido como Simon. Este post mostra um projeto deste jogo com Arduino.

Como funciona o Genius?

Para quem não sabe, é um jogo onde você tem que memorizar a sequência que as luzes são acesas e apertar botões para repetir esta sequência. Quanto mais você acerta, maior se torna a sequência de luzes para memorizar. Se errar a ordem da sequência, você perde.

genius brinquedo
Simon é o nome do brinquedo, que foi inventado por Ralph H. Baer e Howard J. Morrison e, lançado pela Milton Bradley nos EUA, em 1978. No Brasil, foi lançado com o nome de Genius pela Estrela, em 1980. Fonte: Retropond.

Lista de materiais

  • Arduino Mega 2560.
  • Buzzer.
  • 5 LEDs, cada um das seguintes cores: vermelho, amarelo, verde, azul e branco.
  • Resistores: 5 de 10kΩ, 2 de 220Ω, 2 de 150Ω e 3 de 100Ω.
  • 5 botões push button.
  • Um display de 7 segmentos com dois dígitos. Por ser cátodo comum, os pinos 13 e 14 são ligados ao GND com dois resistores de 220Ω.
Display de pontos para o Genius.
As funções de cada pino do display de 7 segmentos de dois dígitos. Fonte: datasheet do componente.

Montando o circuito

Nesta versão do Genius, há 5 botões para 5 cores. Quando acerta uma sequência, o display de dois dígitos acrescenta um ponto.

esquemático do jogo Genius.
Não encontrei um display de 7 segmentos de 2 dígitos com 18 pinos para colocar no Fritzing. Por isso, tive que colocar dois displays de 7 segmentos separados para uma representação aproximada. Porém, você pode fazer as conexões seguindo a figura anterior e o código mostrado neste post. Clique na imagem para ampliá-la.

Os botões ficam em uma configuração pull-up com os resistores de 10kΩ. Esta configuração é necessária para evitar valores flutuantes (entre 5V e 0).

O código e o vídeo de demonstração

Este código usa bastante vetores ou arrays, cujos números representam os pinos digitais no Arduino.

int sequency[32] = {};//Vetor que indica a sequência de rodadas. 32 é o número //máximo.
int buttons[5] = { 53, 51, 49, 47, 45 };//Vetor dos botões.
int leds[5] = { 52, 50, 48, 46, 44 };//Vetor dos leds.
int tones[5] = { 262, 294, 330, 349, 395 };//Vetor dos tons sonoros.
int stage = 0;
int step = 0;
int pressed_button = 0;
bool game_over = false;
int buzzer = 42;
//Vetores do display de 2 dígitos, cada número está ligado ao segmento                  //a, b, c, d, e, f e g, respectivamente.
const int segmentPinsU[] = {28, 26, 27, 31, 33, 30, 29};
const int segmentPinsD[]={34, 32, 35, 37, 39, 38, 36};
//Matriz para mostrar os números no display.
const byte digitSegments[10][7] = {
  {1, 1, 1, 1, 1, 1, 0}, // 0
  {0, 1, 1, 0, 0, 0, 0}, // 1
  {1, 1, 0, 1, 1, 0, 1}, // 2
  {1, 1, 1, 1, 0, 0, 1}, // 3
  {0, 1, 1, 0, 0, 1, 1}, // 4
  {1, 0, 1, 1, 0, 1, 1}, // 5
  {1, 0, 1, 1, 1, 1, 1}, // 6
  {1, 1, 1, 0, 0, 0, 0}, // 7
  {1, 1, 1, 1, 1, 1, 1}, // 8
  {1, 1, 1, 1, 0, 1, 1}  // 9
};
//Variáveis globais para contar os pontos no display.
int count = 0;          
int count2=0;

void setup() {
  pinMode(52, OUTPUT);  //Led vermelho.
  pinMode(53, INPUT);   //Botão vermelho.
  pinMode(50, OUTPUT);  //Led amarelo.
  pinMode(51, INPUT);   //Botão amarelo.
  pinMode(48, OUTPUT);  //Led verde.
  pinMode(49, INPUT);   //Botão verde.
  pinMode(46, OUTPUT);  //Led azul.
  pinMode(47, INPUT);   //Botão azul.
  pinMode(44, OUTPUT);  //Led branco.
  pinMode(45, INPUT);   //Botão branco.
  pinMode(buzzer, OUTPUT);
// Inicia com todos os segmentos do display desligados.
  for (int i = 0; i < 7; i++) {
    pinMode(segmentPinsU[i], OUTPUT);
    digitalWrite(segmentPinsU[i], LOW); 
    pinMode(segmentPinsD[i], OUTPUT);
    digitalWrite(segmentPinsD[i], LOW);
  }
}

void loop() {
  for (int i = 0; i < 7; i++) {//Começa a contar os pontos.
    digitalWrite(segmentPinsU[i], digitSegments[count][i]);
    digitalWrite(segmentPinsD[i], digitSegments[count2][i]);
  }
  nextStage();
  reproducesequency();
  waitplayer();
  //Se acabar o jogo, zera as variáveis.
  if (game_over == true) {
    sequency[32] = {};
    stage = 0;
    step = 0;
    game_over = false;
  }
  delay(1000);
}

void nextStage() {
  int choose = random(5);//Escolhe aleatoriamente um dos cinco leds.
  sequency[stage] = choose;
  stage++;
  count++;
  if(count==10){
    count=0;
    count2++;
  }
  if(count2==10){
    count2=0;
  }
}

void reproducesequency() {
  for (int i = 0; i < stage; i++) {//Um tom para cada led.
    tone(buzzer, tones[sequency[i]]);
    digitalWrite(leds[sequency[i]], HIGH);
    delay(500);
    noTone(buzzer);
    digitalWrite(leds[sequency[i]], LOW);
    delay(100);
  }
}

void waitplayer() {//Espera o jogador.
  for (int i = 0; i < stage; i++) {
    bool played = false;
    while (!played) { //loop infinito.
      for (int i = 0; i <= 4; i++) {
        if(digitalRead(buttons[i])==LOW){
          pressed_button=i;
          tone(buzzer,tones[i]);
          digitalWrite(leds[i],HIGH);
          delay(300);
          digitalWrite(leds[i],LOW);
          noTone(buzzer);
          played=true;
        }
      }
    }
    //Verifica se acertou a sequência.
    if(sequency[step] != pressed_button){
      for(int i=0;i<=4;i++){
        digitalWrite(buzzer,HIGH);
        digitalWrite(leds[i],HIGH);
        delay(1000);
        digitalWrite(leds[i],LOW);
        digitalWrite(buzzer,LOW);
      }
      game_over=true;
      count=0;
      count2=0;
      break;
    }
    step++;
  }
  step = 0;
}

Artigos Relacionados

DEIXE UMA RESPOSTA

Por favor, insira seu comentário!
Digite seu nome aqui

- Publicidade -

Últimos posts