// ######################## // # COMPTEUR AVEC BOUTON # // ######################## // # Guy Magli 10.12.2020 # // ######################## // # 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. // // ! ======================== ! // ! LIBRAIRIES ET PARAMETRES ! // ! ======================== ! // #include // Pour la communication avec un peripherique #include #include // Pour l'eeprom #include // Pour le clavier #include // Pour les calculs // // ! ================================================= ! // ! VARIABLES GLOBALES, CONSTANTES ET INITIALISATIONS ! // ! ================================================= ! // // : -------------------------- : // : Pour les afficheurs a LEDS : // : -------------------------- : // #define CLKA 13 // Afficheur A #define DIOA 12 #define CLKB 11 // Afficheur B #define DIOB 10 int iNombreA = 0; // Nombre a afficher sur A int iMilliersA = 0; int iCentainesA = 0; int iDizainesA = 0; int iUnitesA = 0; int iNombreB = 0; // Nombre a afficher sur B int iMilliersB = 0; int iCentainesB = 0; int iDizainesB = 0; int iUnitesB = 0; // // : -------------- : // : Pour le bouton : // : -------------- : // int iBouton = A5; // (Gros bouton - Fil noir) // // : --------------- : // : Pour le clavier : // : --------------- : // const byte ROWS = 4; // Quatre lignes const byte COLS = 4; // Quatre colonnes // Tables des caracteres du clavier char hexaKeys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = { 2, 3, 4, 5 }; // Connexion des lignes byte colPins[COLS] = { 6, 7, 8, 9 }; // et des colonnes Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); // char customKey = ' '; int iTailleNombre = 0; // // Divers // char cAfficheur = 'Z'; // Contiendra ensuite A ou B int iAfficheur = 0; // Contiendra ensuite 1 ou 2 // // // : ----------------------- : // : Pour l'afficheur a LEDS : // : ----------------------- : // TM1637Display displayA(CLKA, DIOA); // Afficheurs A TM1637Display displayB(CLKB, DIOB); // et B // // ! ===== ! // ! SETUP ! // ! ===== ! // void setup() { // // Pour le debogage // Serial.begin(9600); delay(1000); Serial.println("COMPTEURS"); Serial.println(" "); // // Lecture de l'EEPROM // // Les valeurs des deux nombres memorises lors de la derniere utilisations Serial.print("L'EEPROM 1 contient "); Serial.println(EEPROM.read(1)); Serial.print("L'EEPROM 2 contient "); Serial.println(EEPROM.read(2)); iNombreA = EEPROM.read(1) * 255 + EEPROM.read(2); Serial.print("Donc le nombre A est "); Serial.println(iNombreA); Serial.print("L'EEPROM 3 contient "); Serial.println(EEPROM.read(3)); Serial.print("L'EEPROM 4 contient "); Serial.println(EEPROM.read(4)); iNombreB = EEPROM.read(3) * 255 + EEPROM.read(4); Serial.print("Donc le nombre B est "); Serial.println(iNombreB); // Le dernier afficheur utilise Serial.print("L'EEPROM 5 contient "); Serial.println(EEPROM.read(5)); iAfficheur = EEPROM.read(5); Serial.print("Donc le dernier afficheur utilise est "); Serial.print(iAfficheur); Serial.print(" soit "); Serial.print(" "); if (iAfficheur == 1) { Serial.println("A"); cAfficheur = 'A'; displayA.setBrightness(7); displayB.setBrightness(0); } if (iAfficheur == 2) { Serial.println("B"); cAfficheur = 'B'; displayA.setBrightness(0); displayB.setBrightness(7); } // // Mise a zero a utiliser une seule fois // //EEPROM.write(1, 0); //EEPROM.write(2, 0); //EEPROM.write(3, 0); //EEPROM.write(4, 0); //EEPROM.write(5, 0); // // On affiche les nombres sans enregistrement // if (cAfficheur == 'A') { displayA.setBrightness(7); displayB.setBrightness(0); } if (cAfficheur == 'B') { displayA.setBrightness(0); displayB.setBrightness(7); } iMilliersA = iNombreA / 1000; iCentainesA = (iNombreA - iMilliersA * 1000) / 100; iDizainesA = (iNombreA - iMilliersA * 1000 - iCentainesA * 100) / 10; iUnitesA = iNombreA - iMilliersA * 1000 - iCentainesA * 100 - iDizainesA * 10; displayA.showNumberDec(iMilliersA, false, 1, 0); displayA.showNumberDec(iCentainesA, false, 1, 1); displayA.showNumberDec(iDizainesA, false, 1, 2); displayA.showNumberDec(iUnitesA, false, 1, 3); iMilliersB = iNombreB / 1000; iCentainesB = (iNombreB - iMilliersB * 1000) / 100; iDizainesB = (iNombreB - iMilliersB * 1000 - iCentainesB * 100) / 10; iUnitesB = iNombreB - iMilliersB * 1000 - iCentainesB * 100 - iDizainesB * 10; displayB.showNumberDec(iMilliersB, false, 1, 0); displayB.showNumberDec(iCentainesB, false, 1, 1); displayB.showNumberDec(iDizainesB, false, 1, 2); displayB.showNumberDec(iUnitesB, false, 1, 3); // // Le bouton // pinMode(iBouton, INPUT_PULLUP); } // // ! ==== ! // ! LOOP ! // ! ==== ! // void loop() { // // On teste les pressions sur le clavier // customKey = customKeypad.getKey(); // Une touche a ete pressee if (customKey) { if (customKey == 'A') // On vient de selectionner l'afficheur A { Serial.println("L'afficheur A vient d'etre selectionne."); cAfficheur = 'A'; } if (customKey == 'B') // ou le B { Serial.println("L'afficheur B vient d'etre selectionne."); cAfficheur = 'B'; } if (customKey == '*') // On vient de demander a saisir un des nombres { Serial.print("On vient de demander a regler l'afficheur "); // On met à zero l'afficheur concerne if (cAfficheur == 'A') { Serial.println(" A."); displayA.setBrightness(7); displayB.setBrightness(0); displayA.showNumberDec(0, false, 1, 0); displayA.showNumberDec(0, false, 1, 1); displayA.showNumberDec(0, false, 1, 2); displayA.showNumberDec(0, false, 1, 3); } if (cAfficheur == 'B') { Serial.println(" B."); displayA.setBrightness(0); displayB.setBrightness(7); displayB.showNumberDec(0, false, 1, 0); displayB.showNumberDec(0, false, 1, 1); displayB.showNumberDec(0, false, 1, 2); displayB.showNumberDec(0, false, 1, 3); } // On commence par saisir un nombre iTailleNombre = 0; while (iTailleNombre < 4) // Il faut quatre chiffres { customKey = customKeypad.getKey(); // On attend les quatre chiffres //Serial.print("Le caractere saisi est "); Serial.println(customKey); if ((customKey >= '0') && (customKey <= '9')) { iTailleNombre++; if ((iTailleNombre == 1) && (cAfficheur == 'A')) // Milliers de A { iMilliersA = (int)(customKey) - 48; displayA.showNumberDec(iMilliersA, false, 1, 0); Serial.print("Le caractere saisi pour les milliers de A est "); Serial.println(customKey); Serial.print("Le chiffres saisi pour les milliers de A est "); Serial.println(iMilliersA); } if ((iTailleNombre == 2) && (cAfficheur == 'A')) // Centaines de A { iCentainesA = (int)customKey - 48; displayA.showNumberDec(iCentainesA, false, 1, 1); Serial.print("Le caractere saisi pour les centaines de A est "); Serial.println(customKey); Serial.print("Le chiffres saisi pour les centaines de A est "); Serial.println(iCentainesA); } if ((iTailleNombre == 3) && (cAfficheur == 'A')) // Dizaines de A { iDizainesA = (int)customKey - 48; displayA.showNumberDec(iDizainesA, false, 1, 2); Serial.print("Le caractere saisi pour les dizaines de A est "); Serial.println(customKey); Serial.print("Le chiffres saisi pour les dizaines de A est "); Serial.println(iDizainesA); } if ((iTailleNombre == 4) && (cAfficheur == 'A')) // Unites de A { iUnitesA = (int)customKey - 48; displayA.showNumberDec(iUnitesA, false, 1, 3); Serial.print("Le caractere saisi pour les unites de A est "); Serial.println(customKey); Serial.print("Le chiffres saisi pour les unites de A est "); Serial.println(iUnitesA); } if ((iTailleNombre == 1) && (cAfficheur == 'B')) // Milliers de B { iMilliersB = (int)customKey - 48; displayB.showNumberDec(iMilliersB, false, 1, 0); Serial.print("Le caractere saisi pour les milliers de B est "); Serial.println(customKey); Serial.print("Le chiffres saisi pour les ccntaines de B est "); Serial.println(iMilliersB); } if ((iTailleNombre == 2) && (cAfficheur == 'B')) // Centaines de B { iCentainesB = (int)customKey - 48; displayB.showNumberDec(iCentainesB, false, 1, 1); Serial.print("Le caractere saisi pour les centaines de B est "); Serial.println(customKey); Serial.print("Le chiffres saisi pour les dizaines de B est "); Serial.println(iCentainesB); } if ((iTailleNombre == 3) && (cAfficheur == 'B')) // Dizaines de B { iDizainesB = (int)customKey - 48; displayB.showNumberDec(iDizainesB, false, 1, 2); Serial.print("Le caractere saisi pour les dizaines de B est "); Serial.println(customKey); Serial.print("Le chiffres saisi pour les unites de B est "); Serial.println(iDizainesB); } if ((iTailleNombre == 4) && (cAfficheur == 'B')) // Unites de B { iUnitesB = (int)customKey - 48; displayB.showNumberDec(iUnitesB, false, 1, 3); Serial.print("Le caractere saisi pour les unites de B est "); Serial.println(customKey); Serial.print("Le chiffres saisi pour les unites de B est "); Serial.println(iUnitesB); } customKey = ' '; if (cAfficheur == 'A') { iNombreA = iMilliersA * 1000 + iCentainesA * 100 + iDizainesA * 10 + iUnitesA; Serial.print("Le nombre A qui va etre enregistre est "); Serial.println(iNombreA); EEPROM.write(1, (int)(iNombreA / 255)); Serial.print("Dans l'EEPROM 1 il y a "); Serial.println((int)(iNombreA / 255)); EEPROM.write(2, iNombreA - EEPROM.read(1) * 255); Serial.print("Dans l'EEPROM 2 il y a "); Serial.println((int)(iNombreA - EEPROM.read(1) * 255)); EEPROM.write(5, 1); } if (cAfficheur == 'B') { iNombreB = iMilliersB * 1000 + iCentainesB * 100 + iDizainesB * 10 + iUnitesB; Serial.print("Le nombre B qui va etre enregistre est "); Serial.println(iNombreB); EEPROM.write(3, (int)(iNombreB / 255)); Serial.print("Dans l'EEPROM 3 il y a "); Serial.println((int)(iNombreB / 255)); EEPROM.write(4, iNombreB - EEPROM.read(3) * 255); Serial.print("Dans l'EEPROM 4 il y a "); Serial.println((int)(iNombreB - EEPROM.read(3) * 255)); EEPROM.write(5, 2); } } } } } if (cAfficheur == 'A') // On regle la brillance maximale sur l'afficheur A { displayA.setBrightness(7); displayB.setBrightness(0); } if (cAfficheur == 'B') // ou B { displayB.setBrightness(7); displayA.setBrightness(0); } if ((cAfficheur == 'A') || (cAfficheur == 'B')) { // On affiche les nombres sans enregistrement iMilliersA = iNombreA / 1000; iCentainesA = (iNombreA - iMilliersA * 1000) / 100; iDizainesA = (iNombreA - iMilliersA * 1000 - iCentainesA * 100) / 10; iUnitesA = iNombreA - iMilliersA * 1000 - iCentainesA * 100 - iDizainesA * 10; displayA.showNumberDec(iMilliersA, false, 1, 0); displayA.showNumberDec(iCentainesA, false, 1, 1); displayA.showNumberDec(iDizainesA, false, 1, 2); displayA.showNumberDec(iUnitesA, false, 1, 3); iMilliersB = iNombreB / 1000; iCentainesB = (iNombreB - iMilliersB * 1000) / 100; iDizainesB = (iNombreB - iMilliersB * 1000 - iCentainesB * 100) / 10; iUnitesB = iNombreB - iMilliersB * 1000 - iCentainesB * 100 - iDizainesB * 10; displayB.showNumberDec(iMilliersB, false, 1, 0); displayB.showNumberDec(iCentainesB, false, 1, 1); displayB.showNumberDec(iDizainesB, false, 1, 2); displayB.showNumberDec(iUnitesB, false, 1, 3); if (digitalRead(iBouton) == false) // Le gros bouton pour compter { if (cAfficheur == 'A') { iNombreA++; // On affiche le nombre avec enregistrement iMilliersA = iNombreA / 1000; iCentainesA = (iNombreA - iMilliersA * 1000) / 100; iDizainesA = (iNombreA - iMilliersA * 1000 - iCentainesA * 100) / 10; iUnitesA = iNombreA - iMilliersA * 1000 - iCentainesA * 100 - iDizainesA * 10; displayA.showNumberDec(iMilliersA, false, 1, 0); displayA.showNumberDec(iCentainesA, false, 1, 1); displayA.showNumberDec(iDizainesA, false, 1, 2); displayA.showNumberDec(iUnitesA, false, 1, 3); iNombreA = iMilliersA * 1000 + iCentainesA * 100 + iDizainesA * 10 + iUnitesA; Serial.print("Le nombre A qui va etre enregistre est "); Serial.println(iNombreA); EEPROM.write(1, (int)(iNombreA / 255)); Serial.print("Dans l'EEPROM 1 il y a "); Serial.println((int)(iNombreA / 255)); EEPROM.write(2, iNombreA - EEPROM.read(1) * 255); Serial.print("Dans l'EEPROM 2 il y a "); Serial.println((int)(iNombreA - EEPROM.read(1) * 255)); EEPROM.write(5, 1); } if (cAfficheur == 'B') { iNombreB++; // On affiche le nombre avec enregistrement iMilliersB = iNombreB / 1000; iCentainesB = (iNombreB - iMilliersB * 1000) / 100; iDizainesB = (iNombreB - iMilliersB * 1000 - iCentainesB * 100) / 10; iUnitesB = iNombreB - iMilliersB * 1000 - iCentainesB * 100 - iDizainesB * 10; displayB.showNumberDec(iMilliersB, false, 1, 0); displayB.showNumberDec(iCentainesB, false, 1, 1); displayB.showNumberDec(iDizainesB, false, 1, 2); displayB.showNumberDec(iUnitesB, false, 1, 3); iNombreB = iMilliersB * 1000 + iCentainesB * 100 + iDizainesB * 10 + iUnitesB; Serial.print("Le nombre B qui va etre enregistre est "); Serial.println(iNombreB); EEPROM.write(3, (int)(iNombreB / 255)); Serial.print("Dans l'EEPROM 3 il y a "); Serial.println((int)(iNombreB / 255)); EEPROM.write(4, iNombreB - EEPROM.read(3) * 255); Serial.print("Dans l'EEPROM 4 il y a "); Serial.println((int)(iNombreB - EEPROM.read(3) * 255)); EEPROM.write(5, 2); } delay(2000); } } }