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

// Paramétrage du pavé numérique
const byte ROWS = 4;  // 4 lignes
const byte COLS = 4;  // 4 colonnes
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};    // Connecter aux lignes du pavé numérique
byte colPins[COLS] = {5, 4, 3, 2};    // Connecter aux colonnes du pavé numérique

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

// Paramétrage de l'écran LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);   // Adresse I2C de l'écran (0x27)

// Paramétrage du servomoteur
Servo servo;
const int servoPin = 10;  // Pin auquel le servomoteur est connecté

// Code secret
String correctCode = "1234";   // Code à 4 chiffres
String enteredCode = "";       // Code entré par l'utilisateur

void setup() {
  lcd.begin(16, 2);             // Initialiser l'écran LCD
  lcd.backlight();              // Activer le rétroéclairage
  servo.attach(servoPin);       // Initialiser le servomoteur
  servo.write(0);               // Fermer le tiroir (position de départ)

  lcd.setCursor(0, 0);
  lcd.print("Enter Code:");
}

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

  if (key) {
    // Si l'utilisateur appuie sur un bouton du pavé numérique
    if (key == '#') {  // '#' est utilisé pour valider le code
      if (enteredCode == correctCode) {
        if(servo.read() == 0){
          lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Code Correct");
        servo.write(90);  // Déverrouiller le tiroir (par exemple, 90°)
        delay(3000);      // Garde le tiroir ouvert pendant 3 secondes
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Enter Code:");
        } else {
          lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Code Correct");
        servo.write(0);  // Déverrouiller le tiroir (par exemple, 90°)
        delay(3000);      // Garde le tiroir ouvert pendant 3 secondes
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Enter Code:");
        }
        
      } else {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Incorrect Code");
        delay(2000);       // Attente avant de permettre une nouvelle tentative
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Enter Code:");
      }
      enteredCode = "";  // Réinitialiser le code entré
    } else if (key == '*') {  // '*' est utilisé pour effacer le code
      enteredCode = "";
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Enter Code:");
    } else if(key == 'A'){
      if(enteredCode == correctCode){
        enteredCode = "";
        lcd.clear();
        lcd.setCursor(0, 0);
        if (key == '#')
          if (enteredCode == correctCode){
            correctCode = enteredCode;
          } else {
            lcd.clear();
            lcd.setCursor(0, 0);
            break;
          }
        } else if (key == '*'){
          enteredCode = correctCode;
          lcd.clear();
          lcd.setCursor(0, 0);
        }
      } else {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Incorrect Code");
        delay(2000);       // Attente avant de permettre une nouvelle tentative
        lcd.clear();
        lcd.setCursor(0, 0);
      }
    } else {
      // Ajouter le chiffre ou caractère au code entré
      enteredCode += key;
      lcd.setCursor(0, 1);
      lcd.print(enteredCode);  // Affiche le code entré sur l'écran
    }
  }
}