// Solution du laboratoire: DOC11.3.6

#include <LiquidCrystal_I2C.h>

#define LCD_POSITION_COMPTEUR 10
#define LCD_POSITION_TEMPS    7
#define LCD_LIGNE_NO_1        0
#define LCD_LIGNE_NO_2        1
#define LCD_DEBUT_LIGNE       0
#define LCD_NB_LIGNE          2
#define LCD_NB_COLONNE        16
#define BOUTON                2
#define DEBOUNCE_TIME         5
#define DELAI_MSG_OUVERTURE   3000
#define LCD_ADRESSE_I2C       0x27

LiquidCrystal_I2C ecranLCD(LCD_ADRESSE_I2C,LCD_NB_COLONNE,LCD_NB_LIGNE);

void setup() {
  ecranLCD.begin(LCD_NB_COLONNE, LCD_NB_LIGNE);
  pinMode(BOUTON, INPUT);

  ecranLCD.print("Alarme TI-CSTJ");
  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_2);
  ecranLCD.print("Version 1.0b");
  delay(DELAI_MSG_OUVERTURE);
  ecranLCD.clear();

  ecranLCD.print("Temps: ");
  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_2);
  ecranLCD.print("Compteur: 0");
}

void loop() {
  unsigned long int temps = millis();
  static unsigned long int compteur = 0;
  
  // Afficher le temps qui passe
  ecranLCD.setCursor(LCD_POSITION_TEMPS , LCD_LIGNE_NO_1 ); 
  ecranLCD.print(temps / 1000); 
  ecranLCD.print(" sec");  

  // Lire et, au besoin, afficher l'utilisation du bouton
  if (digitalRead(BOUTON)) {
  delay(DEBOUNCE_TIME);           // Éliminer le rebond du bouton
  while (digitalRead(BOUTON)){
      // Continuer à afficher le temps qui passe même si le bouton est enfoncé
      // Ici, il serait préférable d'utiliser une fonction.
      ecranLCD.setCursor(LCD_POSITION_TEMPS , LCD_LIGNE_NO_1 ); 
      ecranLCD.print(millis() / 1000); 
      ecranLCD.print(" sec");  
  }    // Attendre que le bouton soit relaché

  delay(DEBOUNCE_TIME);           // Éliminer le rebond du bouton

  ecranLCD.setCursor(LCD_POSITION_COMPTEUR , LCD_LIGNE_NO_2 ); 
  ecranLCD.print(++compteur); 

  } // if (digitalRead(BOUTON)     
}