#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
// Definindo pinos
const int ledPins[] = {2, 3, 4};
const int pistonPins[] = {8, 9, 10};
const int switchPins[] = {5, 6, 7};
const int buzzerPin = A5;
const int startPin = A0;
const int restartPin = A1;
// Pinos da matriz de LEDs
const int clkPin = 13;
const int dataPin = 11;
const int csPin = 12;
// Configuração do display
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4
MD_Parola display = MD_Parola(HARDWARE_TYPE, dataPin, clkPin, csPin, MAX_DEVICES);
// Variáveis de controle
int acertos = 0;
bool jogoEmAndamento = false;
unsigned long tempoInicioJogo;
unsigned long ultimoSorteioLed = 0;
unsigned long ultimoSorteioPistao = 0;
int ultimoLed = -1;
int ultimoPistao = -1;
void setup() {
// Inicializando pinos
for (int i = 0; i < 3; i++) {
pinMode(ledPins[i], OUTPUT);
pinMode(pistonPins[i], OUTPUT);
pinMode(switchPins[i], INPUT_PULLUP);
}
pinMode(buzzerPin, OUTPUT);
pinMode(startPin, INPUT_PULLUP);
pinMode(restartPin, INPUT_PULLUP);
// Inicializando display
display.begin();
display.setIntensity(5);
display.displayClear();
display.displayText("Tiro ao ALVO..", PA_CENTER, 100, 1000, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
}
void loop() {
display.displayAnimate();
if (digitalRead(startPin) == LOW && !jogoEmAndamento) {
iniciarJogo();
}
if (jogoEmAndamento) {
unsigned long tempoAtual = millis();
if (tempoAtual - tempoInicioJogo <= 30000) {
if (tempoAtual - ultimoSorteioLed >= 2000) {
sorteioLeds();
ultimoSorteioLed = tempoAtual;
}
if (tempoAtual - ultimoSorteioPistao >= 4000) {
sorteioPistoes();
ultimoSorteioPistao = tempoAtual;
}
checarAcertos();
} else {
finalizarJogo();
}
}
if (digitalRead(restartPin) == LOW) {
reiniciarJogo();
}
}
void iniciarJogo() {
display.displayClear();
for (int i = 5; i > 0; i--) {
display.displayText(String(i).c_str(), PA_CENTER, 0, 1000, PA_PRINT, PA_NO_EFFECT);
display.displayAnimate();
delay(1000);
}
// Tocar o buzzer por 2 segundos após a contagem regressiva
digitalWrite(buzzerPin, HIGH);
delay(2000);
digitalWrite(buzzerPin, LOW);
jogoEmAndamento = true;
tempoInicioJogo = millis();
acertos = 0;
}
void sorteioLeds() {
if (ultimoLed != -1) {
digitalWrite(ledPins[ultimoLed], LOW);
}
int led;
do {
led = random(0, 3);
} while (led == ultimoLed);
digitalWrite(ledPins[led], HIGH);
ultimoLed = led;
}
void sorteioPistoes() {
if (ultimoPistao != -1) {
digitalWrite(pistonPins[ultimoPistao], LOW);
}
int pistao;
do {
pistao = random(0, 3);
} while (pistao == ultimoPistao);
digitalWrite(pistonPins[pistao], HIGH);
ultimoPistao = pistao;
}
void checarAcertos() {
for (int i = 0; i < 3; i++) {
if (digitalRead(switchPins[i]) == LOW && digitalRead(ledPins[i]) == HIGH) {
acertos++;
display.displayText(String(acertos).c_str(), PA_CENTER, 0, 2000, PA_PRINT, PA_NO_EFFECT);
display.displayAnimate();
delay(2000); // Prevenir múltiplos toques
}
}
}
void finalizarJogo() {
jogoEmAndamento = false;
for (int i = 0; i < 3; i++) {
digitalWrite(ledPins[i], LOW);
digitalWrite(pistonPins[i], LOW);
}
while (digitalRead(restartPin) == HIGH) {
display.displayText("Fim..", PA_CENTER, 0, 1000, PA_PRINT, PA_NO_EFFECT);
display.displayAnimate();
delay(1000);
display.displayText(String(acertos).c_str(), PA_CENTER, 0, 1000, PA_PRINT, PA_NO_EFFECT);
display.displayAnimate();
delay(1000);
}
}
void reiniciarJogo() {
jogoEmAndamento = false;
acertos = 0;
display.displayClear();
display.displayText("Tiro ao ALVO..", PA_CENTER, 100, 1000, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
display.displayAnimate();
}