//***************//
// Bibliothèques //
//***************/
#include <LiquidCrystal_I2C.h> //Bibliothèque pour l'écran LCD fonctionnant avec I2C
//***************************//
// Instanciation des classes //
//***************************//
LiquidCrystal_I2C lcd(0x27, 20, 4);
//******************************************************//
// Définition des entrées/sorties de l'Arduino Pro Mini //
//******************************************************//
#define pinBtStartStop 6 //[Entrée] Lorsqu'on appuie sur START/STOP, BP activé à l'état bas
#define pinBtReset 9 //[Entrée] Lorsqu'on appuie sur RESET, BP activé à l'état bas
#define pinSignalStart 4 //[Entrée] Lorsqu'on appuie sur START, BP activé à l'état bas
#define pinSignalSector 3 //[Entrée] Lorsqu'on appuie sur SECTOR, BP activé à l'état bas
#define pinSignalStop 2 //[Entrée] Lorsqu'on appuie sur STOP, BP activé à l'état bas
//***********************************//
// Définition des variables utilisée //
//***********************************//
bool EtatBtStartStop; // Stocke l'état du bouon START/STOP
bool EtatBtReset; // Stocke l'état du bouon RESET
bool EtatBtStart; // Stocke l'état du bouon START
bool EtatBtSector; // Stocke l'état du bouon SECTOR
bool EtatBtStop; // Stocke l'état du bouon STOP
int EtatBoutonAppuyer; // Variable qu'on passe à 1 après avoir presser un bouton afin d'éviter l'effet rebond
int EtatChronoOnOFF; // Variable qui détermine l'état de marche du chronomètre
int TempsEcoule; // Variable utilisée avec Millis() pour déterminer le temps écoulé
int Milliseconde; // Variable des millisecondes
int Seconde; // Variable des secondes
int Minute; // Variable des minutes
int Sector = 1; // Variable de détermination du secteur pour les temps intermédiaires
unsigned long currentTime = 0; // Variable utilisée pour récupérer la valeur de millis()
unsigned long previousTime = 0; // Variable utilisée pour stocker la valeur de millis() pour le prochain "loop"
//***********************//
// SETUP //
//***********************//
void setup()
{
pinMode(pinBtStartStop, INPUT_PULLUP); // Activation pin en mode ENTREE et résistance PULL UP
pinMode(pinBtReset, INPUT_PULLUP); // Activation pin en mode ENTREE et résistance PULL UP
pinMode(pinSignalStart, INPUT_PULLUP); // Activation pin en mode ENTREE et résistance PULL UP
pinMode(pinSignalSector, INPUT_PULLUP); // Activation pin en mode ENTREE et résistance PULL UP
pinMode(pinSignalStop, INPUT_PULLUP); // Activation pin en mode ENTREE et résistance PULL UP
lcd.init(); // Initialisation de l'écran LCD
lcd.backlight(); // Allumage rétroéclairage écran LCD
}
//********************************************************************************//
// Fonction Chronométrage //
// Cette fonction fait appel à la fonction AffichageChrono //
//********************************************************************************//
void Chronometre()
{
EtatBtStartStop = digitalRead(pinBtStartStop); // Signal Bouton Start/Stop
EtatBtReset = digitalRead(pinBtReset); // Signal Bouton Reset
EtatBtStart = digitalRead(pinSignalStart); // Signal Start à recevoir du nRF24L01
EtatBtSector = digitalRead(pinSignalSector); // Signal Sector à recevoir du nRF24L01
EtatBtStop = digitalRead(pinSignalStop); // Signal Stop à recevoir du nRF24L01
//Test signal START
if (EtatBtStart == LOW && EtatBoutonAppuyer == 0) { // Test pression bouton START
EtatBoutonAppuyer = 1; // Evite l'effet rebond
EtatChronoOnOFF = 1; // Etat du chrono à "1"
}
//Test signal STOP
if (EtatBtStop == LOW && EtatBoutonAppuyer == 0) { // Test pression bouton STOP
EtatBoutonAppuyer = 1; // Evite l'effet rebond
EtatChronoOnOFF = 0; // Etat du chrono à "0"
}
if (EtatBtStartStop == LOW && EtatBoutonAppuyer == 0) { // Test pression bouton START/STOP
EtatBoutonAppuyer = 1; // Evite l'effet rebond
EtatChronoOnOFF = !EtatChronoOnOFF; // Inverse l'état du chronomètre
}
if (EtatBtReset == LOW && EtatChronoOnOFF == 0 && EtatBoutonAppuyer == 0) { // Test pression bouton RESET
EtatBoutonAppuyer = 1; // Evite l'effet rebond
Milliseconde = 0; // Remet à 0 la variable Milliseconde
Seconde = 0; // Remet à 0 la variable Seconde
Minute = 0; // Remet à 0 la variable Minute
Sector = 1; // Remet à 1 la variable Sector
lcd.clear(); // Efface complétement l'écran LCD
}
// Incrémentation du compteur de chrono en utilisant la fonction millis()
currentTime = millis();
TempsEcoule = currentTime - previousTime;
previousTime = millis();
// Incrémentation des variables Milliseconde, Seconde et Minute
if (EtatChronoOnOFF == 1) {
Milliseconde = Milliseconde + TempsEcoule;
if (Milliseconde > 999) {
Milliseconde = Milliseconde - 1000;
Seconde++;
}
if (Seconde > 59) {
Seconde = 0;
Minute++;
}
}
// Test signal SECTOR (FONCTION A RETRAVAILLER)
if (EtatBtSector == LOW && EtatBoutonAppuyer == 0 && EtatChronoOnOFF == 1 ) { // Test pression bouton SECTOR
if (Sector == 1){ // Test le numéro de secteur en cours
AffichageChrono(1, "Sector 1"); // Affiche intermédiaire et numéro de secteur
}
if (Sector == 2){
AffichageChrono(2, "Sector 2");
}
if (Sector == 3){
AffichageChrono(3, "Sector 3");
}
EtatBoutonAppuyer = 1; // Evite l'effet rebond
Sector ++; // Incrémente le numéro de secteur en vue du prochain test
}
if (EtatBtStartStop == HIGH && EtatBtReset == HIGH && EtatBtStart == HIGH && EtatBtStop == HIGH && EtatBtSector == HIGH) { //Test l'ensemble des boutons
EtatBoutonAppuyer = 0; // réinitialise la variable à "0" qui évite l'effet rebond
}
AffichageChrono(0,"Total Time"); //Affichage du chrono sur la ligne 0 ainsi que le type de temps en bout de ligne
}
//********************************************************************************//
// Fonction Affichage des Chronos //
// "Ligne" = numéro de ligne ET "TypeTime" = texte fin ligne //
//********************************************************************************//
void AffichageChrono (int Ligne, char TypeTime[])
{
// Affichage du type de temps en bout de ligne
lcd.setCursor(10, Ligne);
lcd.print(TypeTime);
// Affichage des ":"
lcd.setCursor(2, Ligne);
lcd.print(":");
lcd.setCursor(5, Ligne);
lcd.print(":");
// Affichage des Millisecondes en fonction de sa valeur
if (Milliseconde > 99) {
lcd.setCursor(6, Ligne);
lcd.print(Milliseconde);
}
else if (Milliseconde > 9 && Milliseconde < 100) {
lcd.setCursor(6, Ligne);
lcd.print("0");
lcd.setCursor(7, Ligne);
lcd.print(Milliseconde);
}
else if (Milliseconde > 0 && Milliseconde < 10) {
lcd.setCursor(6, Ligne);
lcd.print("00");
lcd.setCursor(8, Ligne);
lcd.print(Milliseconde);
}
else {
lcd.setCursor(6, Ligne);
lcd.print("000");
}
// Affichage des Secondes en fonction de sa valeur
if (Seconde < 10) {
lcd.setCursor(3, Ligne);
lcd.print("0");
lcd.setCursor(4, Ligne);
lcd.print(Seconde);
}
else {
lcd.setCursor(3, Ligne);
lcd.print(Seconde);
}
// Affichage des Minutes en fonction de sa valeur
if (Minute < 10) {
lcd.setCursor(0, Ligne);
lcd.print("0");
lcd.setCursor(1, Ligne);
lcd.print(Minute);
}
else {
lcd.setCursor(0, Ligne);
lcd.print(Minute);
}
}
//********************************************************************************//
// Fonction Bouclage à l'infini //
//********************************************************************************//
void loop()
{
Chronometre();
}