#include "SevSeg.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

int maisEq1 = 8;
int menosEq1 = 7;
int maisEq2 = 10;
int menosEq2 = 9;
int reset = 4;
int ledEq1 = 6;
int ledEq2 = 5;

bool i;
bool band;
bool troca;
bool quadra;
bool areia;
int tiebreake;

int set1;
int eq1;
int estadoAnteriorReset;
int estadoAnteriorMaisEq1;
int estadoAnteriorMenosEq1;

int set2;
int eq2;
int estadoAnteriorMaisEq2;
int estadoAnteriorMenosEq2;

SevSeg sevseg;
SevSeg sevseg2;
SevSeg sevseg3;
SevSeg sevseg4;

LiquidCrystal_I2C lcd(0x27, 16, 2);

const int horario = 11; // PINO DIGITAL (CLK)
const int antiHorario = 12; // PINO DIGITAL (DT)

int contadorPos = 0;  // CONTADOR DE POSIÇÕES DO ENCODER
int ultPosicao; // REGISTRA A ÚLTIMA POSIÇÃO DO ENCODER

void setup() {
  display();
  display2();
  display3();
  display4();


  Serial.begin (9600); //INICIALIZA A SERIAL
  pinMode(ledEq1, OUTPUT);
  pinMode(ledEq2, OUTPUT);
  pinMode(maisEq1, INPUT);
  pinMode(menosEq1, INPUT);
  pinMode(maisEq2, INPUT);
  pinMode(menosEq2, INPUT);
  pinMode(reset, INPUT);
  pinMode (horario, INPUT); //DEFINE O PINO COMO ENTRADA
  pinMode (antiHorario, INPUT); //DEFINE O PINO COMO ENTRADA
  //encoder
  ultPosicao = digitalRead(horario); // VARIÁVEL RECEBE A LEITURA DO PINO CLK
  //LCD
  lcd.init();
  lcd.setBacklight(HIGH);
  lcd.setCursor(0, 0);
  lcd.print("Selecione:");
  lcd.setCursor(0, 1);
  lcd.print("Quadra ou Areia");
  delay(1000);
  lcd.setBacklight(LOW);
  delay(1000);
}

void loop() {
  //botao
  int estadoReset = digitalRead(reset);
  int estadoMaisEq1 = digitalRead(maisEq1);
  int estadoMenosEq1 = digitalRead(menosEq1);
  int estadoMaisEq2 = digitalRead(maisEq2);
  int estadoMenosEq2 = digitalRead(menosEq2);

 
  
  if ((estadoReset == LOW) && (estadoAnteriorReset == HIGH)) {
    eq1 = 0;
    eq2 = 0;
    set1 = 0;
    set2 = 0;
    i = false;
    troca = false;
    quadra = false;
    areia = false;
    tiebreake = false;
    digitalWrite(ledEq2, LOW);
    digitalWrite(ledEq1, LOW);
    delay(200);
  }
  
  if ((estadoMaisEq1 == LOW) && (estadoAnteriorMaisEq1 == HIGH)) {
    eq1++;
    band = true;
    digitalWrite(ledEq2, LOW);
    digitalWrite(ledEq1, HIGH);
    delay(200);
  }
  if ((estadoMenosEq1 == LOW) && (estadoAnteriorMenosEq1 == HIGH)) {
    eq1--;
    band = true;
    delay(200);
  }
  if ((estadoMaisEq2 == LOW) && (estadoAnteriorMaisEq2 == HIGH)) {
    eq2++;
    band = true;
    digitalWrite(ledEq1, LOW);
    digitalWrite(ledEq2, HIGH);
    delay(200);
  }
  if ((estadoMenosEq2 == LOW) && (estadoAnteriorMenosEq2 == HIGH)) {
    eq2--;
    band = true;
    delay(200);
  }

  estadoAnteriorReset = estadoReset;

  estadoAnteriorMaisEq1 = estadoMaisEq1;
  estadoAnteriorMenosEq1 = estadoMenosEq1;

  estadoAnteriorMaisEq2 = estadoMaisEq2;
  estadoAnteriorMenosEq2 = estadoMenosEq2;

  lcd.setBacklight(HIGH);

  //encoder
  int leituraHorario = digitalRead(horario); // LEITURA DO PinoCLK

  if (leituraHorario != ultPosicao) { // SE O VALOR DA VARIÁVEL FOR DIFERENTE DO VALOR DE "ultPosicao", FAZ
    if (digitalRead(antiHorario) != leituraHorario) { // SE LEITURA DO PinoDT FOR DIFERENTE DA LEITURA DE "leituraCLK", FAZ
      contadorPos++; // INCREMENTA CONTAGEM DA VARIÁVEL EM +1
      lcd.clear();
      lcd.setCursor(0, 1);
      lcd.print("2.Areia");
      lcd.setCursor(0, 0);
      lcd.print(" ");
      areia = true;
      quadra = false;
    } else { // SENÃO, FAZ
      contadorPos--; // DECREMENTA CONTAGEM DA VARIÁVEL EM -1
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("1.Quadra");
      lcd.setCursor(0, 1);
      lcd.print(" ");
      quadra = true;
      areia = false;
    }

    ultPosicao = leituraHorario; // VARIÁVEL RECEBE O VALOR DE "leituraCLK"
  }

  sevseg4.setNumber(eq1);
  sevseg3.setNumber(eq2);
  sevseg2.setNumber(set1);
  sevseg.setNumber(set2);
  sevseg.refreshDisplay();
  sevseg2.refreshDisplay();
  sevseg3.refreshDisplay();
  sevseg4.refreshDisplay();
  //regras do jogo quadra
  if (quadra == true) {
    if ((eq1 >= 25 || eq2 >= 25) && abs(eq1 - eq2) >= 2 && tiebreake == false) {
      if (eq1 > eq2) {
        eq1 = 0;
        eq2 = 0;
        set1++;

      } else {
        eq1 = 0;
        eq2 = 0;
        set2++;
      }
    }
    if ((set1 == 2 && set2 == 2) && (i == false)) {
      i = true;
      tiebreake = true;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Tiebreake");
      delay(5000);
    }
    if (tiebreake == true) {
      if (eq1 == 8 || eq2 == 8 && tiebreake == true && troca == false) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Tiebreake");
        lcd.setCursor(0, 1);
        lcd.print("troca de lado");
        delay(30000);
        lcd.clear();
        troca = true;
      }

    }
    if ((eq1 >= 15 || eq2 >= 15) && abs(eq1 - eq2) >= 2 && tiebreake == true) {
      if (eq1 > eq2) {
        eq1 = 0;
        eq2 = 0;
        set1++;

      } else {
        eq1 = 0;
        eq2 = 0;
        set2++;
      }
    }
    if (set1 == 3 || set2 == 3) {
      if (set1 > set2) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("time 1 ganhou");
        delay(3000);
        lcd.clear();
        set1 = 0;
        set2 = 0;
        i = false;
        troca = false;
        quadra = false;
        areia = false;
        tiebreake = false;
      } else {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("time 2 ganhou");
        delay(3000);
        lcd.clear();
        set1 = 0;
        set2 = 0;
        i = false;
        troca = false;
        quadra = false;
        areia = false;
        tiebreake = false;
      }
    }
  }
  // regras da areia
  if (areia == true) {
    if ((eq1 >= 21 || eq2 >= 21) && abs(eq1 - eq2) >= 2 && tiebreake == false) {
      if (eq1 > eq2) {
        eq1 = 0;
        eq2 = 0;
        set1++;

      } else {
        eq1 = 0;
        eq2 = 0;
        set2++;
      }
    }
    if ((set1 == 1 && set2 == 1) && (i == false)) {
      i = true;
      tiebreake = true;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Tiebreake");
      delay(5000);
    }
    if (tiebreake == true) {
      if (((eq1 + eq2 ) % 7 == 0 ) && (eq1 >= 1 || eq2 >= 1 )  && (band == true)) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Tiebreake");
        lcd.setCursor(0, 1);
        lcd.print("troca de lado");
        delay(30000);
        lcd.clear();
        band = false;
      }
    }
    if (set1 == 2 || set2 == 2) {
      if (set1 > set2) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("time 1 ganhou");
        delay(5000);
        lcd.clear();
        set1 = 0;
        set2 = 0;
        i = false;
        troca = false;
        quadra = false;
        areia = false;
        tiebreake = false;
      } else {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("time 2 ganhou");
        delay(5000);
        lcd.clear();
        set1 = 0;
        set2 = 0;
        i = false;
        troca = false;
        quadra = false;
        areia = false;
        tiebreake = false;
      }
    }
  }
}

void display() {
  byte numDigits = 1;
  byte digitPins[] = {39};
  byte segmentPins[] = {42, 43, 40, 38, 41, 45, 44};
  bool resistorsOnSegments = false;
  byte hardwareConfig = COMMON_ANODE;
  bool updateWithDelays = false;
  bool leadingZeros = false;
  bool disableDecPoint = false;

  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
               updateWithDelays, leadingZeros, disableDecPoint);
  sevseg.setBrightness(90);
}

void display2() {
  byte numDigits1 = 1;
  byte digitPins1[] = {31};
  byte segmentPins1[] = {49, 46, 48, 51, 50, 53, 52};
  bool resistorsOnSegments1 = false;
  byte hardwareConfig1 = COMMON_ANODE;
  bool updateWithDelays1 = false;
  bool leadingZeros1 = false;
  bool disableDecPoint1 = false;

  sevseg2.begin(hardwareConfig1, numDigits1, digitPins1, segmentPins1, resistorsOnSegments1,
                updateWithDelays1, leadingZeros1, disableDecPoint1);
  sevseg2.setBrightness(90);
}

void display3() {
  byte numDigits2 = 2;
  byte digitPins2[] = {16, 24};
  byte segmentPins2[] = {26, 27, 29, 22, 15, 25, 14, 28};
  bool resistorsOnSegments2 = false;
  byte hardwareConfig2 = COMMON_ANODE;
  bool updateWithDelays2 = false;
  bool leadingZeros2 = false;
  bool disableDecPoint2 = false;

  sevseg3.begin(hardwareConfig2, numDigits2, digitPins2, segmentPins2, resistorsOnSegments2,
                updateWithDelays2, leadingZeros2, disableDecPoint2);
  sevseg3.setBrightness(90);
}

void display4() {
  byte numDigits = 2;
  byte digitPins[] = {18, 36};
  byte segmentPins[] = {35, 34, 32, 30, 19, 37, 17, 33};
  bool resistorsOnSegments = false;
  byte hardwareConfig = COMMON_ANODE;
  bool updateWithDelays = false;
  bool leadingZeros = false;
  bool disableDecPoint = false;

  sevseg4.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
                updateWithDelays, leadingZeros, disableDecPoint);
  sevseg4.setBrightness(90);
  
}

$abcdeabcde151015202530fghijfghij