// ##################### // # LE TRUC INUTILE # // # Boitier complet 1 # // # L'heure # // ##################### // # 06 2025 # // # Guy Magli # // ##################### // // ############## // # LIBRAIRIES # // ############## // // ----------- // : Clavier : // ----------- // #include // // ---------- // : Heures : // ---------- // #include "Wire.h" #include ; // Calcul #include "RTClib.h"; // Lecture sur module RTC RTC_DS1307 rtc; // Id. // // ----------- // : Display : // ----------- // #include // Affichage sur digits // // ------------- // : Ecran TFT : // ------------- // #include // Affichage analogique sur écran TFT #include // Id. // // ----------------------------- // : Barrette et anneau de Led : // ----------------------------- // #include // Barrettes de Led // // ###################### // # VARIABLES GLOBALES # // ###################### // // ------------------------ // : La saisie au clavier : // ------------------------ // const byte byLignes = 4; // 4 lignes const byte byColonnes = 4; //4 colonnes char cTouches[byLignes][byColonnes] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; // byte byLignesConnecteurs[byLignes] = { 47, 46, 45, 44 }; // Lignes et… byte byColonnesConnecteurs[byColonnes] = { 43, 42, 41, 40 }; // …colonnes Keypad keypad = Keypad(makeKeymap(cTouches), byLignesConnecteurs, byColonnesConnecteurs, byLignes, byColonnes); char cTouche = ' '; // Chaque caractere tape au clavier bool bHeureSaisie = false; // Indique que la saisie des elements est competete (quatre caracteres obligatoires) bool bDateSaisie = false; // Id. bool bAnneeSaisie = false; // Id. bool bAlarmeSaisie = false; // Id. // // ---------------------- // : Lecture de l'heure : // ---------------------- // int iAnneeRTC = 0; int iMoisRTC = 0; int iJourRTC = 0; int iHeureRTC = 0; int iMinuteRTC = 0; int iSecondeRTC = 0; int iAncienneSecondeRTC; // // ---------------------------------- // : L'affichage binaire de l'heure : // ---------------------------------- // int iAnnee = 0; int iMois = 0; int iJour = 0; int iHeure = 0; int iMinute = 0; int iSeconde = 0; int iAnneeBinaire1 = 0; int iAnneeBinaire2 = 0; int iAnneeBinaire4 = 0; int iAnneeBinaire8 = 0; int iAnneeBinaire16 = 0; int iAnneeBinaire32 = 0; // L'annee sur deux chiffres six led (maximum 63) int iMoisBinaire1 = 0; int iMoisBinaire2 = 0; int iMoisBinaire4 = 0; int iMoisBinaire8 = 0; int iMoisBinaire16 = 0; // Le mois quatre led (maximum 15) int iJourBinaire1 = 0; int iJourBinaire2 = 0; int iJourBinaire4 = 0; int iJourBinaire8 = 0; int iJourBinaire16 = 0; // Le jour avec cinq led (maximum 31) int iHeureBinaire1 = 0; int iHeureBinaire2 = 0; int iHeureBinaire4 = 0; int iHeureBinaire8 = 0; int iHeureBinaire16 = 0; // L'heure quatre led (maximum 31, c'est a dire 23) int iMinuteBinaire1 = 0; int iMinuteBinaire2 = 0; int iMinuteBinaire4 = 0; int iMinuteBinaire8 = 0; int iMinuteBinaire16 = 0; int iMinuteBinaire32 = 0; // Les minutes six led (maximum 63, c'est a dire 59) int iSecondeBinaire1 = 0; int iSecondeBinaire2 = 0; int iSecondeBinaire4 = 0; int iSecondeBinaire8 = 0; int iSecondeBinaire16 = 0; int iSecondeBinaire32 = 0; // Les secondes six led (maximum 63, c'est a dire 59) // // ------------------------------------ // : Affichage de l'heure sur les led : // ------------------------------------ // TM1637Display displayHeure(29, 28); // Connecteurs pour les leds de l'heure… TM1637Display displayDate(27, 26); // … et de la date int iAnneeMillier = 0; int iAnneeCentaine = 0; int iAnneeDizaine = 0; int iAnneeUnite = 0; int iHeureUnite = 0; int iHeureDizaine = 0; int iMinuteUnite = 0; int iMinuteDizaine = 0; int iSecondeUnite = 0; int iSecondeDizaine = 0; int iMoisDizaine = 0; int iMoisUnite = 0; int iJourDizaine = 0; int iJourUnite = 0; // // ------------------------------------- // : Affichage de l'horloge analogique : // ------------------------------------- // #define LCD_CS A3 #define LCD_CD A2 #define LCD_WR A1 #define LCD_RD A0 #define LCD_RESET A4 LCDWIKI_KBV mylcd(ILI9486, LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); int iCercleX = 0; // Centre du cercle int iCercleY = 0; // Id. int iCercleRayonHeure = 0; // Longueur de l'aiguille de l'heure int iCercleRayonMinute = 0; // de la minute int iCercleRayonSeconde = 0; // et de la seconde float angleRad = 0; // Angle de l'aiguille int endX = 0; // Coordonnée finale X, fin du trait int endY = 0; // Coordonnée finale Y int iCercleAngle = 0; // Angle en degres par rapport au nord // // : -------------------------------- : // : Les boutons rouge, jaune et vert : // : -------------------------------- : // int iLedVerte = 37; int iLedJaune = 35; int iLedRouge = 33; int iBoutonVert = 36; int iBoutonJaune = 34; int iBoutonRouge = 32; int iPetitBouton = 31; // // : ----------------------------------------- : // : Affichage de l'horloge sur les leds 8 x 8 : // : ----------------------------------------- : // int BarrettesIn = 25; // Connecteur des données Adafruit_NeoPixel barrettes(64, BarrettesIn, NEO_GRB + NEO_KHZ800); // // : ----------------------------------- : // : Signal lumineux sur l'anneau de led : // : ----------------------------------- : // Adafruit_NeoPixel anneau(16, 30, NEO_GRB + NEO_KHZ800); // Nombre de led, pin long lMillisDebut; bool bTimerEnCours = false; char cCouleurTimer = ' '; int iProportion = 0; // // : ------ : // : Alarme : // : ------ : // int iAlarmeDizaineHeure = 0; int iAlarmeUniteHeure = 0; int iAlarmeDizaineMinute = 0; int iAlarmeUniteMinute = 0; // // ######### // # SETUP # // ######### // void setup() { Serial.begin(9600); Serial.println(" "); delay(100); // // : -------------------------------------------- : // : Les voyants lumineux des boutons et l'anneau : // : -------------------------------------------- : // pinMode(iLedVerte, OUTPUT); // Vert pinMode(iLedJaune, OUTPUT); // Jaune pinMode(iLedRouge, OUTPUT); // Rouge // La pression sur les boutons pinMode(iBoutonVert, INPUT_PULLUP); // Vert pinMode(iBoutonJaune, INPUT_PULLUP); // Jaune pinMode(iBoutonRouge, INPUT_PULLUP); // Rouge pinMode(iPetitBouton, INPUT_PULLUP); // Extinction des boutons et de l'anneau // Allume les leds et les boutons pour les tests anneau.begin(); anneau.setBrightness(10); // Rouge digitalWrite(iLedRouge, HIGH); AllumeTourne(255, 0, 0); delay(250); EteintTourne(0, 0, 0); digitalWrite(iLedRouge, LOW); delay(250); // Orange digitalWrite(iLedJaune, HIGH); AllumeTourne(255, 125, 0); delay(250); EteintTourne(0, 0, 0); digitalWrite(iLedJaune, LOW); delay(250); // Vert digitalWrite(iLedVerte, HIGH); AllumeTourne(0, 255, 0); delay(250); EteintTourne(0, 0, 0); digitalWrite(iLedVerte, LOW); delay(250); anneau.clear(); // // : ------------------------- : // : Initialisation de RTC : // : ------------------------- : // rtc.begin(); // // : ------------------------- : // : Initialisation des DIGITS : // : ------------------------- : // // Digits de l'heure displayHeure.clear(); displayHeure.setBrightness(0x0f); // Digits de la date displayDate.clear(); displayDate.setBrightness(0x0f); // // : --------------------- : // : Initialisation de TFT : // : --------------------- : // mylcd.Init_LCD(); // Fond noir et mode paysage mylcd.Fill_Screen(0, 0, 0); mylcd.Set_Rotation(1); // Dessin du fond de l'horloge iCercleX = (int)floor(mylcd.Get_Display_Width() / 2); iCercleY = (int)floor(mylcd.Get_Display_Height() / 2); mylcd.Set_Draw_color(255, 255, 255); // Dimensions des aiguilles iCercleRayonSeconde = (int)floor(mylcd.Get_Display_Height() / 2) - 10; iCercleRayonMinute = (int)floor(mylcd.Get_Display_Height() / 2) - 10; iCercleRayonHeure = (int)floor(mylcd.Get_Display_Height() / 2) - 50; mylcd.Draw_Circle(iCercleX, iCercleY, iCercleRayonSeconde + 9); // Dessins des repères des minutes et des heures for (int i = 0; i < 60; i++) { float angle = (i * 6) * (PI / 180); // 6 degres par minute // Calculer les coordonnées des points int pointX = iCercleX + (iCercleRayonSeconde + 9) * cos(angle); int pointY = iCercleY + (iCercleRayonSeconde + 9) * sin(angle); // Dessiner le point plus ou moins gros pour représenter les minutes et les heures mylcd.Set_Draw_color(255, 255, 255); if (i % 5 == 0) // Toutes les cinq minutes… { mylcd.Fill_Circle(pointX, pointY, 5); // Utilise un grand cercle pour représenter les heures } else // …sinon… { mylcd.Fill_Circle(pointX, pointY, 2); // et un petit cercle pour représenter les minutes } } // // : ----------------------------- : // : Initialisation des leds 8 x 8 : // : ----------------------------- : // barrettes.begin(); barrettes.show(); barrettes.clear(); barrettes.setBrightness(10); // } // // ######## // # LOOP # // ######## // void loop() { // // ------------------------------------ // : Test de la saisie sur le clavier : // ------------------------------------ // cTouche = keypad.getKey(); if (cTouche != NO_KEY) // Une touche a ete pressee { if (cTouche == 'A') // Reglage de l'heure et des minutes (quatre digits a saisir obligatoirement) { iHeureDizaine = 0; iHeureUnite = 0; iMinuteDizaine = 0; iMinuteUnite = 0; displayHeure.showNumberDec(0, false, 1, 0); displayHeure.showNumberDec(0, false, 1, 1); displayHeure.showNumberDec(0, false, 1, 2); displayHeure.showNumberDec(0, false, 1, 3); bHeureSaisie = false; while (bHeureSaisie == false) { cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '2') { iHeureDizaine = cTouche - '0'; } // Les heures peuvent avoir 0, 1 et 2 comme chiffre des dizaines… } displayHeure.showNumberDec(iHeureDizaine, false, 1, 0); cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '9') { iHeureUnite = cTouche - '0'; } // …et tous les chiffres comme unite. } displayHeure.showNumberDec(iHeureUnite, false, 1, 1); cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '5') { iMinuteDizaine = cTouche - '0'; } // Les minutes pêuvent avoir 0, 1, 2, 3, 4, 5 commne chiffre des dizaines… } displayHeure.showNumberDec(iMinuteDizaine, false, 1, 2); cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '9') { iMinuteUnite = cTouche - '0'; } // …et tous les chiffres comme unite. } // On regle les heures et les minutes sans changer la date et le mois. rtc.adjust(DateTime(iAnneeRTC, iMoisRTC, iJourRTC, iHeureDizaine * 10 + iHeureUnite, iMinuteDizaine * 10 + iMinuteUnite, 0)); // Année, mois, jour, heure, minute, seconde displayHeure.showNumberDec(iMinuteUnite, false, 1, 3); cTouche = NO_KEY; bHeureSaisie = true; } } if (cTouche == 'B') // Reglage du jour et du mois (quatre digits a saisir obligatoirement) { iJourDizaine = 0; iJourUnite = 0; iMoisDizaine = 0; iMoisUnite = 0; displayDate.showNumberDec(0, false, 1, 0); displayDate.showNumberDec(0, false, 1, 1); displayDate.showNumberDec(0, false, 1, 2); displayDate.showNumberDec(0, false, 1, 3); bDateSaisie = false; while (bDateSaisie == false) { cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '3') { iJourDizaine = cTouche - '0'; } // Les jours peuvent avoir 0, 1, 2 et 3 comme chiffre des dizaines… } displayDate.showNumberDec(iJourDizaine, false, 1, 0); cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '9') { iJourUnite = cTouche - '0'; } // …et tous les chiffres comme unite. } displayDate.showNumberDec(iJourUnite, false, 1, 1); cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '1') { iMoisDizaine = cTouche - '0'; } // Les mois peuvent avoir 0, et 1 comme chiffre des dizaines… } displayDate.showNumberDec(iMoisDizaine, false, 1, 2); cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '9') { iMoisUnite = cTouche - '0'; } // …et tous les chiffres comme unite. } displayDate.showNumberDec(iMoisUnite, false, 1, 3); // On regle la date et le mpis changer changer l'heure et les minutes. rtc.adjust(DateTime(iAnneeRTC, iMoisDizaine * 10 + iMoisUnite, iJourDizaine * 10 + iJourUnite, iHeureRTC, iMinuteRTC, iSecondeRTC)); // Année, mois, jour, heure, minute, seconde cTouche = NO_KEY; bDateSaisie = true; } } if (cTouche == 'C') // Reglage de l'année (quatre digits a saisir obligatoirement) { displayDate.showNumberDec(0, false, 1, 0); displayDate.showNumberDec(0, false, 1, 1); displayDate.showNumberDec(0, false, 1, 2); displayDate.showNumberDec(0, false, 1, 3); bAnneeSaisie = false; while (bAnneeSaisie == false) { cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '2' and cTouche <= '2') { iAnneeMillier = cTouche - '0'; } // Les annees peuvent avoir 2 comme chiffre des milliers… } displayDate.showNumberDec(iAnneeMillier, false, 1, 0); cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '0') { iAnneeCentaine = cTouche - '0'; } // … 0 comme chiffre des centaines… } displayDate.showNumberDec(iAnneeCentaine, false, 1, 1); cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '2' and cTouche <= '4') { iAnneeDizaine = cTouche - '0'; } // …2, 3, ou 4 comme chiffre des dizaines…… } displayDate.showNumberDec(iAnneeDizaine, false, 1, 2); cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '9') { iAnneeUnite = cTouche - '0'; } // …et tous les chiffres comme unite. } displayDate.showNumberDec(iAnneeUnite, false, 1, 3); // On regle l'annee sans modifier la date ou l'heure rtc.adjust(DateTime(iAnneeMillier * 1000 + iAnneeCentaine * 100 + iAnneeDizaine * 10 + iAnneeUnite, iMoisRTC, iJourRTC, iHeureRTC, iMinuteRTC, iSecondeRTC)); // Année, mois, jour, heure, minute, seconde cTouche = NO_KEY; bAnneeSaisie = true; } } if (cTouche == 'D') // Reglage de l'heure de l'alarme (quatre digits a saisir obligatoirement) { displayHeure.showNumberDec(0, false, 1, 0); displayHeure.showNumberDec(0, false, 1, 1); displayHeure.showNumberDec(0, false, 1, 2); displayHeure.showNumberDec(0, false, 1, 3); bAlarmeSaisie = false; while (bAlarmeSaisie == false) { cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '2') { iAlarmeDizaineHeure = cTouche - '0'; } // Les heures peuvent avoir 0, 1 et 2 comme chiffre des dizaines… } displayHeure.showNumberDec(iAlarmeDizaineHeure, false, 1, 0); cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '9') { iAlarmeUniteHeure = cTouche - '0'; } // …et tous les chiffres comme unite. } displayHeure.showNumberDec(iAlarmeUniteHeure, false, 1, 1); cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '5') { iAlarmeDizaineMinute = cTouche - '0'; } // Les minutes pêuvent avoir 0, 1, 2, 3, 4, 5 commne chiffre des dizaines… } displayHeure.showNumberDec(iAlarmeDizaineMinute, false, 1, 2); cTouche = NO_KEY; while (cTouche == NO_KEY) { cTouche = keypad.getKey(); if (cTouche >= '0' and cTouche <= '9') { iAlarmeUniteMinute = cTouche - '0'; } // …et tous les chiffres comme unite. } displayHeure.showNumberDec(iAlarmeUniteMinute, false, 1, 3); cTouche = NO_KEY; bAlarmeSaisie = true; } } } // // : -------------------------- : // : Test de l'etat des boutons : // : -------------------------- : // if (digitalRead(iBoutonVert) == LOW) // Bouton vert, on regle le timer sur 30 minutes { digitalWrite(iLedVerte, HIGH); lMillisDebut = millis(); bTimerEnCours = true; cCouleurTimer = 'V'; digitalWrite(iLedJaune, LOW); digitalWrite(iLedRouge, LOW); } if (digitalRead(iBoutonJaune) == LOW) // Bouton jaune, on regle le timer sur 60 minutes { digitalWrite(iLedJaune, HIGH); lMillisDebut = millis(); bTimerEnCours = true; cCouleurTimer = 'J'; digitalWrite(iLedVerte, LOW); digitalWrite(iLedRouge, LOW); } if (digitalRead(iBoutonRouge) == LOW) // Bouton rouge, on regle le timer sur 120 minutes { digitalWrite(iLedRouge, HIGH); lMillisDebut = millis(); bTimerEnCours = true; cCouleurTimer = 'R'; digitalWrite(iLedVerte, LOW); digitalWrite(iLedJaune, LOW); } if (digitalRead(iPetitBouton) == LOW) // Petit bouton, c'est la fin des timers et de l'alarme { bTimerEnCours = false; cCouleurTimer = ' '; EteintTourne(0, 0, 0); digitalWrite(iLedVerte, LOW); digitalWrite(iLedJaune, LOW); digitalWrite(iLedRouge, LOW); iAlarmeDizaineHeure = -1; iAlarmeUniteHeure = -1; iAlarmeUniteHeure = -1; iAlarmeUniteMinute = -1; bTimerEnCours = false; cCouleurTimer = " "; } // // : ------------------ : // : Horloge analogique : // : ------------------ : // // On efface les precedentes aiguilles // // Ancienne seconde iCercleAngle = (int)floor((360 * iAncienneSecondeRTC / 60)); angleRad = radians(iCercleAngle); endX = iCercleX + iCercleRayonSeconde * sin(angleRad); endY = iCercleY - iCercleRayonSeconde * cos(angleRad); mylcd.Set_Draw_color(0, 0, 0); mylcd.Draw_Line(iCercleX, iCercleY, endX, endY); // Ancienne minute iCercleAngle = (int)floor((6 * iMinuteRTC) + (iAncienneSecondeRTC / 10)); angleRad = radians(iCercleAngle); endX = iCercleX + iCercleRayonMinute * sin(angleRad); endY = iCercleY - iCercleRayonMinute * cos(angleRad); mylcd.Set_Draw_color(0, 0, 0); mylcd.Draw_Line(iCercleX - 1, iCercleY - 1, endX - 1, endY - 1); mylcd.Draw_Line(iCercleX, iCercleY, endX, endY); mylcd.Draw_Line(iCercleX + 1, iCercleY + 1, endX + 1, endY + 1); // Ancienne heure if (iHeureRTC <= 12) // Du matin { iCercleAngle = (int)floor((30 * iHeureRTC) + (iMinuteRTC / 2) + (iAncienneSecondeRTC / 120)); } else // et de l'apres-midi { iCercleAngle = (int)floor((30 * (iHeureRTC - 12)) + (iMinuteRTC / 2) + (iAncienneSecondeRTC / 120)); } angleRad = radians(iCercleAngle); endX = iCercleX + iCercleRayonHeure * sin(angleRad); endY = iCercleY - iCercleRayonHeure * cos(angleRad); mylcd.Set_Draw_color(0, 0, 0); mylcd.Draw_Line(iCercleX - 1, iCercleY - 1, endX - 1, endY - 1); mylcd.Draw_Line(iCercleX, iCercleY, endX, endY); mylcd.Draw_Line(iCercleX + 1, iCercleY + 1, endX + 1, endY + 1); // // Lecture des donnees RTC // DateTime now = rtc.now(); iAnneeRTC = now.year(); iMoisRTC = now.month(); iJourRTC = now.day(); iHeureRTC = now.hour(); iMinuteRTC = now.minute(); iSecondeRTC = now.second(); iAncienneSecondeRTC = iSecondeRTC; // // ------------------------------------------------- // : Affichage de l'heure sur les barrettes de led : // ------------------------------------------------- // barrettes.clear(); // Conversion des deux derniers chiffres de l'annee en binaire et affichage iAnnee = iAnneeRTC - 2000; // Pour la barrette 1 de 0 a 7 iAnneeBinaire32 = (int)floor(iAnnee / 32); iAnnee = iAnnee - (iAnneeBinaire32 * 32); if (iAnneeBinaire32) { barrettes.setPixelColor(4, barrettes.Color(243, 187, 11)); } iAnneeBinaire16 = (int)floor(iAnnee / 16); iAnnee = iAnnee - (iAnneeBinaire16 * 16); if (iAnneeBinaire16) { barrettes.setPixelColor(3, barrettes.Color(243, 187, 11)); } iAnneeBinaire8 = (int)floor(iAnnee / 8); iAnnee = iAnnee - (iAnneeBinaire8 * 8); if (iAnneeBinaire8) { barrettes.setPixelColor(2, barrettes.Color(243, 187, 11)); } iAnneeBinaire4 = (int)floor(iAnnee / 4); iAnnee = iAnnee - (iAnneeBinaire4 * 4); if (iAnneeBinaire4) { barrettes.setPixelColor(1, barrettes.Color(243, 187, 11)); } iAnneeBinaire2 = (int)floor(iAnnee / 2); iAnnee = iAnnee - (iAnneeBinaire2 * 2); if (iAnneeBinaire2) { barrettes.setPixelColor(0, barrettes.Color(243, 187, 11)); } iAnneeBinaire1 = iAnnee; if (iAnneeBinaire1) { barrettes.setPixelColor(0, barrettes.Color(243, 187, 11)); } // Conversion du mois en binaire iMois = iMoisRTC; // Pour la barrette 2 de 8 a 15 et affichage iMoisBinaire8 = (int)floor(iMois / 8); iMois = iMois - (iMoisBinaire8 * 8); if (iMoisBinaire8) { barrettes.setPixelColor(11, barrettes.Color(243, 187, 11)); } iMoisBinaire4 = (int)floor(iMois / 4); iMois = iMois - (iMoisBinaire4 * 4); if (iMoisBinaire4) { barrettes.setPixelColor(10, barrettes.Color(243, 187, 11)); } iMoisBinaire2 = (int)floor(iMois / 2); iMois = iMois - (iMoisBinaire2 * 2); if (iMoisBinaire2) { barrettes.setPixelColor(9, barrettes.Color(243, 187, 11)); } iMoisBinaire1 = iMois; if (iMoisBinaire1) { barrettes.setPixelColor(8, barrettes.Color(243, 187, 11)); } // Conversion du jour en binaire iJour = iJourRTC; // Pour la barrette 3 de 16 a 23 et affichage iJourBinaire16 = (int)floor(iJour / 16); iJour = iJour - (iJourBinaire16 * 16); if (iJourBinaire16) { barrettes.setPixelColor(20, barrettes.Color(243, 187, 11)); } iJourBinaire8 = (int)floor(iJour / 8); iJour = iJour - (iJourBinaire8 * 8); if (iJourBinaire8) { barrettes.setPixelColor(19, barrettes.Color(243, 187, 11)); } iJourBinaire4 = (int)floor(iJour / 4); iJour = iJour - (iJourBinaire4 * 4); if (iJourBinaire4) { barrettes.setPixelColor(18, barrettes.Color(243, 187, 11)); } iJourBinaire2 = (int)floor(iJour / 2); iJour = iJour - (iJourBinaire2 * 2); if (iJourBinaire2) { barrettes.setPixelColor(17, barrettes.Color(243, 187, 11)); } iJourBinaire1 = iJour; if (iJourBinaire1) { barrettes.setPixelColor(16, barrettes.Color(243, 187, 11)); } // Conversion de l'heure en binaire iHeure = iHeureRTC; // Pour la barrette 5 de 24 a 31 et affichage iHeureBinaire16 = (int)floor(iHeure / 16); iHeure = iHeure - (iHeureBinaire16 * 16); if (iHeureBinaire16) { barrettes.setPixelColor(36, barrettes.Color(11, 183, 243)); } iHeureBinaire8 = (int)floor(iHeure / 8); iHeure = iHeure - (iHeureBinaire8 * 8); if (iHeureBinaire8) { barrettes.setPixelColor(35, barrettes.Color(11, 183, 243)); } iHeureBinaire4 = (int)floor(iHeure / 4); iHeure = iHeure - (iHeureBinaire4 * 4); if (iHeureBinaire4) { barrettes.setPixelColor(34, barrettes.Color(11, 183, 243)); } iHeureBinaire2 = (int)floor(iHeure / 2); iHeure = iHeure - (iHeureBinaire2 * 2); if (iHeureBinaire2) { barrettes.setPixelColor(33, barrettes.Color(11, 183, 243)); } iHeureBinaire1 = iHeure; if (iHeureBinaire1) { barrettes.setPixelColor(32, barrettes.Color(11, 183, 243)); } // Conversion de la minute en binaire iMinute = iMinuteRTC; // Pour la barrette 5 de 32 a 39 et affichage iMinuteBinaire32 = (int)floor(iMinute / 32); iMinute = iMinute - (iMinuteBinaire32 * 32); if (iMinuteBinaire32) { barrettes.setPixelColor(45, barrettes.Color(11, 183, 243)); } iMinuteBinaire16 = (int)floor(iMinute / 16); iMinute = iMinute - (iMinuteBinaire16 * 16); if (iMinuteBinaire16) { barrettes.setPixelColor(44, barrettes.Color(11, 183, 243)); } iMinuteBinaire8 = (int)floor(iMinute / 8); iMinute = iMinute - (iMinuteBinaire8 * 8); if (iMinuteBinaire8) { barrettes.setPixelColor(43, barrettes.Color(11, 183, 243)); } iMinuteBinaire4 = (int)floor(iMinute / 4); iMinute = iMinute - (iMinuteBinaire4 * 4); if (iMinuteBinaire4) { barrettes.setPixelColor(42, barrettes.Color(11, 183, 243)); } iMinuteBinaire2 = (int)floor(iMinute / 2); iMinute = iMinute - (iMinuteBinaire2 * 2); if (iMinuteBinaire2) { barrettes.setPixelColor(41, barrettes.Color(11, 183, 243)); } iMinuteBinaire1 = iMinute; if (iMinuteBinaire1) { barrettes.setPixelColor(40, barrettes.Color(11, 183, 243)); } // Conversion de la seconde en binaire iSeconde = iSecondeRTC; // Pour la barrette 6 de 40 a 47 et affichage iSecondeBinaire32 = (int)floor(iSeconde / 32); iSeconde = iSeconde - (iSecondeBinaire32 * 32); if (iSecondeBinaire32) { barrettes.setPixelColor(53, barrettes.Color(11, 183, 243)); } iSecondeBinaire16 = (int)floor(iSeconde / 16); iSeconde = iSeconde - (iSecondeBinaire16 * 16); if (iSecondeBinaire16) { barrettes.setPixelColor(52, barrettes.Color(11, 183, 243)); } iSecondeBinaire8 = (int)floor(iSeconde / 8); iSeconde = iSeconde - (iSecondeBinaire8 * 8); if (iSecondeBinaire8) { barrettes.setPixelColor(51, barrettes.Color(11, 183, 243)); } iSecondeBinaire4 = (int)floor(iSeconde / 4); iSeconde = iSeconde - (iSecondeBinaire4 * 4); if (iSecondeBinaire4) { barrettes.setPixelColor(50, barrettes.Color(11, 183, 243)); } iSecondeBinaire2 = (int)floor(iSeconde / 2); iSeconde = iSeconde - (iSecondeBinaire2 * 2); if (iSecondeBinaire2) { barrettes.setPixelColor(49, barrettes.Color(11, 183, 243)); } iSecondeBinaire1 = iSeconde; if (iSecondeBinaire1) { barrettes.setPixelColor(48, barrettes.Color(11, 183, 243)); } barrettes.show(); // // : ------------- : // : Anneau de led : // : ------------- : // if (bTimerEnCours == true) { if (cCouleurTimer == 'V') { if ((millis() - lMillisDebut) >= 1800000) // On a atteint 30 minutes { AllumeTourne(0, 255, 0); delay(250); EteintTourne(0, 0, 0); } else // On affiche le pourcentage sur l'anneau en vert { iProportion = round(((millis() - lMillisDebut) / 18000 / 6.25)); for (int iLed = 0; iLed < iProportion; iLed++) { anneau.setPixelColor(iLed, anneau.Color(0, 255, 0)); anneau.show(); delay(25); } } } if (cCouleurTimer == 'J') { if ((millis() - lMillisDebut) >= 3600000) // On a atteint 60 minutes { AllumeTourne(255, 125, 0); delay(250); EteintTourne(0, 0, 0); } else // On affiche le pourcentage sur l'anneau en jaune { iProportion = round(((millis() - lMillisDebut) / 36000 / 6.25)); for (int iLed = 0; iLed < iProportion; iLed++) { anneau.setPixelColor(iLed, anneau.Color(255, 125, 0)); anneau.show(); delay(25); } // On allume } } if (cCouleurTimer == 'R') { if ((millis() - lMillisDebut) >= 7200000) // On a atteint 120 minutes { AllumeTourne(255, 0, 0); delay(250); EteintTourne(0, 0, 0); } else // On affiche le pourcentage sur l'anneau en rouge { iProportion = round(((millis() - lMillisDebut) / 72000 / 6.25)); for (int iLed = 0; iLed < iProportion; iLed++) { anneau.setPixelColor(iLed, anneau.Color(255, 0, 0)); anneau.show(); delay(25); } // On allume } } anneau.show(); } // : ------ : // : Alarme : // : ------ : // if (((iAlarmeDizaineHeure * 10 + iAlarmeUniteHeure) == iHeureRTC) and ((iAlarmeDizaineMinute * 10 + iAlarmeUniteMinute) == iMinuteRTC)) { AllumeTourne(0, 0, 255); delay(250); EteintTourne(0, 0, 0); } // // ------------------------------------------- // : Affichagee de l'heure sur DIGITS rouges : // ------------------------------------------- // iHeureDizaine = (int)floor(iHeureRTC / 10); iHeureUnite = iHeureRTC - (iHeureDizaine * 10); iMinuteDizaine = (int)floor(iMinuteRTC / 10); iMinuteUnite = iMinuteRTC - (iMinuteDizaine * 10); iSecondeDizaine = (int)floor(iSecondeRTC / 10); iSecondeUnite = iSecondeRTC - (iSecondeDizaine * 10); displayHeure.showNumberDec(iHeureDizaine, false, 1, 0); displayHeure.showNumberDec(iHeureUnite, false, 1, 1); displayHeure.showNumberDec(iMinuteDizaine, false, 1, 2); displayHeure.showNumberDec(iMinuteUnite, false, 1, 3); // // ------------------------------------------ // : Affichage de la date sur DIGITS rouges : // ------------------------------------------ // iMoisDizaine = (int)floor(iMoisRTC / 10); iMoisUnite = iMoisRTC - (iMoisDizaine * 10); iJourDizaine = (int)floor(iJourRTC / 10); iJourUnite = iJourRTC - (iJourDizaine * 10); iSecondeDizaine = (int)floor(iSecondeRTC / 10); iSecondeUnite = iSecondeRTC - (iSecondeDizaine * 10); displayDate.showNumberDec(iJourDizaine, false, 1, 0); displayDate.showNumberDec(iJourUnite, false, 1, 1); displayDate.showNumberDec(iMoisDizaine, false, 1, 2); displayDate.showNumberDec(iMoisUnite, false, 1, 3); // // ------------------------------------------------- // : Affichage de l'heure analogique sur ecran TFT : // ------------------------------------------------- // // Seconde iCercleAngle = (int)floor((360 * iSecondeRTC / 60)); angleRad = radians(iCercleAngle); endX = iCercleX + iCercleRayonSeconde * sin(angleRad); endY = iCercleY - iCercleRayonSeconde * cos(angleRad); mylcd.Set_Draw_color(255, 0, 0); mylcd.Draw_Line(iCercleX, iCercleY, endX, endY); // Minute iCercleAngle = (int)floor((6 * iMinuteRTC) + (iSecondeRTC / 10)); angleRad = radians(iCercleAngle); endX = iCercleX + iCercleRayonMinute * sin(angleRad); endY = iCercleY - iCercleRayonMinute * cos(angleRad); mylcd.Set_Draw_color(0, 255, 0); mylcd.Draw_Line(iCercleX - 1, iCercleY - 1, endX - 1, endY - 1); mylcd.Draw_Line(iCercleX, iCercleY, endX, endY); mylcd.Draw_Line(iCercleX + 1, iCercleY + 1, endX + 1, endY + 1); // Heure if (iHeureRTC <= 12) // Du matin { iCercleAngle = (int)floor((30 * iHeureRTC) + (iMinuteRTC / 2) + (iSecondeRTC / 120)); } else // et de l'apres-midi { iCercleAngle = (int)floor((30 * (iHeureRTC - 12)) + (iMinuteRTC / 2) + (iSecondeRTC / 120)); } angleRad = radians(iCercleAngle); endX = iCercleX + iCercleRayonHeure * sin(angleRad); endY = iCercleY - iCercleRayonHeure * cos(angleRad); mylcd.Set_Draw_color(0, 0, 255); mylcd.Draw_Line(iCercleX - 1, iCercleY - 1, endX - 1, endY - 1); mylcd.Draw_Line(iCercleX, iCercleY, endX, endY); mylcd.Draw_Line(iCercleX + 1, iCercleY + 1, endX + 1, endY + 1); // // On en change l'affichage que si la seconde a changé // while (iSecondeRTC == iAncienneSecondeRTC) { DateTime now = rtc.now(); iSecondeRTC = now.second(); } } // // ! ========== ! // ! PROCEDURES ! // ! ========== ! // void AllumeTourne(int a, int b, int c) { anneau.clear(); anneau.setBrightness(10); int iTotal = 0; // Pour tout le tour for (int iLed = 0; iLed < 16; iLed++) { // On allume anneau.setPixelColor(iLed, anneau.Color(a, b, c)); anneau.show(); delay(25); // On eteint anneau.setPixelColor(iLed, anneau.Color(a, b, c)); anneau.show(); delay(25); // On rallume si on est deja pass if (iLed < iTotal) { anneau.setPixelColor(iLed, anneau.Color(a, b, c)); anneau.show(); } } iTotal++; } void EteintTourne(int a, int b, int c) { anneau.setBrightness(10); int iTotal = 0; // Pour tout le tour for (int iLed = 15; iLed >= 0; iLed--) { // On eteint anneau.setPixelColor(iLed + 1, anneau.Color(0, 0, 0)); anneau.show(); delay(25); // On rallume anneau.setPixelColor(iLed, anneau.Color(a, b, c)); anneau.show(); delay(25); // On eteint si on est deja passe if (iLed > iTotal) { anneau.setPixelColor(iLed, anneau.Color(0, 0, 0)); } anneau.setPixelColor(16, anneau.Color(0, 0, 0)); anneau.show(); } iTotal++; }