// // ######################### // # HYDRATATION 2 # // ######################### // # Guy Magli 10.09.2019 # // ######################### // # Conception, cablages # // # mises a jour, # // # contact... # // # www.magli.fr # // ######################### // // Afin d'eviter les problemes d'affichage et d'impression les signes diacritiques // ont ete retires des commentaires et des chaines de caracteres. // // ! ================================================= ! // ! VARIABLES GLOBALES, CONSTANTES ET INITIALISATIONS ! // ! ================================================= ! // int t = 0; int g = 0; bool bBoutonAppuye = false; unsigned long lDateAntiRebond = 0; int iCompteurDeClicks = 0; unsigned long iDebutMillis = 0; // Mise en route du chronometre unsigned long iFinMillis = 0; // Heure du chronometre #define TEMPS_ANTI_REBOND_MS 30 // // ! ===== ! // ! SETUP ! // ! ===== ! // void setup() { pinMode(7, INPUT_PULLUP); // Le bouton poussoir pinMode(6, OUTPUT); // La LED en bas à gauche pinMode(5, OUTPUT); // La LED en haut à gauche pinMode(4, OUTPUT); // La LED en haut pinMode(3, OUTPUT); // La LED en haut à droite pinMode(2, OUTPUT); // La LED en bas à droite } // // ! ==== ! // ! LOOP ! // ! ==== ! // void loop() { EtatDuBouton(7, bBoutonAppuye, lDateAntiRebond, iCompteurDeClicks); while (bBoutonAppuye == false) // On n'a pas encore pose de verre, on ne fait rien { EtatDuBouton(7, bBoutonAppuye, lDateAntiRebond, iCompteurDeClicks); // On attend une pression sur le bouton } // On allume les leds une à une pour signaler que le verre est bien pose for (t = 6; t >= 2; t--) { digitalWrite(t, HIGH); delay(250); digitalWrite(t, LOW); delay(250); } // Un verre a ete pose iDebutMillis = millis(); while (bBoutonAppuye == true) // Tant que le verre est la { EtatDuBouton(7, bBoutonAppuye, lDateAntiRebond, iCompteurDeClicks); // On attend une pression sur le bouton iFinMillis = millis(); if (iFinMillis - iDebutMillis > 3600000) // Le verre est sur le bouton depuis une heure. // { // On fait clignoter toutes les LED cinq fois for (t = 6; t >= 2; t--) { digitalWrite(t, HIGH); delay(1000); } for (t = 6; t >= 2; t--) { digitalWrite(t, LOW); delay(1000); } EtatDuBouton(7, bBoutonAppuye, lDateAntiRebond, iCompteurDeClicks); if (bBoutonAppuye == false) // On a pris le verre { iDebutMillis = millis(); // On redemarre pour une heure } } } } // // ! ========== ! // ! PROCEDURES ! // ! ========== ! // // /////////////////////////////////////////////////////////////////////////// // Gere la pression sur les boutons // // Voir la page // // http://www.diegoyourself.com/index.php?article=arduino_bouton&page=0 // /////////////////////////////////////////////////////////////////////////// // void EtatDuBouton(int entreeDigitale, // Parametre : entree digitale a lire bool& iBoutonAppuye, // Parametre : etat du bouton unsigned long& lDateAntiRebond, // Parametre : etat de l'anti-rebond int& iCompteurDeClicks) // Parametre : compteur de clicks { // lire l'etat de l'entree dans une nouvelle variable temporaire bool etatSignal = !digitalRead(entreeDigitale); // si le bouton semble avoir ete appuye (pas de signal, ou signal = 0/false) if (etatSignal) { // si l'anti-rebond est deja en train d'ignorer les rebonds if (lDateAntiRebond != 0) { // obtenir et determiner combien de temps s'est ecoule depuis le debut // de l'anti-rebond ( = date actuelle - date de debut) unsigned long tempsEcoule = millis() - lDateAntiRebond; // si le temps ecoule est superieur ou egal au temps d'anti-rebond if (tempsEcoule >= TEMPS_ANTI_REBOND_MS) { // Considerer alors que le bouton est appuye iBoutonAppuye = true; // arreter l'anti-rebond lDateAntiRebond = 0; // comme le bouton vient d'etre considere comme appuye (front montant) // c'est le moment d'incrementer le compteur de clicks iCompteurDeClicks++; // Afficher le compteur de clicks } } // sinon, si le bouton est actuellement considere comme relache else if (!iBoutonAppuye) { // activer l'anti-rebond en obtenant la date actuelle du systeme lDateAntiRebond = millis(); } // sinon, le bouton est deja considere comme appuye, il n'y a rien a faire } // sinon, le bouton semble avoir ete relache else { // si le bouton etait appuye if (iBoutonAppuye) { // le considerer maintenant comme relache iBoutonAppuye = false; } // sinon, le bouton etait deja relache ou l'anti-rebond etait en cours else { // arreter l'anti-rebond s'il etait en cours lDateAntiRebond = 0; } } }