// ################################ // # HORLOGE SIMPLE # // ################################ // # Sans module RTC # // # Avec multi function shield # // # Sans cables # // ################################ // # 03.06.2023 # // # Guy Magli # // ################################ // // : ---------------------------- : // : Pour le bouclier d'affichage : // : ---------------------------- : // #define LATCH_DIO 4 #define CLK_DIO 7 #define DATA_DIO 8 const byte SEGMENT_MAP[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90 }; // Dessins des chiffres const byte SEGMENT_SELECT[] = { 0xF1,0xF2,0xF4,0xF8 }; // Numero de l'afficheur (0 a 3) #define BUTTON1 A1 // Bouton de gauche, #define BUTTON2 A2 // du milieu #define BUTTON3 A3 // et de droite // // : ---------------------------- : // : Pour millis : // : ---------------------------- : // unsigned long iMillis = millis(); unsigned long iMillisAncien; int iHeures = 0; // Heures int iHeuresD = 0; // Chiffre des dizaines d'heures int iHeuresU = 0; // Chiffre des unites d'heures int iMinutes = 0; // Minutes int iMinutesD = 0; // Chiffre des dizaines de minutes int iMinutesU = 0; // Chiffre des unites de minutes // // ! ============================= ! // ! SETUP ! // ! ============================= ! // void setup() { // Parametrage du bouclier // Affichages pinMode(LATCH_DIO, OUTPUT); pinMode(CLK_DIO, OUTPUT); pinMode(DATA_DIO, OUTPUT); // Boutons pinMode(BUTTON1, INPUT_PULLUP); pinMode(BUTTON2, INPUT_PULLUP); pinMode(BUTTON3, INPUT_PULLUP); // En attendant qu'on presse le bouton de validation, le troisieme // on peut regler l'heure, bouton de gauche, ou les minutes, bouton du milieu. while (digitalRead(A3) == true) // Tant que le bouton trois n'est pas presse { if (digitalRead(BUTTON1) == false) // Si on a presse le bouton 1 { iHeures++; if (iHeures > 23) { iHeures = 0; } // On regle une heure de plus delay(500); } if (digitalRead(BUTTON2) == false) // Si on apresse le bouton 2 { iMinutes++; if (iMinutes > 59) { iMinutes = 0; } // On regle une minute de plus delay(500); } iHeuresD = iHeures / 10; // Calcul du chiffre des dizaines d'heures iHeuresU = iHeures - (iHeuresD * 10); // et des unites d'heures iMinutesD = iMinutes / 10; // Calcul des dizaines de minutes iMinutesU = iMinutes - (iMinutesD * 10); // et des unites de minutes WriteNumberToSegment((byte) 0, (byte) iHeuresD); // Affichage des dizaines d'une sur le premier afficheur WriteNumberToSegment((byte) 1, (byte) iHeuresU); // et des unites sur le deuxieme WriteNumberToSegment((byte) 2, (byte) iMinutesD); // Affichage des dizaines de minutes sur le troisieme afficheur WriteNumberToSegment((byte) 3, (byte) iMinutesU); // et des unites sur le quatrieme } iMillis = millis(); // Lecture de l'heure iMillisAncien = iMillis; // Memorisation de l'heure // L'utilisation des millis impose un nouveau reglage tous les cinquante jours } // // ! ============================= ! // ! Loop ! // ! ============================= ! // void loop() { iMillis = millis(); if (iMillis - iMillisAncien >= 59922) // Ce nombre tient compte des delais de fonctionnement { iMinutes++; iMillisAncien = iMillis; } if (iMinutes > 59) // On change d'heure { iMinutes = 0; iHeures++; if (iHeures > 23) // On change jour, donc on recommence a 00:00 { iHeures = 0; } } iHeuresD = iHeures / 10; // Calcul du chiffre des dizaines d'heures iHeuresU = iHeures - (iHeuresD * 10); // et des unites d'heures iMinutesD = iMinutes / 10; // Calcul des dizaines de minutes iMinutesU = iMinutes - (iMinutesD * 10); // et des unites de minutes WriteNumberToSegment((byte)0, (byte)iHeuresD); // Affichage des dizaines d'une sur le premier afficheur WriteNumberToSegment((byte)1, (byte)iHeuresU); // et des unites sur le deuxieme WriteNumberToSegment((byte)2, (byte)iMinutesD); // Affichage des dizaines de minutes sur le troisieme afficheur WriteNumberToSegment((byte)3, (byte)iMinutesU); // et des unites sur le quatrieme } // // ! ============================= ! // ! Procedures ! // ! ============================= ! // void WriteNumberToSegment(byte Segment, byte Value) { digitalWrite(LATCH_DIO, LOW); shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]); shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment]); digitalWrite(LATCH_DIO, HIGH); }