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

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] = { 4, 3, 2 }; // C1, C2, C3
uint8_t rowPins[ROWS] = { 8, 7, 6, 5 }; // R1, R2, R3, R4

int pos = 0;


const int QTDE_APTOS = 5;
String aptos[QTDE_APTOS] = { "10", "11", "12", "13", "14" };
String senhas[QTDE_APTOS] = { "102030", "112233", "122436", "132639", "142842" };
int i;

String teclaAcumulada = ""; 

int aptoOuSenha = 0; //0- Apto / 1-Senha
int qtdeTeclas = 0; 
bool encontrou = false; 

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

LiquidCrystal_I2C lcd(0x27, 16, 2); 

Servo servo[QTDE_APTOS]; 

void setup() {
  lcd.init();                      
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Informe o Apto.:");

  Serial.begin(9600);

  servo[0].attach(9);
  servo[1].attach(10);
  servo[2].attach(11);
  servo[3].attach(12);
  servo[4].attach(13);

  for (i = 0; i < QTDE_APTOS; i += 1) {
    servo[i].write(0); 
  }
}

void loop() {
  char tecla = keypad.getKey();
  
  if (teclaAcumulada == "") {
    pos = 0;

    if (aptoOuSenha == 0) {
      lcd.setCursor(0, 0);
      lcd.print("Informe o Apto.:");
      lcd.setCursor(0,1);
      lcd.print("                ");
    }
  }
  //servo5.write(180); 
  if (tecla != NO_KEY) {

    if (qtdeTeclas >= 16 || tecla == '#') {

      encontrou = false; 

      for (i = 0; i < QTDE_APTOS; i += 1) {
        
        if (aptoOuSenha == 0) {
          if (aptos[i] == teclaAcumulada) {
            lcd.setCursor(0,0);
            lcd.print("Informe a senha:");  
            lcd.setCursor(0,1);
            lcd.print("                ");  
            encontrou = true;
            aptoOuSenha = 1;
            break;    
          }
        } else {
          if (senhas[i] == teclaAcumulada) {
            lcd.setCursor(0,0);
            lcd.print("                "); 
            lcd.setCursor(0,1);
            lcd.print("                ");
            lcd.setCursor(2,0);
            lcd.print("LIBERADO!!!");  
            encontrou = true;
            aptoOuSenha = 0;
            servo[i].write(180); 
            delay(3000);
            servo[i].write(0); 
            break;    
          }
        }
      }

      if (!encontrou) {
        if (aptoOuSenha == 0) {
          lcd.setCursor(0,0);
          lcd.print("Apto. Incorreto!!!");
          lcd.setCursor(0,1);
          lcd.print("Tente novamente!!!");
          delay(3000);

        } else {
          lcd.setCursor(0,0);
          lcd.print("Senha Incorreta!!!");
          lcd.setCursor(0,1);
          lcd.print("Tente novamente!!!");
          delay(3000);
        }
        aptoOuSenha = 0;
      }

      teclaAcumulada = "";
    } else if (tecla == '*') {
      teclaAcumulada = "";
      lcd.setCursor(0,1);
      lcd.print("                ");
    } else {
      teclaAcumulada += tecla;

      if (aptoOuSenha == 0) {
        lcd.setCursor(pos,1);
        lcd.print(tecla);
      } else {
        lcd.setCursor(pos,1);
        lcd.print("*");
      }
      
      pos++;
      
    }
    //Serial.println(teclaAcumulada);
    
    //Serial.println(tecla);
  }
}