#include "LiquidCrystal_I2C.h" //installer la bibliothèque LiquidCrystal_I2C.h

const int BP1 = 2; // Broche pour le premier bouton-poussoir
const int BP2 = 3; // Broche pour le deuxième bouton-poussoir
const int FR1 = 8;
const int FR2 = 9;
const int FO1 = 10;
const int FO2 = 11;
int etatFR1 = digitalRead(FR1);
int etatFR2 = digitalRead(FR2);
int etatFO1 = digitalRead(FO1);
int etatFO2 = digitalRead(FO2);

LiquidCrystal_I2C LCD1(0x27,16,2); // définit le type d'écran lcd 16 x 2
LiquidCrystal_I2C LCD2(0x27,16,2); // définit le type d'écran lcd 16 x 2

unsigned long temps = 13; // 10 secondes
unsigned long temps1 = 0; // 0 secondes
unsigned long temps2 = 0; // 0 secondes
unsigned long temps3 = 0; // 0 secondes
unsigned long dureeTotale = 0; // Durée totale en secondes
unsigned long previousMillis = 0;  // Stockage des millisecondes écoulées

const long interval = 1000;  // interval entre chaques clignotements
 
void setup() {
  pinMode(BP1, INPUT_PULLUP); // Configure le bouton1 en tant qu'entrée
  pinMode(BP2, INPUT_PULLUP); // Configure le bouton2 en tant qu'entrée
  pinMode(FR1, OUTPUT); // configure le FR1 en tant que sortie
  pinMode(FR2, OUTPUT); // configure le FR2 en tant que sortie
  pinMode(FO1, OUTPUT); // configure le FO1 en tant que sortie
  pinMode(FO2, OUTPUT); // configure le FO2 en tant que sortie
  LCD1.init(); // initialisation de l'afficheurs
  LCD2.init();
  LCD1.backlight();
  LCD2.backlight();
  temps1 = millis();
  digitalWrite(FO1, LOW);
  Serial.begin(9600); // Initialisation de la communication série
}
 
void addtime() {
  int etatBP1 = digitalRead(BP1);
  int etatBP2 = digitalRead(BP2);

  // Si le premier bouton est activé, ajoute 1 seconde à la durée totale
  if (etatBP1 == LOW) {
    temps += 1;
    delay(100); // Débouncing pour éviter les rebonds du bouton
  }
 
  // Si le deuxième bouton est activé, ajoute 10 secondes à la durée totale
  if (etatBP2 == LOW) {
    temps += 10;
    delay(100); // Débouncing pour éviter les rebonds du bouton
  }
 
  // Affiche le temps total sur le moniteur série
  Serial.print("temps total (en secondes) : ");
  Serial.println(temps);
 
  // Attendez un court moment pour éviter une mise à jour excessive
  delay(15);
}

void LCDun() {
  LCD1.setCursor(6, 0);
  int minutes = temps/60;
  int secondes = temps%60;
  LCD1.print(" ");
  LCD1.print(minutes);
  LCD1.print(':');
  LCD1.println(secondes);
  delay(990); // Apnée pendant une seconde...
  temps--;
  if (temps == 0) while(1){ // Boucle infinie si on atteint 0
  LCD1.clear();
  delay(990);
  LCD1.setCursor(6, 1); 
  LCD1.print("GO"); 
  delay(990);  
  LCD1.home();
  delay(10);}
}

void LCDdeux() {
  LCD2.setCursor(7, 0);
  LCD2.scrollDisplayLeft();
  int minutes = temps/60;
  int secondes = temps%60;
  LCD2.print(" ");
  LCD2.print(minutes);
  LCD2.print(':');
  LCD2.println(secondes);
  delay(990); // Apnée pendant une seconde...
  temps--;
  if (temps == 0) while(1); // Boucle infinie si on atteint 0
  LCD2.clear();
  LCD2.home();
  delay(10);
}

void Clign1() {
  digitalWrite(FR1, HIGH);
  digitalWrite(FR2, HIGH);
  digitalWrite(FO1, LOW);
  digitalWrite(FO2, LOW);
  delay(3000);
  digitalWrite(FR1, LOW);
  for (int i = 0; i < temps; i++) {
    digitalWrite(FO1, !digitalRead(FO1));
    delay(1000);
  }
  digitalWrite(FR1, HIGH);
}

void Clign2() {
  digitalWrite(FR1, HIGH);
  digitalWrite(FR2, HIGH);
  digitalWrite(FO1, LOW);
  digitalWrite(FO2, LOW);
  delay(3000);
  digitalWrite(FR2, LOW);
  for (int i = 0; i < temps; i++) {
    digitalWrite(FO2, !digitalRead(FO2));
    delay(1000);
  }
  digitalWrite(FR2, HIGH);
}

void loop() {
addtime();
LCDun();
  }