const int buzzerPin = 13;
int notasErro[] = {2,1,0,2,1};
int notasAcerto[] = {900,3000};
// Definição de pinos para LEDs e botões
#define LED_VERDE 2
#define LED_VERMELHO 10
#define LED_AMARELO 4
#define LED_AZUL_B 8 // Pino do LED RGB Azul - Componente B
#define BTN_VERDE 3
#define BTN_VERMELHO 6
#define BTN_AMARELO 5
#define BTN_AZUL 11
#define BTN_START 9 // Pino do botão de start
int numAtualSorteado = 0;
int numSorteados[100];
int numAtualEscolhido = 0;
int numEscolhido[100];
int nivel = 0;
int verifica = 0;
bool sortear = true;
int velocidadeSequencia = 500; // Velocidade inicial da sequência em milissegundos
void reiniciar() {
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_AMARELO, LOW);
digitalWrite(LED_VERMELHO, LOW);
digitalWrite(LED_AZUL_B, LOW);
delay(1000);
nivel = 0;
sortear = true;
verifica = 0;
velocidadeSequencia = 500; // Reinicia a velocidade da sequência
}
void escolhaErrada() {
for (int i = 0; i < 5; i++) {
tone(buzzerPin,notasErro[i]);
delay(500);
}
noTone(buzzerPin);
if (digitalRead(BTN_START) == LOW) {
reiniciar(); // Inicia o jogo somente quando o botão BTN_START for pressionado
}
}
void mostrarSequencia() {
for (int i = 0; i <= nivel; i++) {
switch (numSorteados[i]) {
case 1:
digitalWrite(LED_VERDE, HIGH);
delay(velocidadeSequencia);
digitalWrite(LED_VERDE, LOW);
delay(velocidadeSequencia / 2); // Diminui o tempo em que o LED fica aceso
break;
case 2:
digitalWrite(LED_AMARELO, HIGH);
delay(velocidadeSequencia);
digitalWrite(LED_AMARELO, LOW);
delay(velocidadeSequencia / 2); // Diminui o tempo em que o LED fica aceso
break;
case 3:
digitalWrite(LED_VERMELHO, HIGH);
delay(velocidadeSequencia);
digitalWrite(LED_VERMELHO, LOW);
delay(velocidadeSequencia / 2); // Diminui o tempo em que o LED fica aceso
break;
case 4:
digitalWrite(LED_AZUL_B, HIGH);
delay(velocidadeSequencia);
digitalWrite(LED_AZUL_B, LOW);
delay(velocidadeSequencia / 2); // Diminui o tempo em que o LED fica aceso
break;
}
}
delay(1000); // Tempo para o jogador memorizar e apertar o botão
}
void verificar(int pinoSaida) {
if (numAtualEscolhido == numSorteados[verifica]) {
digitalWrite(pinoSaida, HIGH);
delay(500);
digitalWrite(pinoSaida, LOW);
delay(500);
if (verifica == nivel) {
nivel++;
if (nivel == 21) {
reiniciar();
} else {
piscarTodosLEDs();
delay(1000); // Tempo para o jogador se preparar para o próximo nível
sortear = true;
velocidadeSequencia -= 50; // Acelera a sequência para o próximo nível
if (velocidadeSequencia < 100) // Limita a velocidade mínima da sequência
velocidadeSequencia = 100;
}
} else {
verifica++;
}
} else {
escolhaErrada();
}
}
void setup() {
Serial.begin(9600);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_VERMELHO, OUTPUT);
pinMode(LED_AMARELO, OUTPUT);
pinMode(LED_AZUL_B, OUTPUT);
pinMode(BTN_VERDE, INPUT_PULLUP);
pinMode(BTN_VERMELHO, INPUT_PULLUP);
pinMode(BTN_AMARELO, INPUT_PULLUP);
pinMode(BTN_AZUL, INPUT_PULLUP);
pinMode(BTN_START, INPUT_PULLUP);
randomSeed(analogRead(0)); // Inicialização do gerador de números aleatórios
delay(3000);
}
void loop() {
if (digitalRead(BTN_START) == LOW) {
reiniciar(); // Inicia o jogo somente quando o botão BTN_START for pressionado
}
if (nivel != 21) {
if (sortear) {
for (int i = 0; i <= nivel; i++) {
numAtualSorteado = random(1, 5);
numSorteados[i] = numAtualSorteado;
}
mostrarSequencia();
}
if (digitalRead(BTN_VERDE) == LOW) {
numAtualEscolhido = 1;
verificar(LED_VERDE);
} else if (digitalRead(BTN_AMARELO) == LOW) {
numAtualEscolhido = 2;
verificar(LED_AMARELO);
} else if (digitalRead(BTN_VERMELHO) == LOW) {
numAtualEscolhido = 3;
verificar(LED_VERMELHO);
} else if (digitalRead(BTN_AZUL) == LOW) {
numAtualEscolhido = 4;
verificar(LED_AZUL_B);
}
} else if (digitalRead(BTN_START) == LOW) {
reiniciar(); // Inicia o jogo somente quando o botão BTN_START for pressionado
}
}
void piscarTodosLEDs() {
for(int i = 0;i < 2;i++){
tone(buzzerPin,notasAcerto[i]);
delay(500);
}
noTone(buzzerPin);
}