/*
Chronometre
1 BP Start /Stop broche D3 et GND
1 BP RESET broche D2 et GND
1 LCD I2C 2004
Connexion des broches LCD:
lcd1.SDA -> Uno.SDA
lcd1.SCL -> Uno.SCL
lcd1.GND -> Uno.GND
lcd1.VCC -> Uno.5V
*/
#include <LiquidCrystal_I2C.h>
// Définir une variable (lcd1) de type LiquidCrystal_I2C
LiquidCrystal_I2C lcd1 (0x27, 20, 4); // adresse I2C du LCD1 : 0x27 sur 4 lignes de 20 chars
int Bp_Start_Stop = 3; // Bp_Start_Stop sur broche D3
int Bp_Reset = 2; // Bp_Reset sur broche D2
bool Etat_Bp_Start_Stop;
bool Etat_Bp_Reset;
bool Etat_bouton_appuyee; // HIGH si un ou deux boutons appuyés
bool Etat_Chrono_On_Off; // HIGH (ou True) en marche
int Milliseconde = 0;
int Seconde = 0;
int Minute = 0;
int Heure = 0;
char str[20]; // chaine de 20 caractères pour affichage Temps
void setup()
{
pinMode(Bp_Start_Stop, INPUT_PULLUP); // état HIGH par défaut
pinMode(Bp_Reset, INPUT_PULLUP); // état HIGH par défaut
lcd1.init(); // Initialiser l'écran LCD
lcd1.backlight(); // Allumer l'éclairage de l'écran
lcd1.clear(); // Effacer le LCD
lcd1.setCursor(3, 0); // Placer le curseur à la position caractère, ligne
lcd1.print("Chronometre :"); // Afficher un msg
lcd1.setCursor(2, 2); // Placer le curseur à la position caractère, ligne
lcd1.print("Presser Start/Stop"); // Afficher un msg
lcd1.setCursor(6, 3); // Placer le curseur à la position caractère, ligne
lcd1.print("ou Reset"); // Afficher un msg
// =========== Init Interruption ============================
// Voir tuto sur les timer Arduino - https://passionelectronique.fr/introduction-timer-arduino/
TCCR1A = 0; // Mise à 0 du registre TCCR1A // Configurer l'interruption du timer 1 à 1 kHz // 1 ms
TCCR1B = 0; // Idem pour le registre TCCR1B
TCNT1 = 0; // Configurer le compteur du timer par incréments de 1 kHz
OCR1A = 1999; // = (16*10^6) / (1000*8) - 1
//102
//J'ai dû utiliser le timer 1 16 bits pour cela car 1999 > 255,
//mais je pouvais passer aux timers 0 ou 2 avec un diviseur de fréquence plus grand.
//Activer le mode CTC
TCCR1B |= (1 << WGM12); // Configurer le bit CS11 pour un prédiviseur de 8.
TCCR1B |= (1 << CS11); // Activer l'interruption de comparaison du temporisateur
TIMSK1 |= (1 << OCIE1A);
// ==========================================================
}
void loop()
{
Etat_Bp_Start_Stop = digitalRead(Bp_Start_Stop); // lire Bp_Start_Stop
Etat_Bp_Reset = digitalRead(Bp_Reset); // lire Bp_Reset
if (Etat_Bp_Start_Stop == LOW && Etat_bouton_appuyee == LOW) {
Etat_bouton_appuyee = HIGH;
Etat_Chrono_On_Off = ! Etat_Chrono_On_Off; // marche/arret Chronometre
}
if (Etat_Bp_Reset == LOW && Etat_bouton_appuyee == LOW) {
Etat_bouton_appuyee = HIGH;
Heure = Minute = Seconde = Milliseconde = 0; // Raz générale Temps
}
if (Etat_Bp_Start_Stop == HIGH && Etat_Bp_Reset == HIGH) {
Etat_bouton_appuyee = LOW; // boutons non appuyés
}
// ======================== AFFICHAGE TEMPS ================================
// %2u = affichage de 2 decimal, %3u = 3 decimal
// %d or %i – signed decimal integer
// %u – unsigned decimal integer
// %s – a string of characters
sprintf(str, "%2u h %2u mn %2u s %3u", Heure, Minute, Seconde, Milliseconde); // utilisation de sprintf() pour composer la chaîne str
lcd1.setCursor(0, 1); // placer le curseur à la position caractère, ligne
lcd1.print(str); // affiche Temps (str) sur LCD
// ==========================================================================
}
// ===== Routine d'interruption =====
ISR(TIMER1_COMPA_vect) {
if (Etat_Chrono_On_Off == true) {
Milliseconde = Milliseconde + 1;
}
if (Milliseconde > 999) {
Milliseconde = 0; Seconde = Seconde + 1;
if (Seconde > 59) {
Seconde = 0;
Minute = Minute + 1;
}
if (Minute > 59) {
Minute = 0;
Heure = Heure + 1;
}
}
}
// ===================================Start / Stop
Reset
LCD 2004-I2C
Affichage Chronomètre sur lcd-2004-I2C