//A - очистка ввода кода
// B - удаление последней цифры
// C - подтверждение ввода

#include <Keypad.h>
#include <LiquidCrystal_I2C.h>;       //  Подключаем библиотеку для работы с LCD дисплеем по шине I2C
#include <Servo.h>; 

const byte ROWS = 4;
const byte COLS = 4;
byte time=0, inv=1 ,time1=0 , CodeOk=0 , newCode=0;
String myCode="";
String myEnterCode="";

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

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

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2);       //  Объявляем  объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
Servo servo;

void setup() {
  Serial.begin(9600);
  lcd.backlight();
  lcd.init();  
  lcd.setCursor(0, 0);  //Устанавливаем курсор на дисплее в позицию (0 столбец, 0 строка)
  lcd.print("Enter new code");
  lcd.setCursor(0, 1); //Устанавливаем курсор на дисплее в позицию (0 столбец, 1 строка)
  servo.attach(10);
  servo.write(0);
}

void loop() {
  //if (inv==1){
  //  lcd.setCursor(myCode.length(), 1);
  //  lcd.print("_");
  //  inv=inv*(-1);
  //} else {
  //  lcd.setCursor(myCode.length(), 1);
  // lcd.print(" ");
  //  inv=inv*(-1);
  // }
  char key = keypad.getKey();
  delay(100);

  if(newCode==0)
  {

    if ((key != NO_KEY)&&((myEnterCode.length())<6)&&(key>='0')&&(key<='9')) 
    {
    myEnterCode=myEnterCode+key;
    lcd.setCursor(0, 1);
    lcd.print(myEnterCode);
    }   



 if (key=='A')
 {
   lcd.setCursor(0, 1);
   lcd.print("           ");
   myEnterCode="";
 }

 if ((key=='B')&&(myEnterCode.length()>0))
 { 
   lcd.setCursor(0, 1);
   lcd.print("           ");
   lcd.setCursor(myEnterCode.length()-1, 1);
   myEnterCode=myEnterCode.substring(0,(myEnterCode.length()-1));
   lcd.setCursor (0, 1);
   lcd.print(myEnterCode);
  }
 if (key=='C')
 {
   newCode=1;
   lcd.setCursor (0, 0);
   lcd.print("Enter Code     ");
   lcd.setCursor (0, 1);
   lcd.print("         ");
 }
}


   else
   {  
    if (time==0)
    {
    lcd.backlight();
    }
    if ((key != NO_KEY)&&((myCode.length())<6)&&(key>='0')&&(key<='9')) 
    {
 
    Serial.println(key);
    myCode=myCode+key;
    lcd.setCursor(0, 1);
    lcd.print(myCode);
    Serial.print("myCode=");
    Serial.println(myCode);
    
  }
 if (key=='A'){
   lcd.setCursor(0, 1);
   lcd.print("           ");
   myCode="";
   Serial.print("myCode=");
   Serial.println(myCode);
 }
 if ((key=='B')&&(myCode.length()>0)){
   lcd.setCursor(myCode.length()-1, 1);
   lcd.print("           ");
   myCode=myCode.substring(0,(myCode.length()-1));
   lcd.setCursor(0, 1);
   Serial.print("myCode=");
   Serial.println(myCode);
  }
 if (key=='C')
 {
   if (myCode==myEnterCode){
      servo.write(180);
      lcd.setCursor(1, 1);
      lcd.print("CODE OK");
      myCode="";
      time=0;
      time1++; 
      CodeOk=1;
    } else {
      lcd.setCursor(0, 1);
      lcd.print("           ");
      myCode="";
      myCode="";
      time=0;
     
    }
  Serial.print("myCode=");
  Serial.println(myCode);
}
 if (myCode.length()>0){
   time++;
   Serial.print("Time=");
   Serial.println(time);
 }

if (CodeOk==1)
{
  time1++;
  Serial.print("Time1=");
  Serial.println(time1);
 }
 if (time1>50)
 {
 lcd.setCursor(0, 1);
 lcd.print("           ");
 lcd.noBacklight();
 time1=0;
 CodeOk=0;
 }  
 if (time>250)
 {
   lcd.setCursor(0, 1);
   lcd.print("           ");
   lcd.noBacklight();
 }
}
}