Jogo Genius com Arduino: Monte, Programe e Aprenda — Projeto do 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.
Quer montar o seu próprio Jogo Genius com Arduino — LEDs coloridos, botões e sons — entendendo cada linha do código do zero?
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.
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.
A sequência vive em int Sequence[50]. Você aprende a criar, preencher e ler vetores.
Loops for e while percorrem a sequência para exibir cores e ler botões.
O if / else decide se o jogador acertou ou errou — e se o jogo continua.
Os pinos alternam entre OUTPUT (LED) e INPUT (botão) — no mesmo pino.
Código modular em RunSequence(), ReadSequence(), PlayTone().
random() com randomSeed() dá uma sequência diferente a cada partida.
Cada cor tem sua frequência. A função tone() toca a nota certa.
GameOver e GameMode controlam o fluxo — uma intro a máquinas de estado.
A lógica, passo a passo
- 1Início: o jogo começa com sequência vazia. O Arduino inicializa com
randomSeed(analogRead(A0)). - 2Sorteia uma cor:
random(10, 14)retorna um pino (10–13): amarelo, azul, verde ou vermelho. - 3Exibe a sequência:
RunSequence()acende cada LED com o som correspondente. - 4Jogador repete:
ReadSequence()lê os botões e aguarda a ordem certa. - 5Acertou? O Arduino toca o som da cor como feedback e segue para a próxima posição.
- 6Errou?
GameOver = 1, toca 100 Hz por 1,5 s e o jogo para. - 7Nova rodada: acertou tudo? Adiciona mais uma cor e recomeça — agora com um passo a mais.
O que você precisa
Cores, pinos e sons
| Cor | Pino | Frequência | Função |
|---|---|---|---|
| Vermelho | 13 | 310 Hz | LED + botão |
| Verde | 12 | 415 Hz | LED + botão |
| Azul | 11 | 209 Hz | LED + botão |
| Amarelo | 10 | 252 Hz | LED + botão |
| Buzzer | 9 | 100 Hz | som 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 completo do Genius
Original do Tio Rafa, comentado para facilitar o aprendizado.
// 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.
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
INPUTpuro — 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.
Rafael de Souza Oliveira
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.
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