// ######################### // # HORLOGE CHAT 2 # // ######################### // # Guy Magli 08.10.2019 # // # 18.12.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. // : --------- : // La personnalisation des affichages de ce code source concerne : Eglantine : // : --------- : // // ! ======================== ! // ! LIBRAIRIES ET PARAMETRES ! // ! ======================== ! // #include // Pour la communication avec un peripherique #include // Pour utilisation de l'horloge RTC // // ! ================================================= ! // ! VARIABLES GLOBALES, CONSTANTES ET INITIALISATIONS ! // ! ================================================= ! // // : ----------------- : // : Pour les messages : // : ----------------- : // ///////////////////////////////////////////////////// // // // A adapter selon l'enfant destinataire du cadeau // // // String cPrenom = "EGLANTINE "; // Terminer par une espace int iJourNaissance = 17; // Pour l'affichage du BON ANNIVERSAIRE int iMoisNaissance = 4; // Idem int iJourFete = 23; // Pour l'affichage de la BONNE FETE int iMoisFete = 8; // Idem // // ///////////////////////////////////////////////////// // String cTexte; // Ligne a afficher sur les leds char cAfficheur[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // Les afficheurs sont vides String cFin = " "; // Serie d'espaces pour la fin des lignes affichees char cChar; // Extraction d'un caractere des chaines a afficher RTC_DS1307 RTC; // Constante pour le module horloge // Pour l'interrupteur permettant le reglage de l'heure d'ete ou d'hiver bool bBoutonAppuye = false; unsigned long lDateAntiRebond = 0; int iCompteurDeClicks = 0; #define TEMPS_ANTI_REBOND_MS 30 // // : -------------------------------------------- : // : Pour les calculs sur les dates et les heures : // : -------------------------------------------- : // DateTime now; unsigned long iHeures = 0; // Nombre d'heures String cHeures = ""; // Equivalent en chaine de caracteres unsigned long iMinutes = 0; // Idem pour les minutes String cMinutes = ""; unsigned long iJours = 0; // La date String cJours = ""; unsigned long iMois = 0; // Le mois String cMois = ""; unsigned long iAnnees = 0;// L'annee String cAnnees = ""; unsigned long iJoursDeLaSemaine = 0; // Jour de la semaine String cJoursDeLaSemaine = ""; int iDizaines = 0; // Pour l'affichage des heures et des minutes au debut et a la fin de l'animation int iUnites = 0; // Idem int t; // Pour les boucles diverses // // : -------------------------------- : // : Pour les connecteurs de la carte : // : -------------------------------- : // const int iHeureDHiver = 11; // Bouton pour l'heure d'hiver const int iMouvement = 10; // Detecteur de mouvements const int iLed1 = 9; // Premiere led const int iLed2 = 8; // Seconde led const int strobe = 7; // STB Afficheur à leds const int clock = 6; // CLK Afficheur à leds const int data = 5; // DIO Afficheur à leds // // : ----------------------- : // : Pour l'afficheur a LEDS : // : ----------------------- : // // Les chiffres correspondent aux adresses 0xc0 0xc2 0xc4 0xc6 0xc8 0xca 0xcc 0xce // // Pour ce montage, en raison de contraintes de places, j'ai du mettre l'afficheur // a l'envers. Les segments ont donc ete modifies #define SEGMENT_D 0x01 // D #define SEGMENT_E 0x02 // --- #define SEGMENT_F 0x04 // C : : E #define SEGMENT_A 0x08 // -G- #define SEGMENT_B 0x10 // B : : F #define SEGMENT_C 0x20 // --- #define SEGMENT_G 0x40 // A // // Les chiffres // const unsigned char cChiffres[] = { SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_D + SEGMENT_E + SEGMENT_F, // 0 SEGMENT_B + SEGMENT_C, // 1 SEGMENT_A + SEGMENT_B + SEGMENT_G + SEGMENT_E + SEGMENT_D, // 2 SEGMENT_A + SEGMENT_B + SEGMENT_G + SEGMENT_C + SEGMENT_D, // 3 SEGMENT_F + SEGMENT_G + SEGMENT_B + SEGMENT_C, // 4 SEGMENT_A + SEGMENT_F + SEGMENT_G + SEGMENT_C + SEGMENT_D, // 5 SEGMENT_A + SEGMENT_F + SEGMENT_G + SEGMENT_E + SEGMENT_C + SEGMENT_D, // 6 SEGMENT_A + SEGMENT_B + SEGMENT_C, // 7 SEGMENT_A + SEGMENT_F + SEGMENT_B + SEGMENT_G + SEGMENT_E + SEGMENT_C + SEGMENT_D, // 8 SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_F + SEGMENT_G + SEGMENT_D, // 9 }; // // Les lettres // const unsigned char cLettreA = SEGMENT_E + SEGMENT_F + SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_G; // Comme le R const unsigned char cLettreB = SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_D + SEGMENT_E + SEGMENT_F + SEGMENT_G; const unsigned char cLettreb = SEGMENT_C + SEGMENT_D + SEGMENT_E + SEGMENT_F + SEGMENT_G ; const unsigned char cLettreC = SEGMENT_A + SEGMENT_F + SEGMENT_E + SEGMENT_D; const unsigned char cLettrec = SEGMENT_D + SEGMENT_E + SEGMENT_G; const unsigned char cLettreD = SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_D + SEGMENT_E + SEGMENT_F; // Comme le O const unsigned char cLettred = SEGMENT_B + SEGMENT_C + SEGMENT_D + SEGMENT_E + SEGMENT_G; const unsigned char cLettreE = SEGMENT_A + SEGMENT_F + SEGMENT_G + SEGMENT_E + SEGMENT_D; const unsigned char cLettreF = SEGMENT_A + SEGMENT_F + SEGMENT_E + SEGMENT_G; const unsigned char cLettreG = SEGMENT_A + SEGMENT_F + SEGMENT_E + SEGMENT_D + SEGMENT_C; // Comme le N const unsigned char cLettreH = SEGMENT_F + SEGMENT_E + SEGMENT_G + SEGMENT_B + SEGMENT_C; const unsigned char cLettreh = SEGMENT_C + SEGMENT_E + SEGMENT_F + SEGMENT_G; const unsigned char cLettreI = SEGMENT_B + SEGMENT_C; const unsigned char cLettrei = SEGMENT_C; const unsigned char cLettreJ = SEGMENT_B + SEGMENT_C + SEGMENT_D; // Pas de K const unsigned char cLettreL = SEGMENT_F + SEGMENT_E + SEGMENT_D; const unsigned char cLettreM = SEGMENT_E + SEGMENT_F + SEGMENT_A + SEGMENT_B + SEGMENT_C; // Comme le N const unsigned char cLettreN = SEGMENT_E + SEGMENT_F + SEGMENT_A + SEGMENT_B + SEGMENT_C; // Comme le M const unsigned char cLettren = SEGMENT_C + SEGMENT_D + SEGMENT_E; const unsigned char cLettreO = SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_D + SEGMENT_E + SEGMENT_F; const unsigned char cLettreo = SEGMENT_C + SEGMENT_D + SEGMENT_E + SEGMENT_G; const unsigned char cLettreP = SEGMENT_E + SEGMENT_F + SEGMENT_A + SEGMENT_B + SEGMENT_G; const unsigned char cLettreQ = SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_D + SEGMENT_E + SEGMENT_F; // Comme le D et le 0 const unsigned char cLettreR = SEGMENT_E + SEGMENT_F + SEGMENT_A + SEGMENT_B + SEGMENT_C + SEGMENT_G; // Comme le A const unsigned char cLettrer = SEGMENT_E + SEGMENT_G; const unsigned char cLettreS = SEGMENT_A + SEGMENT_F + SEGMENT_G + SEGMENT_C + SEGMENT_D; const unsigned char cLettreT = SEGMENT_F + SEGMENT_E + SEGMENT_G; // en majuscule comme const unsigned char cLettret = SEGMENT_F + SEGMENT_E + SEGMENT_G; // en minuscule const unsigned char cLettreU = SEGMENT_F + SEGMENT_E + SEGMENT_D + SEGMENT_C + SEGMENT_B; // Comme le V const unsigned char cLettreu = SEGMENT_C + SEGMENT_D + SEGMENT_E; const unsigned char cLettreV = SEGMENT_F + SEGMENT_E + SEGMENT_D + SEGMENT_C + SEGMENT_B; // Comme le U // Pas de W // Pas de X const unsigned char cLettreY = SEGMENT_F + SEGMENT_G + SEGMENT_B + SEGMENT_C + SEGMENT_D; // Pas de Z // // La ponctuation // const unsigned char cEspace = 0x00; const unsigned char cPoint = 0x80; const unsigned char cApostrophe = SEGMENT_F; const unsigned char cTraitDUnion = SEGMENT_G;// // // ! ===== ! // ! SETUP ! // ! ===== ! // void setup() { Serial.begin(9600); // // Pour l'ecran a LEDS // pinMode(strobe, OUTPUT); pinMode(clock, OUTPUT); pinMode(data, OUTPUT); sendCommand(0x8f); reset(); sendCommand(0x44); // // Pour la led // pinMode(iLed1, OUTPUT); // C'est un connecteur de sortie pinMode(iLed2, OUTPUT); // C'est un connecteur de sortie // // Pour la detection du mouvement // pinMode(iMouvement, INPUT); // C'est un connecteur d'entree digitalWrite(iMouvement, LOW); // // Pour l'horloge // Wire.begin(); RTC.begin(); // effaceTout(); // Affiche un message d'accueil presenteFigurine(); Serial.println("Affiche un message d'accueil"); Serial.println(" "); cTexte = "HORLOGE PERSONNALISEE POUR EGLANTINE xxxxx "; for (t = 0; t <= cTexte.length(); t++) { cChar = cTexte[t]; affiche(cChar); delay(200); decale(); } effaceTout(); cacheFigurine(); } // // ! ==== ! // ! LOOP ! // ! ==== ! // void loop() { cacheFigurine(); if (digitalRead(iMouvement) == HIGH) // Si un mouvement est detecte { presenteFigurine(); Serial.println("Un mouvement a ete detecte."); Serial.println(" "); Serial.println("Lecture de la date et de l'heure."); Serial.println(" "); litLaDateEtLHeure(); Serial.println("Date et heure lues."); Serial.println(" "); switch (iMois) // Mois en lettres { case 1 : cMois = " JANVIER "; break; case 2 : cMois = " FEVRIER "; break; case 3 : cMois = " MARS "; break; case 4 : cMois = " AVRIL "; break; case 5 : cMois = " MAI "; break; case 6 : cMois = " JUIN "; break; case 7 : cMois = " JUILLET "; break; case 8 : cMois = " AOUT "; break; case 9 : cMois = " SEPTEMBRE "; break; case 10 : cMois = " OCTOBRE "; break; case 11 : cMois = " NOVEMBRE "; break; case 12 : cMois = " DECEMBRE "; break; } iAnnees = now.year(); // l'annee cAnnees = (String) iAnnees; iJoursDeLaSemaine = now.dayOfTheWeek(); // le jour de la semaine switch (iJoursDeLaSemaine) // Le jour de la semaine en lettres { case 0 : cJoursDeLaSemaine = "DIMANCHE "; break; case 1 : cJoursDeLaSemaine = "LUNDI "; break; case 2 : cJoursDeLaSemaine = "MARDI "; break; case 3 : cJoursDeLaSemaine = "MERCREDI "; break; case 4 : cJoursDeLaSemaine = "JEUDI "; break; case 5 : cJoursDeLaSemaine = "VENDREDI "; break; case 6 : cJoursDeLaSemaine = "SAMEDI "; break; } Serial.println("L'heure et la date ont ete lues."); Serial.print(iHeures); Serial.print(":"); Serial.println(iMinutes); Serial.print(iJours); Serial.print("-"); Serial.print(iMois); Serial.print("-"); Serial.println(iAnnees); Serial.print(cJoursDeLaSemaine); Serial.print(" "); Serial.print(iJours); Serial.print(" "); Serial.print(cMois); Serial.print(" "); Serial.println(iAnnees); // // On fait s'illuminer la figurine, des la detection d'un mouvement // presenteFigurine(); delay(2000); // On laisse voir la figurine illuminee seule durant deux secondes // // On affiche tout de suite l'heure // afficheHeure(); delay(2500); // 2,5 Secondes de pause pour lire l'heure effaceTout(); // Efface tous les afficheurs // // On choisit le debut du message // if ((iJours == 1) && (iMois == 1)) // Est-ce Nouvel-An (message prioritaire) { cTexte = "BONNE ANNEE "; } else { if ((iJours == 25) && (iMois == 12)) // Est-ce Noel ? { cTexte = "BON NOEL "; } else { if ((iJours == iJourNaissance) && (iMois == iMoisNaissance)) { cTexte = "BON ANNIVERSAIRE "; // Est-ce la date anniversaire ? } else { if ((iJours == iJourFete) && (iMois == iMoisFete)) { cTexte = "BONNE FETE "; // Est-ce la date de la fete ? } else { // Si ca n'est rien de tout ca, alors on dit if (iHeures < 12) { cTexte = "BONJOUR "; // BONJOUR le matin } else { if (iHeures > 18) // BONNE NUIT le soir { cTexte = "BONNE NUIT "; } else { cTexte = ""; // ou rien entre les deux (seulement le prenom) } } } } } } // // On affiche le message deroulant // cTexte = cTexte + cPrenom + " " + "IL EST " + cHeures + "h" + cMinutes + " " + "NOUS SOMMES " + cJoursDeLaSemaine + cJours + cMois + cAnnees + cFin; for (t = 0; t <= cTexte.length(); t++) { cChar = cTexte[t]; affiche(cChar); delay(200); decale(); } // // On recrit l'heure qui est l'information la plus importante // afficheHeure(); delay(5000); // durant 5 Secondes effaceTout(); delay(5000); // On laisse voir la figurine illuminee seule durant cinq secondes cacheFigurine(); } } // // ! ========== ! // ! PROCEDURES ! // ! ========== ! // // : ------------------------------------- : // : Initialisation de l'afficheur digital : // : ------------------------------------- : // void sendCommand(uint8_t value) { digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, value); digitalWrite(strobe, HIGH); } // void reset() { sendCommand(0x40); // set auto increment mode digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); for (uint8_t i = 0; i < 16; i++) { shiftOut(data, clock, LSBFIRST, 0x00); } digitalWrite(strobe, HIGH); } // // : -------------------------------- : // : Efface totalement l'ecran a LEDS : // : -------------------------------- : // void effaceTout() { digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc2); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc4); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc6); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc8); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xca); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xcc); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xce); shiftOut(data, clock, LSBFIRST, 0x00); digitalWrite(strobe, HIGH); } // // : ------------------------------------------- : // : Decale vers la gauche les afficheurs a Leds : // : ------------------------------------------- : // void decale() { int t; for (t = 0; t < 7; t++) { cAfficheur[t] = cAfficheur[t + 1]; } } // // : -------------------- : // : Affiche sur les Leds : // : -------------------- : // void affiche(char cChar) { switch ((cChar)) { case 'A' : cAfficheur[7] = cLettreA; break; case 'B' : cAfficheur[7] = cLettreB; break; case 'b' : cAfficheur[7] = cLettreb; break; case 'C' : cAfficheur[7] = cLettreC; break; case 'c' : cAfficheur[7] = cLettrec; break; case 'D' : cAfficheur[7] = cLettreD; break; case 'd' : cAfficheur[7] = cLettred; break; case 'E' : cAfficheur[7] = cLettreE; break; case 'F' : cAfficheur[7] = cLettreF; break; case 'G' : cAfficheur[7] = cLettreG; break; case 'H' : cAfficheur[7] = cLettreH; break; case 'h' : cAfficheur[7] = cLettreh; break; case 'I' : cAfficheur[7] = cLettreI; break; case 'i' : cAfficheur[7] = cLettrei; break; case 'J' : cAfficheur[7] = cLettreJ; break; case 'L' : cAfficheur[7] = cLettreL; break; case 'M' : cAfficheur[7] = cLettreM; break; case 'N' : cAfficheur[7] = cLettreN; break; case 'n' : cAfficheur[7] = cLettren; break; case 'O' : cAfficheur[7] = cLettreO; break; case 'o' : cAfficheur[7] = cLettreo; break; case 'P' : cAfficheur[7] = cLettreP; break; case 'Q' : cAfficheur[7] = cLettreQ; break; case 'R' : cAfficheur[7] = cLettreR; break; case 'r' : cAfficheur[7] = cLettrer; break; case 'S' : cAfficheur[7] = cLettreS; break; case 'T' : cAfficheur[7] = cLettreT; break; case 't' : cAfficheur[7] = cLettret; break; case 'U' : cAfficheur[7] = cLettreU; break; case 'u' : cAfficheur[7] = cLettreu; break; case 'V' : cAfficheur[7] = cLettreV; break; case 'Y' : cAfficheur[7] = cLettreY; break; case ' ' : cAfficheur[7] = cEspace; break; case '.' : cAfficheur[7] = cPoint; break; case '-' : cAfficheur[7] = cTraitDUnion; break; case '/' : cAfficheur[7] = cApostrophe; break; case '1' : cAfficheur[7] = cChiffres[1]; break; case '2' : cAfficheur[7] = cChiffres[2]; break; case '3' : cAfficheur[7] = cChiffres[3]; break; case '4' : cAfficheur[7] = cChiffres[4]; break; case '5' : cAfficheur[7] = cChiffres[5]; break; case '6' : cAfficheur[7] = cChiffres[6]; break; case '7' : cAfficheur[7] = cChiffres[7]; break; case '8' : cAfficheur[7] = cChiffres[8]; break; case '9' : cAfficheur[7] = cChiffres[9]; break; case '0' : cAfficheur[7] = cChiffres[0]; break; } digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xce); shiftOut(data, clock, LSBFIRST, cAfficheur[0]); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xcc); shiftOut(data, clock, LSBFIRST, cAfficheur[1]); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xca); shiftOut(data, clock, LSBFIRST, cAfficheur[2]); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc8); shiftOut(data, clock, LSBFIRST, cAfficheur[3]); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc6); shiftOut(data, clock, LSBFIRST, cAfficheur[4]); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc4); shiftOut(data, clock, LSBFIRST, cAfficheur[5]); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc2); shiftOut(data, clock, LSBFIRST, cAfficheur[6]); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); shiftOut(data, clock, LSBFIRST, cAfficheur[7]); digitalWrite(strobe, HIGH); } // // En raison de contraintes de place, j'ai du mettre les Leds a l'envers. // La procedure d'affichage est donc modifiee. // // : ------------------------------ : // : Affiche l'heure et les minutes : // : ------------------------------ : // // __HH__ __MN__ // void afficheHeure() { // Cherche les dizaines et les unites pour les heures if (iHeures >= 10) { iDizaines = (int) iHeures / 10; iUnites = iHeures - (iDizaines * 10); } else { iDizaines = 0; iUnites = iHeures; } // Affiche les dizaines et les unites des heures sur les digits idoines __HH__ __MN__ digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xcc); shiftOut(data, clock, LSBFIRST, cChiffres[iDizaines]); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xca); shiftOut(data, clock, LSBFIRST, cChiffres[iUnites]); digitalWrite(strobe, HIGH); // Cherche les dizaines et les unites pour les minutes if (iMinutes >= 10) { iDizaines = (int) iMinutes / 10; iUnites = iMinutes - (iDizaines * 10); } else { iDizaines = 0; iUnites = iMinutes; } // Affiche les dizaines et les unites des minutes sur les digits idoines __HH__ __MN__ digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc4); shiftOut(data, clock, LSBFIRST, cChiffres[iDizaines]); digitalWrite(strobe, HIGH); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc2); shiftOut(data, clock, LSBFIRST, cChiffres[iUnites]); digitalWrite(strobe, HIGH); } // // : ----------------- : // : Lit le module RTC : // : ----------------- : // void litLaDateEtLHeure() { now = RTC.now(); // On lit l'heure et on extrait iHeures = now.hour(); // l'heure EtatDuBouton(iHeureDHiver, bBoutonAppuye, lDateAntiRebond, iCompteurDeClicks); if (bBoutonAppuye == true) // On est en ete { iHeures++; if (iHeures > 23) { iHeures = 0; } } cHeures = (String) iHeures; if (iHeures < 10) { cHeures = "0" + cHeures; } // Formatage iMinutes = now.minute(); // les minutes cMinutes = (String) iMinutes; if (iMinutes < 10) { cMinutes = "0" + cMinutes; } // Formatage iJours = now.day(); // la date du jour cJours = (String) iJours; if (iJours < 10) { cJours = "0" + cJours; } iMois = now.month(); // le mois iAnnees = now.year(); } // // : ----------------- : // : Cache la figurine : (éteint les leds) // : ----------------- : // void cacheFigurine() { digitalWrite(iLed1, HIGH); // Eteindre premiere led digitalWrite(iLed2, HIGH); // Eteindre seconde led } // // : ------------------ : // : Montre la figurine : (allume les leds) // : ------------------ : // void presenteFigurine() { digitalWrite(iLed1, LOW); // Allumer premiere led digitalWrite(iLed2, LOW); // Allumer seconde led } // /////////////////////////////////////////////////////////////////////////// // 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; } } }