// Configurações do jogo
#define TEMPO_PADRAO_1 30 // Em segundos
#define TEMPO_PADRAO_2 100 // Em segundos
#define CHANCES_PADRAO_1 3 // Máximo 3
#define CHANCES_PADRAO_2 1 //Máximo 3
#define VOLUME_DFPLAYER 25 // Volume de 0 a 30
#define TOUCH_THRESHOLD 22 // Limite do toque
#define INTENSIDADE 5 // Defina a intensidade da luz (0-15)
// Bibliotecas
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include "HardwareSerial.h"
#include "DFRobotDFPlayerMini.h"
// Definições dos pinos de toque
#define circuito_1 T4
#define final_1 T5
#define circuito_2 T6
#define final_2 T7
// Definições gerais - Display LEDS
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4 // Número de módulos de leds
#define CLK_PIN 18
#define DATA_PIN 23
#define CS_PIN 5
// Pinos LEDs
#define led_vm 26
#define led_vd 32
#define led_am 33
// Pinos botões
#define BT1 22
#define BT2 21
// Objetos globais
MD_Parola display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
HardwareSerial mySerial(1);
DFRobotDFPlayerMini myDFPlayer;
// Variáveis globais
int tempoJogo_1 = TEMPO_PADRAO_1;
int tempoJogo_2 = TEMPO_PADRAO_2;
int chances_1 = CHANCES_PADRAO_1;
int chances_2 = CHANCES_PADRAO_2;
int estadoJogo = 0; // 0: inicial, 1: primeiro circuito, etc.
unsigned long ultimoMillis = 0;
String mensagem;
// Setup
void setup() {
// Configuração de pinos
pinMode(led_vm, OUTPUT);
pinMode(led_vd, OUTPUT);
pinMode(led_am, OUTPUT);
pinMode(BT1, INPUT_PULLUP);
pinMode(BT2, INPUT_PULLUP);
// Inicializações
Serial.begin(115200);
delay(200);
mySerial.begin(9600, SERIAL_8N1, 16, 17);
if (!myDFPlayer.begin(mySerial)) {
Serial.println("Erro no DFPlayer!");
while (true);
}
myDFPlayer.volume(VOLUME_DFPLAYER);
display.begin();
display.setIntensity(INTENSIDADE);
display.displayClear();
// Configuração do Segundo Núcleo
xTaskCreatePinnedToCore(loop2, "loop2", 8192, NULL, 1, NULL, 0);
}
// Funções auxiliares
// 1 - Exibir Mensagens
void exibirMensagem(String texto, textEffect_t efeito, int velocidade = 50) {
display.displayText((char *)texto.c_str(), PA_CENTER, velocidade, 0, efeito);
while (!display.displayAnimate()) {
if (digitalRead(BT1) == LOW) {
delay(200);
if (estadoJogo == 0){
estadoJogo = 1;
chances_1 = CHANCES_PADRAO_1;
display.displayClear();
verifica_chances();
}
break;
}
}
}
// 2 - Verificar Chances
void verifica_chances(){
if(estadoJogo == 1){
if(chances_1 == 3){
digitalWrite(led_vm, LOW);
digitalWrite(led_am, LOW);
digitalWrite(led_vd, HIGH);
myDFPlayer.play(3);
}else if (chances_1 == 2){
digitalWrite(led_vm, LOW);
digitalWrite(led_vd, LOW);
digitalWrite(led_am, HIGH);
myDFPlayer.play(2);
}else if(chances_1 == 1){
digitalWrite(led_am, LOW);
digitalWrite(led_vd, LOW);
digitalWrite(led_vm, HIGH);
myDFPlayer.play(1);
}else if(chances_1 <= 0){
myDFPlayer.play(15);
delay(3000);
myDFPlayer.play(4);
estadoJogo = 0;
tempoJogo_1 = TEMPO_PADRAO_1;
chances_1 = CHANCES_PADRAO_1;
digitalWrite(led_vd, LOW);
digitalWrite(led_vm, LOW);
digitalWrite(led_am, LOW);
}
}else if(estadoJogo == 3){
if(chances_2 == 3){
digitalWrite(led_vm, LOW);
digitalWrite(led_am, LOW);
digitalWrite(led_vd, HIGH);
myDFPlayer.play(3);
}else if (chances_2 == 2){
digitalWrite(led_vm, LOW);
digitalWrite(led_vd, LOW);
digitalWrite(led_am, HIGH);
myDFPlayer.play(2);
}else if(chances_2 == 1){
digitalWrite(led_am, LOW);
digitalWrite(led_vd, LOW);
digitalWrite(led_vm, HIGH);
myDFPlayer.play(1);
}else if(chances_2 <= 0){
myDFPlayer.play(15);
delay(3000);
myDFPlayer.play(4);
estadoJogo = 0;
tempoJogo_2 = TEMPO_PADRAO_2;
chances_2 = CHANCES_PADRAO_2;
digitalWrite(led_vd, LOW);
digitalWrite(led_vm, LOW);
digitalWrite(led_am, LOW);
}
}
}
// Loop principal
void loop() {
if(estadoJogo == 0){
exibirMensagem("Corrida El\xE9trica ", PA_SCROLL_LEFT,35);
}
if(estadoJogo == 1){
if (millis() - ultimoMillis >= 1000) {
ultimoMillis = millis();
tempoJogo_1--;
mensagem = String(tempoJogo_1) + " ";
exibirMensagem(mensagem, PA_SCROLL_LEFT,5);
if(tempoJogo_1 <= 0){
chances_1 = 0;
verifica_chances();
}
}
}
if(estadoJogo == 2){
display.displayClear();
exibirMensagem("Segundo Circuito", PA_SCROLL_LEFT,35);
delay(1900);
estadoJogo = 3;
display.displayClear();
verifica_chances();
}
if(estadoJogo == 3){
if (millis() - ultimoMillis >= 1000) {
ultimoMillis = millis();
tempoJogo_2--;
mensagem = String(tempoJogo_2) + " ";
exibirMensagem(mensagem, PA_SCROLL_LEFT,5);
if(tempoJogo_2 <= 0){
chances_2 = 0;
verifica_chances();
}
}
}
if(estadoJogo == 4){
myDFPlayer.play(13);
display.displayClear();
mensagem = "Grande Vencedor!! ";
exibirMensagem(mensagem, PA_SCROLL_LEFT,35);
digitalWrite(led_vm, LOW);
digitalWrite(led_am, LOW);
digitalWrite(led_vd, LOW);
delay(1500);
myDFPlayer.play(12);
delay(4000);
display.displayClear();
estadoJogo = 0;
}
}