// 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)
}