// Tableau représentant l'état des segments pour chaque chiffre
int numbers[][7] = {
  {0, 0, 0, 0, 0, 0, 1}, // 0
  {1, 0, 0, 1, 1, 1, 1}, // 1
  {0, 0, 1, 0, 0, 1, 0}, // 2
  {0, 0, 0, 0, 1, 1, 0}, // 3
  {1, 0, 0, 1, 1, 0, 0}, // 4
  {0, 1, 0, 0, 1, 0, 0}, // 5
  {0, 1, 0, 0, 0, 0, 0}, // 6
  {0, 0, 0, 1, 1, 1, 1}, // 7
  {0, 0, 0, 0, 0, 0, 0}, // 8
  {0, 0, 0, 0, 1, 0, 0}  // 9
};

// Connexion des broches Arduino aux segments (a, b, c, d, e, f, g)
int segmentPins[] = {6, 7, 8, 9, 10, 11, 12}; 
// Broches pour contrôler les digits (communs)
int digitPins[] = {2, 3, 4};

// Pin de la photorésistance
const int ldrPin = A0;  

// Pin du bouton pour activer/désactiver l'affichage
const int buttonPin = 5; 
int buttonState;             // Etat actuel du bouton
int lastButtonState = LOW;   // Dernier état du bouton
bool displayEnabled = true;  // Flag pour activer/désactiver l'affichage

// Variables pour le debounce
unsigned long lastDebounceTime = 0;  // Dernière fois que l'état du bouton a changé
unsigned long debounceDelay = 50;    // Délai de debounce (50 ms)

// Fonction pour initialiser les broches
void initializePins() {
  for (int i = 0; i < 7; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }
  
  for (int i = 0; i < 3; i++) {
    pinMode(digitPins[i], OUTPUT);
  }

  pinMode(buttonPin, INPUT);  // Bouton en entrée
}

// Fonction pour éteindre tous les segments
void turnOffSegments() {
  for (int i = 0; i < 7; i++) {
    digitalWrite(segmentPins[i], HIGH); // Éteindre tous les segments (actif LOW)
  }
}

// Fonction pour afficher un chiffre sur un digit spécifique
void displayNumber(int number, int digitPin) {
  // Activer le digit
  digitalWrite(digitPins[digitPin], HIGH);

  // Configurer les segments pour le nombre donné
  for (int i = 0; i < 7; i++) {
    digitalWrite(segmentPins[i], numbers[number][i]);
  }
  
  // Délai pour permettre à l'affichage de se stabiliser
  delay(5);

  // Désactiver le digit
  digitalWrite(digitPins[digitPin], LOW);
}

// Fonction pour découper un nombre en trois chiffres et les afficher
void displayToThreeDigit(int num) {
  int hundreds = num / 100;   // Centaines
  int tens = (num / 10) % 10; // Dizaines
  int ones = num % 10;        // Unités

  displayNumber(hundreds, 0); // Afficher les centaines
  displayNumber(tens, 1);     // Afficher les dizaines
  displayNumber(ones, 2);     // Afficher les unités
}

// Fonction pour lire la valeur de la photorésistance
int readLDR() {
  int ldrValue = analogRead(ldrPin);   // Lire la valeur analogique (0-1023)
  int displayValue = map(ldrValue, 0, 1023, 0, 999); // Mapper la valeur sur 0-999
  return displayValue;
}

// Fonction de debounce pour le bouton
void handleButtonPress() {
  int reading = digitalRead(buttonPin);  // Lire l'état actuel du bouton

  if (reading != lastButtonState) {
    lastDebounceTime = millis();  // Réinitialiser le temps du debounce si l'état change
  }

  // Si le délai de debounce est dépassé et que l'état du bouton a changé
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;

      // Si le bouton est pressé, inverser l'état d'activation de l'affichage
      if (buttonState == HIGH) {
        displayEnabled = !displayEnabled;  // Changer l'état d'affichage
      }
    }
  }

  lastButtonState = reading;  // Mémoriser le dernier état du bouton
}

void setup() {
  initializePins();  // Initialiser les broches
  Serial.begin(9600); // Démarrer la communication série pour le débogage
}

void loop() {
  handleButtonPress();  // Gérer l'appui sur le bouton

  // Si l'affichage est activé
  if (displayEnabled) {
    int ldrValue = readLDR(); // Lire la valeur du capteur LDR
    displayToThreeDigit(ldrValue); // Afficher la valeur sur le 7 segments

    // Afficher la valeur sur le moniteur série pour le débogage
    Serial.print("Valeur LDR : ");
    Serial.println(ldrValue);
  }

  //delay(100); // Pause avant de rafraîchir l'affichage
}

$abcdeabcde151015202530fghijfghij