#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;
#define led_1 32
#define led_2 33
#define led_3 34
#define buzzer 35
#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 19
// editá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 1000 // em milisegundos
#define tempo_pistoes 300 // em milisegundos
//====================================
int var_tempo_do_jogo = tempo_do_jogo;
int led_rnd;
int pistao_rnd;
int valor_led_rnd = 0;
int valor_pistao_rnd = 0;
int acertos = 0;
byte resetar = 0;
byte libera_chave = 1;
byte espera = 1;
byte msg_tiro_alvo = 0;
byte msg_fim = 0;
unsigned long tempo1 = 0;
unsigned long tempo2 = 0;
unsigned long tempo3 = 0;
unsigned long tempo7 = 0;
void setup() {
Serial.begin(115200);
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); // Defina a intensidade da luz (0-15)
digitalWrite(buzzer, !LOW);
digitalWrite(pistao_1, HIGH);
digitalWrite(pistao_2, HIGH);
digitalWrite(pistao_3, HIGH);
digitalWrite(led_1, HIGH);
digitalWrite(led_2, HIGH);
digitalWrite(led_3, HIGH);
}
void loop() {
if (espera == 1) {
func_espera();
} else {
if(var_tempo_do_jogo > 0){
if (millis() - tempo7 >= 1000) {
define_escrever = String(var_tempo_do_jogo) + " > " + String(acertos);
exibe();
var_tempo_do_jogo--;
tempo7 = millis();
}
if (millis() - tempo1 >= tempo_leds) {
sorteio_leds();
tempo1 = millis();
}
if (millis() - tempo3 >= tempo_pistoes) {
sorteio_pistoes();
tempo3 = millis();
}
switch(led_rnd){
case 1:
digitalWrite(led_1, !HIGH);
break;
case 2:
digitalWrite(led_2, !HIGH);
break;
case 3:
digitalWrite(led_3, !HIGH);
break;
default:
break;
}
switch(pistao_rnd){
case 1:
digitalWrite(pistao_1, !HIGH);
break;
case 2:
digitalWrite(pistao_2, !HIGH);
break;
case 3:
digitalWrite(pistao_3, !HIGH);
break;
default:
break;
}
if (libera_chave == 1 && led_rnd == 1 && digitalRead(chave_1) == LOW) {
acertos++;
libera_chave = 0;
}
if (libera_chave == 1 && led_rnd == 2 && digitalRead(chave_2) == LOW) {
acertos++;
libera_chave = 0;
}
if (libera_chave == 1 && led_rnd == 3 && digitalRead(chave_3) == LOW) {
acertos++;
libera_chave = 0;
}
}else{
sorteio_leds();
sorteio_pistoes();
tempo7 = millis();
digitalWrite(buzzer, !HIGH);
delay(tempo_buzzer_final);
digitalWrite(buzzer, !LOW);
while(resetar == 0){
if (millis() - tempo2 >= 1000) {
msg_fim = !msg_fim;
if (msg_fim == 1) {
define_escrever = "FIM...";
exibe();
}
if (msg_fim == 0) {
define_escrever = "-> " + String(acertos);
exibe();
}
tempo2 = millis();
}
if(digitalRead(restart) == LOW){
resetar = 1;
espera = 1;
msg_fim = 0;
acertos = 0;
}
}
}
}
}
void exibe() {
strcpy(message, define_escrever.c_str());
myDisplay.displayText(message, PA_CENTER, 0, 0, PA_NO_EFFECT);
myDisplay.displayAnimate();
}
void func_espera() {
if (millis() - tempo2 >= 1000) {
msg_tiro_alvo = !msg_tiro_alvo;
if (msg_tiro_alvo == 1) {
define_escrever = "Tiro ao";
exibe();
}
if (msg_tiro_alvo == 0) {
define_escrever = "ALVO";
exibe();
}
tempo2 = millis();
}
if (digitalRead(start) == LOW) {
for (int t = 5; t > 0; t--) {
define_escrever = String(t);
exibe();
delay(1000);
}
define_escrever = "vai!!!";
exibe();
digitalWrite(buzzer, !HIGH);
delay(tempo_buzzer_inicio);
digitalWrite(buzzer, !LOW);
espera = 0;
msg_tiro_alvo = 0;
resetar = 0;
}
var_tempo_do_jogo = tempo_do_jogo;
tempo7 = millis();
}
void sorteio_leds() {
while (led_rnd == valor_led_rnd) {
led_rnd = random(1, 4);
}
libera_chave = 1;
valor_led_rnd = led_rnd;
digitalWrite(led_1, !LOW);
digitalWrite(led_2, !LOW);
digitalWrite(led_3, !LOW);
}
void sorteio_pistoes() {
while (pistao_rnd == valor_pistao_rnd) {
pistao_rnd = random(1, 4);
}
valor_pistao_rnd = pistao_rnd;
digitalWrite(pistao_1, !LOW);
digitalWrite(pistao_2, !LOW);
digitalWrite(pistao_3, !LOW);
}