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

// Configuration du clavier
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] = {2, 3, 4, 5};    // Broches connectées aux lignes
byte colPins[COLS] = {6, 7, 8, 9};      // Broches connectées aux colonnes

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

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

// Configuration du buzzer
const int buzzerPin = 10;

// Variables pour le code
String generatedCode = ""; // Code généré aléatoirement
String userInput = "";     // Code saisi par l'utilisateur

// Fonction pour générer et afficher le code pendant 5 secondes
void generateAndDisplayCode() {
  generatedCode = "";
  for (int i = 0; i < 4; i++) {
    generatedCode += String(random(10)); // Génère un chiffre entre 0 et 9
  }
  lcd.clear();
  lcd.print("Code:");
  lcd.setCursor(0, 1);
  lcd.print(generatedCode);
  delay(5000); // Affichage du code pendant 5 secondes
  lcd.clear();
  lcd.print("Saisissez code:");
}

void setup() {
  lcd.init();
  lcd.backlight();
  
  pinMode(buzzerPin, OUTPUT);
  digitalWrite(buzzerPin, LOW); // Buzzer désactivé par défaut

  randomSeed(analogRead(0)); // Initialisation du générateur de nombres aléatoires

  // Génération et affichage du premier code
  generateAndDisplayCode();
}

void loop() {
  char key = keypad.getKey();
  if (key) {
    if (key == '#') { // Validation du code saisi
      lcd.clear();
      if (userInput == generatedCode) {
        lcd.print("Code correct!");
        digitalWrite(buzzerPin, HIGH); // Activation du buzzer pour signal positif
        delay(2000);
        digitalWrite(buzzerPin, LOW);
      } else {
        lcd.print("Code incorrect!");
        digitalWrite(buzzerPin, HIGH); // Signal sonore en cas d'erreur
        delay(2000);
        digitalWrite(buzzerPin, LOW);
      }
      userInput = "";  // Réinitialisation de la saisie utilisateur
      
      // Génération d'un nouveau code pour la prochaine tentative
      generateAndDisplayCode();
    } 
    else if (key == '*') { // Effacer la saisie en cours
      userInput = "";
      lcd.clear();
      lcd.print("Saisissez code:");
    } 
    else { // Ajout du caractère à la saisie
      userInput += key;
      lcd.setCursor(0, 1);
      lcd.print(userInput);
    }
  }
}