Projeto Educacional · Tio Rafa × Mamute Eletrônica

Jogo Genius
com Arduino

Monte, programe e entenda o clássico jogo de memória — LEDs coloridos, botões, buzzer e a lógica completa, do zero.

GENIUS ARDUINO
#arduino#tiorafa#maker#led#buzzer
Sobre o projeto

Quer montar o seu próprio Jogo Genius com Arduino — LEDs coloridos, botões e sons — entendendo cada linha do código do zero?

Tio Rafa
Deixa que o Tio Rafa explica!
Prof. Rafael de Souza Oliveira · Robótica Educacional · @prof.tiorafa

O que é o Jogo Genius?

O Genius — também chamado de Simon Game — é um jogo eletrônico de memória dos anos 70. Ele mostra uma sequência de luzes e sons, e você precisa repetir a sequência na mesma ordem. A cada acerto, a sequência cresce. Com o Arduino, você constrói o seu do zero — aprendendo programação, eletrônica e lógica. Projeto desenvolvido pelo Tio Rafa, com kit disponível na Mamute Eletrônica.

Aprendizado

O que você aprende montando o Genius

Não é só montar — é entender. Cada parte do projeto ensina um conceito real de programação e eletrônica.

01Memória e arrays

A sequência vive em int Sequence[50]. Você aprende a criar, preencher e ler vetores.

02Repetição

Loops for e while percorrem a sequência para exibir cores e ler botões.

03Decisão

O if / else decide se o jogador acertou ou errou — e se o jogo continua.

04Entrada e saída digital

Os pinos alternam entre OUTPUT (LED) e INPUT (botão) — no mesmo pino.

05Funções

Código modular em RunSequence(), ReadSequence(), PlayTone().

06Aleatoriedade

random() com randomSeed() dá uma sequência diferente a cada partida.

07Som com buzzer

Cada cor tem sua frequência. A função tone() toca a nota certa.

08Lógica de jogo

GameOver e GameMode controlam o fluxo — uma intro a máquinas de estado.

A lógica, passo a passo

  1. 1Início: o jogo começa com sequência vazia. O Arduino inicializa com randomSeed(analogRead(A0)).
  2. 2Sorteia uma cor: random(10, 14) retorna um pino (10–13): amarelo, azul, verde ou vermelho.
  3. 3Exibe a sequência: RunSequence() acende cada LED com o som correspondente.
  4. 4Jogador repete: ReadSequence() lê os botões e aguarda a ordem certa.
  5. 5Acertou? O Arduino toca o som da cor como feedback e segue para a próxima posição.
  6. 6Errou? GameOver = 1, toca 100 Hz por 1,5 s e o jogo para.
  7. 7Nova rodada: acertou tudo? Adiciona mais uma cor e recomeça — agora com um passo a mais.
Hardware

O que você precisa

Arduino Uno× 1
LED VermelhoPIN 13
LED VerdePIN 12
LED AzulPIN 11
LED AmareloPIN 10
Push buttons× 4
Buzzer passivoPIN 9
Resistores 220 Ω× 4 (LEDs)
Jumpers + protoboardkit

Cores, pinos e sons

CorPinoFrequênciaFunção
Vermelho13310 HzLED + botão
Verde12415 HzLED + botão
Azul11209 HzLED + botão
Amarelo10252 HzLED + botão
Buzzer9100 Hzsom de erro

Técnica avançada: o mesmo pino para LED e botão

O código usa um truque inteligente: o mesmo pino serve como OUTPUT (LED) e INPUT (botão). As funções SetupAsOutputs() e SetupAsInputs() alternam o modo conforme necessário — uma ótima intro à configuração dinâmica de GPIO.

Código fonte

Código completo do Genius

Original do Tio Rafa, comentado para facilitar o aprendizado.

jogo_genius.ino C++ / Arduino
// Jogo Genius / Simon Game — Projeto Tio Rafa
// mamuteeletronica.com.br · tiorafa.tec.br

// Pinos dos LEDs / botões (os mesmos pinos!)
#define RED    13
#define GREEN  12
#define BLUE   11
#define YELLOW 10
#define SPEAKER 9

// Frequências de cada cor (Hz)
#define RED_TONE    310
#define GREEN_TONE  415
#define BLUE_TONE   209
#define YELLOW_TONE 252
#define GAME_OVER   100   // som de erro
#define TONE_DURATION 500
#define DELAY_TIME    500

// Variáveis de estado
int GameOver = 0;       // 0 = jogando | 1 = fim
int GameMode = 0;       // 0 = Arduino mostra | 1 = jogador repete
int Sequence[50];       // array da sequência
int SequenceLength;

int Tones[4] = {RED_TONE, GREEN_TONE, BLUE_TONE, YELLOW_TONE};

// ──────────────────────────────
void setup() {
  GameMode = 0;
  GameOver = 0;
  SequenceLength = 0;
  randomSeed(analogRead(A0)); // semente aleatória
  pinMode(SPEAKER, OUTPUT);
}

void loop() {
  while (GameOver == 0) {
    if (GameMode == 0) RunSequence();   // Arduino mostra
    else               ReadSequence();  // jogador repete
  }
  delay(DELAY_TIME);
}

// Pinos como SAÍDA → acende LEDs
void SetupAsOutputs() {
  pinMode(RED, OUTPUT);  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT); pinMode(YELLOW, OUTPUT);
}

// Pinos como ENTRADA → lê botões
void SetupAsInputs() {
  pinMode(RED, INPUT);  pinMode(GREEN, INPUT);
  pinMode(BLUE, INPUT); pinMode(YELLOW, INPUT);
}

// Mostra a sequência ao jogador
void RunSequence() {
  SetupAsOutputs();
  for (int i = 0; i < SequenceLength; ++i) {
    digitalWrite(Sequence[i], HIGH);
    PlayTone(Tones[Sequence[i] - 10], TONE_DURATION);
    digitalWrite(Sequence[i], LOW);
    delay(DELAY_TIME);
  }
  // Sorteia e adiciona nova cor (pinos 10–13)
  int newValue = random(10, 14);
  Sequence[SequenceLength++] = newValue;
  digitalWrite(newValue, HIGH);
  PlayTone(Tones[newValue - 10], TONE_DURATION);
  digitalWrite(newValue, LOW);
  delay(DELAY_TIME);
  GameMode = 1; // passa a vez ao jogador
}

// Lê a sequência digitada pelo jogador
void ReadSequence() {
  SetupAsInputs();
  int red, green, blue, yellow;
  for (int i = 0; i < SequenceLength; ++i) {
    red = green = blue = yellow = 0;
    // Aguarda algum botão
    while (red==0 && green==0 && blue==0 && yellow==0) {
      red    = digitalRead(RED);
      green  = digitalRead(GREEN);
      blue   = digitalRead(BLUE);
      yellow = digitalRead(YELLOW);
      delay(100);
    }
    // Identifica o botão pressionado
    int button = (red>0?RED:0) + (green>0?GREEN:0)
               + (blue>0?BLUE:0) + (yellow>0?YELLOW:0);
    if (Sequence[i] != button) {
      GameOver = 1;
      PlayTone(GAME_OVER, TONE_DURATION * 3);
      break;
    }
    PlayTone(Tones[button - 10], TONE_DURATION); // feedback
  }
  delay(DELAY_TIME);
  GameMode = 0;
}

// Toca um som no buzzer
void PlayTone(int value, int duration) {
  tone(SPEAKER, value, duration);
  delay(duration);
}

Use buzzer passivo, não ativo

A função tone() só funciona com buzzer passivo. O ativo já tem oscilador interno e toca só uma frequência fixa. Se o seu buzzer faz só um bip contínuo, é ativo — troque por um passivo.

Checklist

Antes de testar o jogo

  • 1Confirme o buzzer passivo. Com buzzer ativo, o som não varia entre as cores.
  • 2Resistor de 220 Ω em série com cada LED. Sem ele, a corrente excessiva pode queimar o LED ou o pino.
  • 3Pull-down nos botões. O código usa INPUT puro — use resistor 10 kΩ para GND para não flutuar.
  • 4Deixe o A0 desconectado. O randomSeed(analogRead(A0)) precisa do ruído de A0 para sortear de verdade.
  • 5Teste cada LED e botão separadamente com um sketch simples antes de subir o código completo.
Sobre o autor

Rafael de Souza Oliveira

Tio Rafa
Professor · Palestrante · Desenvolvedor de projetos educacionais
Robótica EducacionalArduino & ESP32Cultura Maker+15 anos

Sou o Rafael, mais conhecido como Tio Rafa. Há mais de 15 anos atuo em educação profissional e tecnológica — robótica educacional, sistemas embarcados, Arduino e ESP32.

Meu trabalho busca mostrar que a tecnologia pode ser acessível, criativa, divertida e profundamente educativa.

Kit na Mamute

Monte o seu Genius

Todos os componentes em um único kit, na Mamute Eletrônica.

Pronto para montar o seu Genius?

O kit com todos os componentes está disponível na Mamute Eletrônica. Monte. Programe. Entenda.

Ver kit na Mamute