#include <LiquidCrystal_I2C.h>
#include "SevSeg.h"
// ------ Displays ------ //
SevSeg ss1; // 2 digitos time branco
SevSeg ss2; // 1 digito time branco
SevSeg ss3; // 2 digitos time azul
SevSeg ss4; // 1 digito time azul
// ------ Leds ------ //
// --- Time Branco --- //
#define led_Branco 8
#define led_Azul 9
// ------ Botões ------ //
// --- Time Branco --- //
#define botaoVd_Branco 2
#define botaoVr_Branco 3
// --- Reset --- //
#define botao_Reset 4
// --- Time Azul --- //
#define botaoVd_Azul 6
#define botaoVr_Azul 5
// ------ Encoder ------ //
#define pinoCLK A0 //PINO DIGITAL (CLK)
#define pinoDT A1 //PINO DIGITAL (DT)
#define pinoSW A2 //PINO DIGITAL (SW)
// ------ Váriaveis ------ //
unsigned long tempo = 0;
int ultPosicao;
int leituraCLK;
int pontuacao_Branco = 0;
int set_Branco = 0;
int pontuacao_Azul = 0;
int set_Azul = 0;
int pontuacao_temp;
int set_temp;
bool flag = true;
bool flag2 = true;
bool flag3 = false;
bool area;
bool troca;
bool LbotaoVd_Branco;
bool LbotaoVr_Branco;
bool LbotaoVd_Azul;
bool LbotaoVr_Azul;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void analisar(bool area, bool tiebreak) {
if (area == false) { // quadra
if (tiebreak == false) {
if (pontuacao_Branco >= 25 or pontuacao_Azul >= 25) {
if (pontuacao_Branco - pontuacao_Azul >= 2 or pontuacao_Azul - pontuacao_Branco >= 2) {
if (pontuacao_Branco > pontuacao_Azul) {
set_Branco++;
pontuacao_Branco = 0;
pontuacao_Azul = 0;
} else {
set_Azul++;
pontuacao_Branco = 0;
pontuacao_Azul = 0;}}}
} else {
if ((pontuacao_Branco == 8 or pontuacao_Azul == 8) and flag3 == false){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Troca de lados");
delay(1000);
pontuacao_temp = pontuacao_Azul;
pontuacao_Azul = pontuacao_Branco;
pontuacao_Branco = pontuacao_temp;
set_temp = set_Azul;
set_Azul = set_Branco;
set_Branco = set_temp;
flag3 = true;}
if (pontuacao_Branco >= 5 or pontuacao_Azul >= 25) {
if (pontuacao_Branco - pontuacao_Azul >= 2 or pontuacao_Azul - pontuacao_Branco >= 2) {
if (pontuacao_Branco > pontuacao_Azul) {
set_Branco++;
pontuacao_Branco = 0;
pontuacao_Azul = 0;
} else {
set_Azul++;
pontuacao_Branco = 0;
pontuacao_Azul = 0;}}}}
} else { // areia
if(tiebreak == false) {
if (pontuacao_Branco >= 21 or pontuacao_Azul >= 21) {
if (pontuacao_Branco - pontuacao_Azul >= 2 or pontuacao_Azul - pontuacao_Branco >= 2) {
if (pontuacao_Branco > pontuacao_Azul) {
set_Branco++;
pontuacao_Branco = 0;
pontuacao_Azul = 0;
} else {
set_Azul++;
pontuacao_Branco = 0;
pontuacao_Azul = 0;}}}
} else {
if ((pontuacao_Branco + pontuacao_Azul) != 0 and (pontuacao_Branco + pontuacao_Azul) % 7 == 0 and flag3 == false){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Troca de lados");
delay(1000);
pontuacao_temp = pontuacao_Azul;
pontuacao_Azul = pontuacao_Branco;
pontuacao_Branco = pontuacao_temp;
set_temp = set_Azul;
set_Azul = set_Branco;
set_Branco = set_temp;
flag3=true;}
if (pontuacao_Branco >= 15 or pontuacao_Azul >= 15) {
if (pontuacao_Branco - pontuacao_Azul >= 2 or pontuacao_Azul - pontuacao_Branco >= 2) {
if (pontuacao_Branco > pontuacao_Azul) {
set_Branco++;
pontuacao_Branco = 0;
pontuacao_Azul = 0;
} else {
set_Azul++;
pontuacao_Branco = 0;
pontuacao_Azul = 0;}}}}
}
}
void quadra() {
troca = false;
while (digitalRead(botao_Reset) != 0){
if(millis()-tempo >= 2500) {
tempo = millis();
if(troca == true) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Area selecionada");
lcd.setCursor(5, 1);
lcd.print("Quadra");
troca = false;
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Para reiniciar:");
lcd.setCursor(1, 1);
lcd.print("Botao cinza");
troca = true;
}
}
if (digitalRead(botaoVd_Branco) == 0) {
pontuacao_Branco++;
delay(250);
}
if (digitalRead(botaoVr_Branco) == 0) {
pontuacao_Branco--;
if (pontuacao_Branco < 0){
pontuacao_Branco++;
}
delay(250);
}
if (digitalRead(botaoVd_Azul) == 0) {
pontuacao_Azul++;
delay(250);
}
if (digitalRead(botaoVr_Azul) == 0) {
pontuacao_Azul--;
if (pontuacao_Azul < 0){
pontuacao_Azul++;
}
delay(250);
}
if (set_Branco == 2 and set_Azul == 2){
analisar(false, true);
} else {
analisar(false, false);
}
atualizar_Displays();
}
}
void areia() {
troca = false;
while (digitalRead(botao_Reset) != 0){
if(millis()-tempo >= 2500) {
tempo = millis();
if(troca == true) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Area selecionada");
lcd.setCursor(5, 1);
lcd.print("Areia");
troca = false;
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Para reiniciar:");
lcd.setCursor(1, 1);
lcd.print("Botao cinza");
troca = true;
}
}
if (digitalRead(botaoVd_Branco) == 0) {
pontuacao_Branco++;
flag3=false;
delay(250);
}
if (digitalRead(botaoVr_Branco) == 0) {
pontuacao_Branco--;
if (pontuacao_Branco < 0){
pontuacao_Branco++;
}
flag3=false;
delay(250);
}
if (digitalRead(botaoVd_Azul) == 0) {
pontuacao_Azul++;
flag3=false;
delay(250);
}
if (digitalRead(botaoVr_Azul) == 0) {
pontuacao_Azul--;
if (pontuacao_Azul < 0){
pontuacao_Azul++;
}
flag3=false;
delay(250);
}
if (set_Branco == 1 and set_Azul == 1){
analisar(true, true);
} else {
analisar(true, false);
}
atualizar_Displays();
}
}
void atualizar_Displays () {
ss1.setNumber(pontuacao_Branco, 2);
ss1.refreshDisplay();
ss2.setNumber(set_Branco, 1);
ss2.refreshDisplay();
ss3.setNumber(pontuacao_Azul, 2);
ss3.refreshDisplay();
ss4.setNumber(set_Azul, 1);
ss4.refreshDisplay();
}
void initSevSeg() {
// ---------------------- Time Branco ----------------------- //
byte numDigits = 2;
byte digitPins[] = {10, 11};
byte segmentPins[] = {22, 23, 24, 25, 26, 27, 28};
bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_ANODE; // See README.md for options
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected
ss1.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
byte numDigits2 = 1;
byte digitPins2[] = {37};
byte segmentPins2[] = {30, 31, 32, 33, 34, 35, 36};
ss2.begin(hardwareConfig, numDigits2, digitPins2, segmentPins2, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
// ---------------------------------------------------------- //
// ----------------------- Time Azul ------------------------ //
byte numDigits3 = 2;
byte digitPins3[] = {12, 13};
byte segmentPins3[] = {38, 39, 40, 41, 42, 43, 44};
ss3.begin(hardwareConfig, numDigits3, digitPins3, segmentPins3, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
byte numDigits4 = 1;
byte digitPins4[] = {53};
byte segmentPins4[] = {46, 47, 48, 49, 50, 51, 52};
ss4.begin(hardwareConfig, numDigits4, digitPins4, segmentPins4, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
// ---------------------------------------------------------- //
}
void setup() {
lcd.init();
lcd.init(); //initialize the lcd
lcd.backlight(); //open the backlight
initSevSeg();
pinMode(botaoVd_Branco, INPUT_PULLUP);
pinMode(botaoVr_Branco, INPUT_PULLUP);
pinMode(botao_Reset, INPUT_PULLUP);
pinMode(botaoVd_Azul, INPUT_PULLUP);
pinMode(botaoVr_Azul, INPUT_PULLUP);
pinMode (pinoCLK,INPUT);
pinMode (pinoDT,INPUT);
pinMode (pinoSW,INPUT_PULLUP);
ultPosicao = digitalRead(pinoCLK);
}
void loop() {
pontuacao_Branco = 0;
pontuacao_Azul = 0;
set_Branco = 0;
set_Azul = 0;
flag3 = false;
if (flag == true) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Iniciando...");
delay(1500);
lcd.clear();
flag = false;
}
if (flag2 == true) {
lcd.setCursor(0, 0);
lcd.print("Selecione a area");
delay(1500);
lcd.setCursor(1, 1);
lcd.print(">Quadra Areia");
flag2 = false;
area = false;
}
//quadra();
leituraCLK = digitalRead(pinoCLK); //VARIÁVEL RECEBE A LEITURA DO PINO CLK
if (leituraCLK != ultPosicao){ //SE VALOR DA VARIÁVEL FOR DIFERENTE DO VALOR DE "ultPosicao", FAZ
if (digitalRead(pinoDT) != leituraCLK) {
lcd.setCursor(1, 1);
lcd.print(" Quadra >Areia");
area = true; // Areia
} else {
lcd.setCursor(1, 1);
lcd.print(">Quadra Areia");
area = false;} // Quadra
}
if(digitalRead(pinoSW) == LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Area selecionada");
delay(1500);
flag = true;
flag2 = true;
if (area == true) {
lcd.setCursor(5, 1);
lcd.print("Areia");
delay(1000);
lcd.clear();
areia();
} else {
lcd.setCursor(5, 1);
lcd.print("Quadra");
delay(1000);
lcd.clear();
quadra();
}
}
}