#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4 // Número de módulos da matriz de LEDs
#define CLK_PIN 18
#define DATA_PIN 23
#define CS_PIN 5
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
char message[100]; // Buffer para armazenar a mensagem
String define_escrever;
// Definição dos pinos
#define led_1 32
#define led_2 33
#define led_3 12
#define buzzer 13
#define chave_1 21
#define chave_2 22
#define chave_3 4
#define pistao_1 25
#define pistao_2 26
#define pistao_3 27
#define start 15
#define restart 2
// Parâmetros configuráveis
#define TEMPO_DO_JOGO 10 // em segundos
#define TEMPO_BUZZER_INICIO 200 // em milisegundos
#define TEMPO_BUZZER_FINAL 500 // em milisegundos
#define TEMPO_LEDS 300 // em milisegundos
#define TEMPO_PISTOES 200 // em milisegundos
int var_tempo_do_jogo = TEMPO_DO_JOGO;
int led_rnd, pistao_rnd;
int valor_led_rnd = 0;
int valor_pistao_rnd = 0;
int acertos = 0;
bool resetar = false;
bool libera_chave = true;
bool espera = true;
bool msg_tiro_alvo = false;
bool msg_fim = false;
unsigned long tempo1 = 0, tempo2 = 0, tempo3 = 0, tempo4 = 0;
void setup() {
Serial.begin(115200);
// Configuração dos pinos
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(pistao_1, OUTPUT);
pinMode(pistao_2, OUTPUT);
pinMode(pistao_3, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(chave_1, INPUT_PULLUP);
pinMode(chave_2, INPUT_PULLUP);
pinMode(chave_3, INPUT_PULLUP);
pinMode(start, INPUT_PULLUP);
pinMode(restart, INPUT_PULLUP);
randomSeed(analogRead(0));
led_rnd = random(1, 4);
pistao_rnd = random(1, 4);
myDisplay.begin();
myDisplay.setIntensity(15);
digitalWrite(buzzer, HIGH);
desativarComponentes();
}
void loop() {
if (espera) {
func_espera();
} else {
if (var_tempo_do_jogo > 0) {
atualizarTempoEPlacar();
gerenciarLedsEPistoes();
verificarChaves();
} else {
finalizarJogo();
}
}
}
void exibe() {
strcpy(message, define_escrever.c_str());
myDisplay.displayText(message, PA_CENTER, 0, 0, PA_NO_EFFECT);
myDisplay.displayAnimate();
}
void func_espera() {
alternarMensagemInicial();
if (digitalRead(start) == LOW) {
iniciarJogo();
}
var_tempo_do_jogo = TEMPO_DO_JOGO;
tempo7 = millis();
}
void alternarMensagemInicial() {
if (millis() - tempo2 >= 1000) {
msg_tiro_alvo = !msg_tiro_alvo;
define_escrever = msg_tiro_alvo ? "Tiro ao" : "ALVO";
exibe();
tempo2 = millis();
}
}
void iniciarJogo() {
for (int t = 5; t > 0; t--) {
define_escrever = String(t);
exibe();
delay(1000);
}
define_escrever = "vai!!!";
exibe();
digitalWrite(buzzer, LOW);
delay(TEMPO_BUZZER_INICIO);
digitalWrite(buzzer, HIGH);
espera = false;
msg_tiro_alvo = false;
resetar = false;
}
void atualizarTempoEPlacar() {
if (millis() - tempo4 >= 1000) {
define_escrever = String(var_tempo_do_jogo) + " > " + String(acertos);
exibe();
var_tempo_do_jogo--;
tempo4 = millis();
}
}
void gerenciarLedsEPistoes() {
if (millis() - tempo1 >= TEMPO_LEDS) {
sorteio_leds();
tempo1 = millis();
}
if (millis() - tempo3 >= TEMPO_PISTOES) {
sorteio_pistoes();
tempo3 = millis();
}
controlarComponente(led_rnd, led_1, led_2, led_3);
controlarComponente(pistao_rnd, pistao_1, pistao_2, pistao_3);
}
void verificarChaves() {
if (libera_chave) {
if ((led_rnd == 1 && digitalRead(chave_1) == LOW) ||
(led_rnd == 2 && digitalRead(chave_2) == LOW) ||
(led_rnd == 3 && digitalRead(chave_3) == LOW)) {
acertos++;
libera_chave = false;
}
}
}
void finalizarJogo() {
sorteio_leds();
sorteio_pistoes();
tempo4 = millis();
digitalWrite(buzzer, LOW);
delay(TEMPO_BUZZER_FINAL);
digitalWrite(buzzer, HIGH);
while (!resetar) {
if (millis() - tempo2 >= 1000) {
msg_fim = !msg_fim;
define_escrever = msg_fim ? "FIM..." : "-> " + String(acertos);
exibe();
tempo2 = millis();
}
if (digitalRead(restart) == LOW) {
resetar = true;
espera = true;
msg_fim = false;
acertos = 0;
}
}
}
void sorteio_leds() {
do {
led_rnd = random(1, 4);
} while (led_rnd == valor_led_rnd);
libera_chave = true;
valor_led_rnd = led_rnd;
desativarLeds();
}
void sorteio_pistoes() {
do {
pistao_rnd = random(1, 4);
} while (pistao_rnd == valor_pistao_rnd);
valor_pistao_rnd = pistao_rnd;
desativarPistoes();
}
void desativarComponentes() {
desativarLeds();
desativarPistoes();
}
void desativarLeds() {
digitalWrite(led_1, HIGH);
digitalWrite(led_2, HIGH);
digitalWrite(led_3, HIGH);
}
void desativarPistoes() {
digitalWrite(pistao_1, HIGH);
digitalWrite(pistao_2, HIGH);
digitalWrite(pistao_3, HIGH);
}
void controlarComponente(int rnd, int pino1, int pino2, int pino3) {
digitalWrite(pino1, rnd == 1 ? LOW : HIGH);
digitalWrite(pino2, rnd == 2 ? LOW : HIGH);
digitalWrite(pino3, rnd == 3 ? LOW : HIGH);
}