#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);     // Renseigner l'adresse I2C du LCD à 0x27 sur 4 lignes et 20 chars

int ledBleu = 9;
int SSR_relais = 10;
int btn_StartStop = 2; bool EtatBtnStartStop;
int btn_Reset = 3; bool EtatBtn_Reset;
int btn_RecordSet = 6; bool EtatBtn_RecordSet;
int btn_Set_TimeON = 4; bool EtatBtn_Set_TimeON;
int btn_Set_TimeOFF = 5; bool EtatBtn_Set_TimeOFF;

char tempsON[20], tempsOFF[20], tempBuffer[20];
char buffer[20], bufferON[20], bufferOFF[20];

bool etat_SSRrelais = HIGH;
bool  FlagON = false;
bool etatBtnPresser;
bool  EtatChronoOnOFF;

long Min = 60000, Sec = 1000;
long onTime  = 5 * 60000;
long offTime = 2 * 60000;
long MyTimeON;
long MyTimeOFF;
unsigned long hh = 0, mm = 0, ss = 0;
long minutes_OFF = 0, minutes_ON = 0;

long TempsEcoule;
long Milliseconde, Seconde, Minute, Heure;
unsigned long currentTime = 0;
unsigned long previousTime = 0;
unsigned long startMillis;  //some global variables available anywhere in the program
unsigned long currentMillis;
unsigned long period = 5000;
int Record;
int Start;
bool etatRecord = false;
// Fin des déclarations.
/**************************************************/

void setup() {
  lcd.init(); lcd.backlight(); //lcd I2C 2004
  pinMode(btn_StartStop, INPUT_PULLUP);
  pinMode(btn_Reset, INPUT_PULLUP);
  pinMode(btn_RecordSet, INPUT);
  pinMode(btn_Set_TimeON, INPUT);
  pinMode(btn_Set_TimeOFF, INPUT);
  pinMode(ledBleu, OUTPUT);
  pinMode(SSR_relais, OUTPUT);
  etat_SSRrelais = LOW;
  digitalWrite(SSR_relais, LOW);
  //Affichage
  lcd.setCursor(0, 0);  lcd.print("    Chronometre:     ");
  lcd.setCursor(0, 2);  lcd.print("Minuteur: ");
  lcd.setCursor(0, 3); lcd.print(" Entrez le minutage  ");
}

void loop() {
  // Lit la broche d'entrée du btn_StartStop et stock ça valeur dans EtatBtnStartStop. Ect...
  EtatBtnStartStop = digitalRead(btn_StartStop);
  EtatBtn_Reset = digitalRead(btn_Reset);
  EtatBtn_RecordSet = digitalRead(btn_RecordSet);
  EtatBtn_Set_TimeON = digitalRead(btn_Set_TimeON);
  EtatBtn_Set_TimeOFF = digitalRead(btn_Set_TimeOFF);
  ///static int Record = 0, Start = 0;

  if (!FlagON && etatRecord) {
    etat_SSRrelais = LOW; // Turn it off
    //lcd.setCursor(7, 3); lcd.print("      ");
    lcd.setCursor(0, 3); lcd.print(bufferON);
    lcd.setCursor(14, 3); lcd.print(bufferOFF);
    lcd.setCursor(7, 3); lcd.print("  OFF  ");
    digitalWrite(SSR_relais, LOW);  // Update the actual relay
  }
  if (FlagON) { // Section minuteur
    //currentMillis = millis();
    ///sprintf(tempBuffer, "%06d", MyTimeON);
    ///lcd.setCursor(10, 2); lcd.print(tempBuffer);
    ///MyTimeON = onTime;
    lcd.setCursor(10, 2); lcd.print(tempBuffer);
    if ((etat_SSRrelais == LOW) && (currentMillis - startMillis  >= offTime))
    {
      etat_SSRrelais = HIGH;// turn it on
      startMillis  = currentMillis;   // Remember the time
      lcd.setCursor(7, 3); lcd.print("      ");
      lcd.setCursor(7, 3); lcd.print("  ON  ");
      digitalWrite(SSR_relais, HIGH);    // Update the actual relay
    }
    else if ((etat_SSRrelais == HIGH) && (currentMillis - startMillis  >= onTime))
    {
      //digitalWrite(RELAY2, LOW);
      etat_SSRrelais = LOW; // Turn it off
      previousTime = currentMillis;  // Remember the time
      lcd.setCursor(7, 3); lcd.print("      ");
      lcd.setCursor(7, 3); lcd.print("  OFF  ");
      digitalWrite(SSR_relais, LOW);  // Update the actual relay
    }
  }
  //*******************
  fn_boutons();
  //*******************
  // Si EtatBtnStartStop == LOW et etatBtnPresser == 0 on exécute les actions entre {}
  if (EtatBtnStartStop == LOW && etatBtnPresser == 0) {
    // La variable etatBtnPresser prend la valeur de 1.
    etatBtnPresser = 1;
    FlagON = !EtatChronoOnOFF;
    // Si EtatChronoOnOFF = 0 alors EtatChronoOnOFF = 1 et inversement.
    EtatChronoOnOFF = !EtatChronoOnOFF;
  }
  // Si EtatBtn_Reset == LOW et EtatChronoOnOFF == 0 et etatBtnPresser == 0 on exécute les actions entre {}
  if (EtatBtn_Reset == LOW && EtatChronoOnOFF == 0 && etatBtnPresser == 0) {
    // La variable etatBtnPresser prend la valeur de 1.
    etatBtnPresser = 1;
    // La variable Milliseconde prend la valeur de 0.
    Milliseconde = 0;
    //Etc...
    Seconde = 0;
    Minute = 0;
    Heure = 0;
  }
  // Si EtatBtnStartStop == HIGH et EtatBtn_Reset == HIGH on exécute les actions entre {}
  if (EtatBtnStartStop == HIGH && EtatBtn_Reset == HIGH) {
    // La variable etatBtnPresser prend la valeur de 0.
    etatBtnPresser = 0;
  }
  //On stocke la valeur du timer interne du microcontrôleur récupéré grâce à millis() dans la variable currentTime
  currentTime = millis();
  //On calcule la valeur de TempsEcoule en effectuant une soustraction entre currentTime et previousTime.
  TempsEcoule = currentTime - previousTime;
  //On stocke la valeur du timer interne du microcontrôleur récupéré grace à millis() dans la variable previousTime
  previousTime = millis();

  if (EtatChronoOnOFF == 1) {
    Milliseconde = Milliseconde + TempsEcoule;
    lcd.setCursor(10, 2); lcd.print(tempBuffer);

    if (Milliseconde > 999) {
      Milliseconde = Milliseconde - 1000;
      Seconde++;
      MyTimeON--;
      sprintf(tempBuffer, "%06d", MyTimeON);
      //// lcd.setCursor(10, 2); lcd.print(tempBuffer);
    }

    if (Seconde > 59) {
      Seconde = 0;
      Minute++;
    }

    if (Minute > 59) {
      Minute = 0;
      Heure++;
    }
  }
  //Affichage du chonomètre
  // Placer le curseur sur la colonne 12, ligne 1 du LCD
  // Section affichage du chrono
  lcd.setCursor(12, 1);
  lcd.print(":");
  if (Milliseconde > 99) {
    lcd.setCursor(13, 1);
    lcd.print(Milliseconde);
  }
  else if (Milliseconde > 9 && Milliseconde < 100) {
    lcd.setCursor(13, 1);
    lcd.print("0");
    lcd.setCursor(14, 1);
    lcd.print(Milliseconde);
  }
  else if (Milliseconde > 0 && Milliseconde < 10) {
    lcd.setCursor(13, 1);
    lcd.print("00");
    lcd.setCursor(15, 1);
    lcd.print(Milliseconde);
  }
  else {
    lcd.setCursor(12, 1);
    lcd.print(":000");
  }
  lcd.setCursor(9, 1);
  lcd.print(":");
  if (Seconde < 10) {
    lcd.setCursor(10, 1);
    lcd.print("0");
    lcd.setCursor(11, 1);
    lcd.print(Seconde);
  }
  else {
    lcd.setCursor(10, 1);
    lcd.print(Seconde);
  }
  lcd.setCursor(6, 1);
  lcd.print(":");
  if (Minute < 10) {
    lcd.setCursor(7, 1);
    lcd.print("0");
    lcd.setCursor(8, 1);
    lcd.print(Minute);
  }
  else {
    lcd.setCursor(7, 1);
    lcd.print(Minute);
  }
  if (Heure < 10) {
    lcd.setCursor(4, 1);
    lcd.print("0");
    lcd.setCursor(5, 1);
    lcd.print(Heure);
  }
  else {
    lcd.setCursor(4, 1);
    lcd.print(Heure);
  }
  ///lcd.setCursor(10, 2); lcd.print(tempBuffer);
}
void fn_boutons() {
  //===================================
  // Réglage du minuteur
  if (EtatBtn_Set_TimeON) {
    minutes_ON = minutes_ON + 1;
    if (minutes_ON > 59) {
      minutes_ON = 0;
    }
    sprintf(bufferON, "%02d secondes ON", minutes_ON);
    lcd.setCursor(0, 3); lcd.print("                     ");
    lcd.setCursor(0, 3); lcd.print(bufferON);
    delay(10);
    while (EtatBtn_Set_TimeON) EtatBtn_Set_TimeON = digitalRead(btn_Set_TimeON);
  }

  if (EtatBtn_Set_TimeOFF) {
    minutes_OFF = minutes_OFF + 1;
    if (minutes_OFF > 59) {
      minutes_OFF = 0;
    }
    sprintf(bufferOFF, "%02d secondes OFF", minutes_OFF);
    lcd.setCursor(0, 3); lcd.print("                     ");
    lcd.setCursor(0, 3); lcd.print(bufferOFF);
    delay(10);
    while (EtatBtn_Set_TimeOFF) EtatBtn_Set_TimeOFF = digitalRead(btn_Set_TimeOFF);
  }

  // Enregitrement des temps ON/OFF du minuteur
  if (EtatBtn_RecordSet) {
    Record = Record + 1;
    if (Record == 1) {
      sprintf(bufferON, "%02d Sec", minutes_ON);
      lcd.setCursor(0, 3); lcd.print("                     ");
      lcd.setCursor(0, 3); lcd.print(bufferON);
      lcd.setCursor(0, 2); lcd.print("T ON");
      onTime = minutes_ON;
      MyTimeON = onTime;
    }
    if (Record == 2) {
      sprintf(bufferOFF, "%02d Sec", minutes_OFF);
      lcd.setCursor(15, 2); lcd.print("T OFF");
      lcd.setCursor(0, 3); lcd.print("                     ");
      lcd.setCursor(0, 3); lcd.print(bufferON);
      lcd.setCursor(14, 3); lcd.print(bufferOFF);
      offTime = minutes_OFF;
      MyTimeOFF = offTime;
    }

    if (Record == 3) {
      lcd.setCursor(0, 3); lcd.print("                     ");
      lcd.setCursor(0, 3); lcd.print("All Times Recording! ");
      delay(1000);
      lcd.setCursor(0, 3); lcd.print("                     ");
      lcd.setCursor(0, 3); lcd.print(bufferON);
      lcd.setCursor(14, 3); lcd.print(bufferOFF);
      lcd.setCursor(7, 3); lcd.print("Ready!");
      etatRecord = true;
      delay(1000);
    }
    delay(50);
    while (EtatBtn_RecordSet) EtatBtn_RecordSet = digitalRead(btn_RecordSet);
  }
  //*****************************************************************


}
$abcdeabcde151015202530fghijfghij