/*
Projeto ABATEC - Teste de módulos em conjunto
Sobre o módulo 01, 'Perguntas e Respostas':
> Há dois botões, um para respostas Afirmativas e outro para
respostas Negativas. Além disso, há também um controle, para
induzir a criança para a resposta desejada pelo profissional
Ref.: https://www.squids.com.br/arduino/projetos-arduino/jogos/252-jogo-da-memoria-genius-arduino-jogo-03
Sobre o módulo 02, 'Memorização':
> Há quatro botões e LED's, cada um de uma das seguintes co-
res:
- Amarelo
- Azul
- Verde
- Vermelho
Ao toque de um bip e acionamento do LED, a criança deve a-
pertar o botão correspondente a cor, e continuar com a se-
quência
by.: LOSR / <Pedra_Lascada></pL>
*/
// ------ MAPEAMENTO DE HARDWARE FIXO ------ //
#define buzzer A2
#define switchModule 12
int pinosLeds[4] = {7, 8, 9, 10}, // R, G, B e Y respectivamente
pinosBotoes[4] = {2, 3, 4, 5}; // R, G, B e Y respectivamente
// ------ MÓDULOS ------ //
void genius();
void QeA();
// ------ FUNÇÕES ------ //
// ------ VARIÁVEIS GLOBAIS ------ //
#define NOTE_D4 294
#define NOTE_G4 392
#define NOTE_A4 440
#define NOTE_A5 880
int tons[4] = { NOTE_A5, NOTE_A4, NOTE_G4, NOTE_D4 };
int sequencia[100] = {},
rodada_atual,
passo_atual_na_sequencia,
bt_press,
bt_press_f; // Indica se um botão foi pressionado durante o loop principal.
bool perdeu_o_jogo; // Flag indicando se o jogo acabou.
// bt_press_f; // Flag indicando qualquer botão pressionado
void setup() {
Serial.begin(9600);
pinMode(buzzer, OUTPUT);
pinMode(switchModule, INPUT_PULLUP);
for (int i = 0; i <= 3; i++) pinMode(pinosLeds[i], OUTPUT);
for (int i = 0; i <= 3; i++) pinMode(pinosBotoes[i], INPUT_PULLUP);
// Inicializando o random através de uma leitura da porta analógica.
// Esta leitura gera um valor variável entre 0 e 1023.
randomSeed(analogRead(0));
}
void loop(){
if(digitalRead(switchModule)) genius();
else QeA();
}
void genius(){
// Se perdeu o jogo reinicializamos todas as variáveis.
if (perdeu_o_jogo) {
int sequencia[100] = {};
rodada_atual = 0;
passo_atual_na_sequencia = 0;
perdeu_o_jogo = false;
}
// Toca um som de início para anúnicar que o jogo está começando quando é a primeira rodada.
if (rodada_atual == 0) {
tocarSomDeInicio();
delay(500);
}
// Chama a função que inicializa a próxima rodada.
proximaRodada();
// Reproduz a sequência atual.
reproduzirSequencia();
// Aguarda os botões serem pressionados pelo jogador.
aguardarJogador();
// Aguarda 1 segundo entre cada jogada.
delay(1000);
}
// Sorteia um novo item e adiciona na sequência.
void proximaRodada() {
int numero_sorteado = random(0, 4);
sequencia[rodada_atual++] = numero_sorteado;
}
// Reproduz a sequência para ser memorizada.
void reproduzirSequencia() {
for (int i = 0; i < rodada_atual; i++) {
tone(buzzer, tons[sequencia[i]]);
digitalWrite(pinosLeds[sequencia[i]], HIGH);
delay(500);
noTone(buzzer);
digitalWrite(pinosLeds[sequencia[i]], LOW);
delay(100);
}
noTone(buzzer);
}
// Aguarda o jogador iniciar sua jogada.
void aguardarJogador() {
for (int i = 0; i < rodada_atual; i++) {
aguardarJogada();
if (sequencia[passo_atual_na_sequencia] != bt_press) gameOver(); // perdeu
if (perdeu_o_jogo) break; // Quando perder, sair do laço
passo_atual_na_sequencia++;
}
passo_atual_na_sequencia = 0;
}
void aguardarJogada() {
bool jogada_efetuada = 0;
bt_press_f = 5;
while (!jogada_efetuada){
for (int i = 0; i <= 3; i++) {
if(!digitalRead(pinosBotoes[i])) bt_press_f = i; // novo
while(bt_press_f != 5){ // novo
if(digitalRead(pinosBotoes[i]) && bt_press_f == i) {
// Dizendo qual foi o botao pressionado.
bt_press = i;
bt_press_f = 5;
tone(buzzer, tons[i]);
digitalWrite(pinosLeds[i], HIGH);
delay(300);
digitalWrite(pinosLeds[i], LOW);
noTone(buzzer);
jogada_efetuada = true;
}
}
}
//delay(10);
}
}
void gameOver() {
// GAME OVER.
for (int i = 0; i <= 3; i++) {
tone(buzzer, tons[i]);
digitalWrite(pinosLeds[i], HIGH);
delay(200);
digitalWrite(pinosLeds[i], LOW);
noTone(buzzer);
}
tone(buzzer, tons[3]);
for (int i = 0; i <= 3; i++) {
digitalWrite(pinosLeds[0], HIGH);
digitalWrite(pinosLeds[1], HIGH);
digitalWrite(pinosLeds[2], HIGH);
digitalWrite(pinosLeds[3], HIGH);
delay(100);
digitalWrite(pinosLeds[0], LOW);
digitalWrite(pinosLeds[1], LOW);
digitalWrite(pinosLeds[2], LOW);
digitalWrite(pinosLeds[3], LOW);
delay(100);
}
noTone(buzzer);
perdeu_o_jogo = true;
}
void tocarSomDeInicio() {
tone(buzzer, tons[0]);
digitalWrite(pinosLeds[0], HIGH);
digitalWrite(pinosLeds[1], HIGH);
digitalWrite(pinosLeds[2], HIGH);
digitalWrite(pinosLeds[3], HIGH);
delay(500);
digitalWrite(pinosLeds[0], LOW);
digitalWrite(pinosLeds[1], LOW);
digitalWrite(pinosLeds[2], LOW);
digitalWrite(pinosLeds[3], LOW);
delay(500);
noTone(buzzer);
}
void QeA(){};