De Protoboard para PCB: Jogo Simon Says – Parte 1
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino UNO | 1 |
| Protoboard Grande | 1 |
| LED (genérico) | 4 |
| Chave Pushbutton 12mm SparkFun | 4 |
| Buzzer | 1 |
| Jumpers (genéricos) | 12 |
| Resistor 10k ohm | 4 |
| Resistor 330 ohm | 4 |
| Cabo USB-A para B | 1 |
Aplicativos e Serviços Online
- Arduino IDE
Sobre o Projeto
Introdução
Todos conhecem o jogo Simon Says: repetir sequência de luzes pressionando botões correspondentes. Para Hackster Live, mostramos ferramenta de design PCB chamada Upverter. Projeto divertido e simples para criar e transformar em PCB. Abaixo, projeto básico com hardware e código.
Série em três partes:
- Parte 1: Fazendo o Jogo Simon Says (este artigo)
- Parte 2: Projetar PCB no Upverter baseado no jogo
- Parte 3: Fresar sua própria PCB a partir do design no Upverter
O que você aprenderá
- Montar projeto básico em protoboard
- Projetar PCB no Upverter
- Fresar PCB própria com CNC
Software
Baixe Arduino IDE mais recente para seu SO aqui.
Montagem do Hardware
Baseado no exemplo do SparkFun Inventor's Kit, com ajustes. Veja diagrama Fritzing abaixo.


Código
O legal é que há muitas variações. Usei hardware do SparkFun como base e escrevi código do zero. Se não quiser escrever, use o meu abaixo, o do SparkFun (com ajustes) ou busque outros códigos Simon Says compatíveis.
Incluí comentários detalhados e prints de debug no Serial Monitor. Veja vídeo do jogo em ação!
Vídeo do Simon Says
Nota: No vídeo, configurei 5 acertos para vencer. Ajuste para dificultar.
Agora você está pronto para transformar sua protoboard em PCB! Aprenda na Parte 2 – Projetando PCB com Upverter.
Código
Código Arduino Simon Says
int ledArray[] = {12, 9, 5, 2}; // 0=verde, 1=vermelho, 2=amarelo, 3=azul
int buttonArray[] = {13, 10, 6, 3}; // mesma ordem
int pinCount = 4;
int buzzer = 8;
int ledState = 0;
int gameState = 0;
#define NUMBERTOWIN 5 // Luzes para vencer – altere para mudar dificuldade
int gameValues[NUMBERTOWIN];
int roundNum = 0;
unsigned long previousMillis = 0;
unsigned long interval1 = 500;
void setLed(int ledNum);
void displayClue(int roundNum);
boolean waitForInput(int buttonNum);
void setup() {
Serial.begin(9600);
Serial.println("setup");
for (int Pin = 0; Pin < pinCount; Pin++) pinMode(ledArray[Pin], OUTPUT);
for (int Pin = 0; Pin < pinCount; Pin++) pinMode(buttonArray[Pin], INPUT_PULLUP);
randomSeed(analogRead(0));
}
void loop() {
if (gameState == 0) {
int b0 = digitalRead(buttonArray[0]);
int b1 = digitalRead(buttonArray[1]);
int b2 = digitalRead(buttonArray[2]);
int b3 = digitalRead(buttonArray[3]);
if (b0 && b1 && b2 && b3) pre_game();
else {
Serial.println("button Pressed");
setLed(-1);
roundNum = 0;
delay(1000);
gameState = 1;
}
}
if (gameState == 1) gamePlay();
if (gameState == 2) { // Vitória
delay(500); winning_sound(); winDisplay(); winDisplay(); winDisplay(); loseDisplay();
Serial.println("winDisplay"); delay(1000); gameState = 0;
}
if (gameState == 3) { // Derrota
delay(500); losing_sound(); loseDisplay(); loseDisplay(); loseDisplay();
Serial.println("loseDisplay"); delay(1000); gameState = 0;
}
}
void pre_game() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval1) {
if (ledState == 0) { Serial.println("pre green"); setLed(0); ledState = 1; }
else if (ledState == 1) { Serial.println("pre red"); setLed(1); ledState = 2; }
else if (ledState == 2) { Serial.println("pre yellow"); setLed(2); ledState = 3; }
else if (ledState == 3) { Serial.println("pre blue"); setLed(3); ledState = 0; }
previousMillis = currentMillis;
}
}
void gamePlay() {
Serial.println("gamePlay");
for (int i = 0; i < NUMBERTOWIN; i++) gameValues[i] = floor(random(0, 4));
for (int i = 0; i < NUMBERTOWIN; i++) Serial.println(gameValues[i], DEC);
Serial.print("Starting Round "); Serial.println(roundNum, DEC);
for (int r = 0; r < NUMBERTOWIN; r++) {
displayClue(roundNum);
for (int i = 0; i <= roundNum; i++) {
Serial.print("Waiting for input "); Serial.print(i + 1, DEC);
Serial.print(" of "); Serial.print(roundNum + 1, DEC); Serial.println();
if (waitForInput(gameValues[i])) {
if (i == roundNum) {
Serial.println("Correct");
if (roundNum == NUMBERTOWIN - 1) {
Serial.println("You Win!"); gameState = 2; return;
} else Serial.println("Continue");
}
} else {
Serial.println("You Lose!"); gameState = 3; return;
}
}
roundNum++;
delay(1000);
}
}
void setLed(int ledNum) {
if (ledNum < 0) {
for (int i = 0; i < pinCount; i++) digitalWrite(ledArray[i], LOW);
} else {
for (int i = 0; i < pinCount; i++) {
digitalWrite(ledArray[i], (i == ledNum) ? HIGH : LOW);
}
}
}
void displayClue(int roundNum) {
setLed(-1);
for (int i = 0; i <= roundNum; i++) {
setLed(gameValues[i]); delay(750); setLed(-1); delay(250);
}
}
boolean waitForInput(int buttonNum) {
while (true) {
int b0 = digitalRead(buttonArray[0]);
int b1 = digitalRead(buttonArray[1]);
int b2 = digitalRead(buttonArray[2]);
int b3 = digitalRead(buttonArray[3]);
if (!b0 || !b1 || !b2 || !b3) {
delay(250);
if (buttonNum == 0) { digitalWrite(ledArray[0], HIGH); delay(250); digitalWrite(ledArray[0], LOW); }
else if (buttonNum == 1) { digitalWrite(ledArray[1], HIGH); delay(250); digitalWrite(ledArray[1], LOW); }
else if (buttonNum == 2) { digitalWrite(ledArray[2], HIGH); delay(250); digitalWrite(ledArray[2], LOW); }
else if (buttonNum == 3) { digitalWrite(ledArray[3], HIGH); delay(250); digitalWrite(ledArray[3], LOW); }
if (buttonNum == 0 && b0 == 0) { Serial.println("0 Pressed"); return true; }
else if (buttonNum == 1 && b1 == 0) { Serial.println("1 Pressed"); return true; }
else if (buttonNum == 2 && b2 == 0) { Serial.println("2 Pressed"); return true; }
else if (buttonNum == 3 && b3 == 0) { Serial.println("3 Pressed"); return true; }
else return false;
}
}
}
void winDisplay() {
for (int i = 0; i < 4; i++) { digitalWrite(ledArray[i], HIGH); delay(75); digitalWrite(ledArray[i], LOW); delay(75); }
for (int i = 2; i >= 0; i--) { digitalWrite(ledArray[i], HIGH); delay(75); digitalWrite(ledArray[i], LOW); delay(75); }
}
void winning_sound() {
Serial.println("buzzer1");
tone(buzzer, 294, 250); delay(200);
tone(buzzer, 294, 250); delay(200);
tone(buzzer, 294, 250); delay(200);
tone(buzzer, 392, 500); delay(500);
tone(buzzer, 392, 250); delay(200);
tone(buzzer, 440, 250); delay(200);
tone(buzzer, 392, 250); delay(200);
tone(buzzer, 440, 250); delay(200);
tone(buzzer, 494, 500);
}
void loseDisplay() {
for (int i = 0; i < 4; i++) digitalWrite(ledArray[i], HIGH);
delay(200);
for (int i = 0; i < 4; i++) digitalWrite(ledArray[i], LOW);
delay(200);
}
void losing_sound() {
Serial.println("losing_sound");
tone(buzzer, 98, 250); delay(250);
tone(buzzer, 93, 250); delay(250);
tone(buzzer, 87, 250); delay(250);
}
Esquemáticos
Arquivo Fritzing: simon_says_fritzing_Yb8EdKPqD4.fzz
Processo de manufatura
- Construa um Jogo em Tempo Real com Giroscópio: Arduino Nano + Sensor MPU-6050
- Dados Digital com Arduino: Gere Números Aleatórios 1-6 em LCD 16x2
- Construa Seu Próprio Jogo de Roleta com 37 LEDs e Arduino Nano
- Controle USB para Jogos DIY com Arduino – Construa Seu Próprio Gamepad de Alto Desempenho
- Jogo Interativo com Joystick e Arduino – Feedback com LEDs
- Detector de Alcance Portátil – Kit DIY Arduino Nano com HC-SR04, Bateria 18650 e Gabinete 3D
- Pixel Chaser: Jogo LED Interativo de Um Toque com Arduino Nano
- Projeto de Galvanoplastia de Cobre: Construa um Sistema Inteligente com Arduino UNO
- Fabricação Aeroespacial para Pequenas Oficinas: Um Guia Prático
- Guia Completo de Fabricação de PCB de 4 Camadas – Processo Passo a Passo