#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define LED_gb A0
#define LED_r A1
#define BEEPER 13
#define DEFUSE_NUZKY 11
#define DEFUSE 10

LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 colunas e 2 linhas

const uint8_t ROWS = 4;
const uint8_t COLS = 3;
char keys[ROWS][COLS] = {
  { '1', '2', '3'},
  { '4', '5', '6'},
  { '7', '8', '9'},
  { '*', '0', '#'}
};

uint8_t colPins[COLS] = { 5, 4, 3}; // Pinos conectados a C1, C2, C3, C4
uint8_t rowPins[ROWS] = { 9, 8, 7, 6 }; // Pinos conectados a R1, R2, R3, R4

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

String lock = "7355608";
String kod = "";
bool plant = false, explosion = false;
float start, blik;
int reset = 0;
int tisk = 0;
int segundos = 0, power, beep, n = 1;
float defuse = 0;

void defuseloop() {
  switch (tisk) {
    case 0:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("DEFUSING");
      tisk = 1;
      break;
    case 1:
      lcd.print(".");
  }

  if (digitalRead(DEFUSE_NUZKY) == LOW)
    defuse += 1.7;
  else
    defuse++;
  if (defuse > 9) {
    plant = 0;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("THE BOMB HAS");
    lcd.setCursor(0, 1);
    lcd.print("BEEN DEFUSED");
    defuse = 1;
    segundos = 0;
    kod = "";
    reset = 1;
    tisk = 0;
  }
}

void setup() {
  lcd.init(); // Inicializa o LCD
  lcd.backlight(); // Liga o backlight 

  pinMode(A5, OUTPUT);
  digitalWrite(A5, LOW);
  digitalWrite(DEFUSE_NUZKY, HIGH);
  digitalWrite(DEFUSE, HIGH);
  Serial.begin(9600);

  lcd.setCursor(4, 0); // Ajuste para centralizar os asteriscos
  lcd.print("*******");
}

void loop() {
  char key = keypad.getKey();
  if (plant == 0) {

    if (key != NO_KEY) {
      if (reset == 1) {
        lcd.clear();
        reset = 0;
        // Ajuste para centralizar os asteriscos
        lcd.setCursor(4, 0);
        lcd.print("*******");
      }
      lcd.setCursor(4, 0);
      kod += key;
      lcd.print("*******");
      lcd.setCursor(4, 0);

      if (kod.length() > 7) {
        kod = kod.substring(0, 7); // Limita a string a 7 caracteres
      }

      lcd.print(kod);

      if (kod.length() == 7) {
        delay(500); // Aguarda meio segundo para facilitar a leitura
        if (kod != lock) {
          lcd.clear();
          lcd.setCursor(1, 1);
          lcd.print("CODIGO ERRADO!");
          lcd.setCursor(4, 0);
          lcd.print("*******");
          kod = "";
        } else {
          plant = 1;
          start = millis();
          blik = millis();
          lcd.clear();
          lcd.setCursor(1, 1);
          lcd.print("BOMBA PLANTADA");
        }
      }
    }
  } else {
    if (explosion == 0) {
      if ((millis() - blik) > beep) {
        blik = millis();

        if (segundos > 32) {
          digitalWrite(LED_gb, HIGH);
          digitalWrite(LED_r, LOW);
        } else {
          digitalWrite(LED_gb, LOW);
          digitalWrite(LED_r, HIGH);
        }

        tone(BEEPER, 2093);
        delay(10);
        noTone(BEEPER);
        for (float i = 255; i >= power; i--) {
          analogWrite(LED_r, i);
          if (segundos > 32)
            analogWrite(LED_gb, i);
          delay(3);
        }
        digitalWrite(LED_r, LOW);
        digitalWrite(LED_gb, LOW);
      }
      if ((millis() - start) > 999) {
        segundos++;
        if (digitalRead(DEFUSE) == LOW || digitalRead(DEFUSE_NUZKY) == LOW) {
          defuseloop();
        }
        start = millis();
      }
      beep = map(segundos, 0, 34, 1000, 100);
      power = map(beep, 1000, 100, 0, 250);
      if (segundos == 34) {
        explosion = 1;
        lcd.clear();
        lcd.setCursor(5, 0);
        lcd.print("BUUUUM");
        tone(BEEPER, 10);
        delay(5000);
        noTone(BEEPER);
      }
    }
  }
}