Advertisement
Ollivier

Chronometre a decompte port serie

Mar 30th, 2020
378
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 16.82 KB | None | 0 0
  1.  
  2. // --------------------------------------------
  3. // Chronomètre à rebourd avec saisie
  4. // --------------------------------------------
  5. // Chronomètre à affichage digital sur
  6. // afficheur 4 digits rouges OCTOPUS EF04056
  7. // https://www.elecfreaks.com/learn-en/microbitOctopus/sensor/octopus_ef04056.html
  8. // avec buzzer pour compte à reboud, feu et fin
  9. // Module buzzer Gravity DFR0032
  10. // https://wiki.dfrobot.com/Digital_Buzzer_Module__SKU__DFR0032_
  11. // possibilité de saisie de nouveau temps par
  12. // le port série.
  13. // --------------------------------------------
  14.  
  15. // --------------------------------------------
  16. // Instructions de montage --------------------
  17. // --------------------------------------------
  18. // Afficheur 7 digits 4 segments D8 (CLK),
  19. // D3 (DIO), 5V et Gr.
  20. // Buzzer en D4 3.3V et Gr.
  21. // --------------------------------------------
  22.  
  23. // --------------------------------------------
  24. // Fonctionnement -----------------------------
  25. // --------------------------------------------
  26. // le chronomètre fait un comte à rebourd de 5s
  27. // avant de se lancer accompagné de 4 bip + un
  28. // bip différent pour "FEU"
  29. // Le chronomètre fait un troisième bip quand
  30. // le compte à rebourd est à 0.
  31. // Le temps par défaut est de 15 secondes.
  32. // pour faire un compte à rebourd de 15 s,
  33. // appuyer sur le bouton reset de l'Arduino
  34. // (ou compatible).
  35. // Pour changer le tenps par défaut changer
  36. // la valeur de la variable temps.
  37. // --------------------------------------------
  38.  
  39.  
  40. #include <TM1637Display.h>                      // on va chercher la bibliothèque
  41.  
  42. // DIGIT 7 Segments                             // composition d'un afficheur digital
  43.  
  44. //    ┌--A--┐
  45. //    F      B
  46. //    ├--G--┤
  47. //    E      C
  48. //    └--D--┘
  49.  
  50. // ---------------
  51.  
  52. #define CLK 8                                   // on définit le pin de connexion sur lequel est CLK
  53. #define DIO 3                                   // on définit le pin de connexion sur lequel est DIO
  54.  
  55. TM1637Display display(CLK, DIO);                // on initialise l'afficheur
  56.  
  57. uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };    // on déclare le tableau des valeurs à afficher
  58.  
  59. int k;                                          // variable qui servira pour les boucles
  60. unsigned long raz;                              // variable qui sera le tempon pour le chrono
  61. int temps = 15;                                 // temps par défaut du chronomètre
  62. bool chronoTourne;                              // variable qui dit si le chrono tpurne ou pas
  63. char valeurSerial;                              // variable contenant la donnée reçue du port série
  64. bool receptionSerial = false;                   // variable qui dit si on reçoit des données du port série ou non
  65. String recu = "";                               // variable contenant la chaine des caractères reçus par le port série
  66. const int buzzer = 4;                           // variable qui contien le port sur lequel est le buzzer
  67. const int duree = 200;                          // variable qui contient la fréquence du buzzer pour le compte à rebourd
  68. const int duree2 = 189;                         // variable qui contient la fréquence du buzzer pour la fin
  69. const int duree3 = 250;                         // variable qui contient la fréquence du buzzer pour le feu
  70. int buzz = 0;                                   // variable qui dit si le feu a été donné ou non
  71. int cRebourd = 1;                               // variable qui dit si le compte à rebourd à été fait ou non
  72. int longueurCompt = 0;                          // variable qui va permettre d'afficher l'avancée du chrono sur le moniteur série
  73. unsigned long ajoutTot;
  74.  
  75. // --------------------------------------------------------------------------------
  76. // SETUP () -----------------------------------------------------------------------
  77. // --------------------------------------------------------------------------------
  78.  
  79. void setup() {                                  // SET UP *************************************
  80.  
  81.   Serial.begin(9600);                           // on initialise la communication avec le PC par le port série
  82.   pinMode(buzzer, OUTPUT);                      // définition du buzzer en sortie
  83.  
  84.   /* la suite c'est juste pour faire style, pour animer le moniteur série */
  85.  
  86.   MS_barreHoriz ();                             // Mise en page moniteur série
  87.   MS_centreTexteCadre ("Initialisation en cours"); // on affiche le message
  88.  
  89.   MS_fauxChargement ();                         // fausse pogression de l'initialisation
  90.  
  91.   MS_centreTexteCadre ("Initialisation  OK !"); // on affiche le message
  92.   MS_barreHoriz ();                             // Mise en page moniteur série
  93.  
  94.   delay (250);                                  // pause de 0.25 s
  95.  
  96.   MS_nouveauTemps ("        Temps : ");         // on affiche le temps sur le moniteur série
  97.  
  98.   initialisation ();                            // on lance la fonction initailisation ()
  99.   raz = millis ();                              // on réinitialise le seuil du temps (tampon)
  100.  
  101. }
  102.  
  103. // --------------------------------------------------------------------------------
  104. // LOOP () ------------------------------------------------------------------------
  105. // --------------------------------------------------------------------------------
  106.  
  107. void loop(){                                    // LOOP ***************************************
  108.  
  109.  
  110.  
  111.   chronometre ();                               // on lance la fonction chronomètre
  112.  
  113.  
  114.  
  115. }
  116.  
  117. // --------------------------------------------------------------------------------
  118. // Fonctions ----------------------------------------------------------------------
  119. // --------------------------------------------------------------------------------
  120.  
  121. // --------------------------------------------
  122. // Fausse initialisation / compte à rebourd ---
  123. // --------------------------------------------
  124.  
  125. void initialisation () {
  126.  
  127.   display.clear();                                // on efface les donnée à afficher
  128.   delay(10);                                      // pause de 10 ms
  129.  
  130.   for ( k = 0 ; k < 4 ; k++ ) {                   // on tourne de façon croissante sur le 4 niveaux de luminosité
  131.  
  132.     display.setBrightness(k);                     // on note la valeur de l'intensité de la luminosité des digits
  133.  
  134.     display.showNumberDec( 4 - k, false, 1, 3 - k); // on affiche la valeur 3-k sur le digit 4-k
  135.  
  136.     bipBuzzer (250, duree);                       // on fait sonner le BIP de compte à rebours
  137.  
  138.     delay(1000);                                  // pause 1 s
  139.  
  140.     display.clear();                              // on efface les donnée à afficher
  141.    
  142.   }
  143.  
  144.   bipBuzzer (500, duree3);                        // on fait sonner le BIP de feu
  145.  
  146.   MS_barreHoriz ();                               // Mise en page moniteur série
  147.   MS_centreTexteCadre ("Décompte en cours...");   // on affiche le message
  148.   MS_barreHoriz ();                               // Mise en page moniteur série
  149. }
  150.  
  151. // --------------------------------------------
  152. // Fonction du chronomètre --------------------
  153. // --------------------------------------------
  154.  
  155. void chronometre () {
  156.  
  157. // --------------------------------------------
  158. // Si le chrono TOURNE ------------------------
  159.  
  160. // --------------------------------------------
  161. // Si le chrono FINIT -------------------------
  162.  
  163.   if ( ( millis() - raz ) > ( temps * 1000UL ) ) {  // si le temps écoulé du chrono est > que le temps (max) * 1000UL (UL pour le forcer à calculer en uint32_t, sinon, il calcule en uint13_t par défaut)
  164.  
  165.     cRebourd = 0;                                 // on dit que le compte à rebourd n'est pas fait
  166.  
  167.     display.showNumberDecEx( temps * 100, 0b01000000, false, 4 , 0 ); // on affiche la valeur du temps fini
  168.  
  169.     if ( buzz == 0 ) {                            // si le buzz feu n'a pas sonné
  170.  
  171.       bipBuzzer (1000, duree2);                   // on fait le BIP de fin
  172.  
  173.       buzz = 1;                                   // on dit que le buzz feu a sonné
  174.       chronoTourne = false;                       // on dit que le chronmètre ne tourne plus
  175.       longueurCompt = 0;                          // on remet à zéro le compteur de progression
  176.  
  177.       Serial.println ();                          // retour à la ligne
  178.       MS_barreHoriz ();                           // Mise en page moniteur série
  179.       MS_centreTexteCadre ("Décompte terminé !"); // on affiche le message
  180.       MS_barreHoriz ();                           // Mise en page moniteur série
  181.     }
  182.  
  183. // --------------------------------------------
  184. // Si le chrono n'est PAS FINI ----------------
  185.    
  186.   } else {                                        // si le temps écoulé du chrono est < que le temps (max) * 1000
  187.     if ( cRebourd == 0 ) {                        // si le compte à rebourd n'a pas été fait
  188.  
  189.       initialisation ();                          // on lance la fonction initialisation (compte à rebourd)
  190.       raz = millis ();                            // on réinitialise le seuil du temps (tampon)
  191.       cRebourd = 1;                               // on dit que le compte à rebourd a été fait
  192.  
  193.     }
  194.    
  195.     display.showNumberDecEx(( millis() - raz ) / 10, 0b01000000, false, 4 , 0); // on affiche le temps écoulé
  196.  
  197. // Rajout d'une "boucle" pour afficher la progression sur le moniteur série
  198.  
  199.   ajoutTot = ( ( millis () - raz) * 28 ) / (temps * 1000UL); // on calcule le nombre de barre qui doivent être affichées (UL pour le forcer à calculer en uint32_t, sinon, il calcule en uint16_t par défaut)
  200.  
  201.   for ( int i = 0 ; i < ( ajoutTot - longueurCompt ) ; i++){  // tourne tant qu'il n'a pas ajouté tout ce qui manque
  202.  
  203.     Serial.write ( "|" );                         // affiche "|" sur le moniteur série
  204.     longueurCompt += 1 ;                          // on incrémente la longueur affichée de 1
  205.  
  206.   }
  207.  
  208.     chronoTourne = true;                          // on dit que le chrono tourne encore
  209.     recu = "";                                    // on réinitialise les valeurs reçues
  210.    
  211.   }
  212.  
  213. // ------------------------------------------------------
  214. // Si le chrono NE TOURNE PAS ---------------------------
  215.  
  216.   if ( chronoTourne == false ) {                  // si le chrono ne tourne pas
  217.  
  218. // --------------------------------------------
  219. // Si on RECOIT du port série -----------------
  220.    
  221.     if ( Serial.available() ) {                   // si on reçoit des données du port série
  222.  
  223.       valeurSerial = Serial.read();               // la variable valeurSerial prend la valeur de ce qui est reçu
  224.  
  225.       if ( valeurSerial > 47 && valeurSerial < 59 ){ // si la valeur reçue est un chiffre entre 0 et 9
  226.                                                   // valeurs en Decimal https://upload.wikimedia.org/wikipedia/commons/d/dd/ASCII-Table.svg
  227.         Serial.println ();                        // retour à la ligne
  228.         MS_barreHoriz ();                         // Mise en page moniteur série
  229.         Serial.write ("| - Réception port série - |");  // on affiche le message sur le moniteur série
  230.         Serial.println ();                        // retour à la ligne
  231.         MS_barreHoriz ();                         // Mise en page moniteur série
  232.         MS_valeursRecues ();                      // on affiche le message sur le moniteur série
  233.         MS_barreHoriz ();                         // Mise en page moniteur série
  234.         MS_centreTexteCadre ("****");             // on affiche le message sur le moniteur série
  235.         Serial.println ();                        // retour à la ligne
  236.  
  237.       }
  238.  
  239.       if ( receptionSerial == false ) {           // Si on ne recevait rien du port série avant, ...
  240.  
  241.         receptionSerial = true;                   // on dit qu'on reçoit des valeurs du port série
  242.  
  243.       }
  244.  
  245.       recu += valeurSerial;                       // on ajoute la valeur reçue à la chaine de caractère recu
  246.  
  247. // --------------------------------------------
  248. // Si on NE RECOIT PAS du port série ----------
  249.      
  250.     } else {                                      // si on ne reçoit rien
  251.  
  252.       if (receptionSerial == true) {              // si on recevait des données du port série avant, ...
  253.  
  254.         receptionSerial = false;                  // on dit qu'on en reçoit plus
  255.         raz = millis ();                          // on réinitialise le seuil du temps (tampon)
  256.         temps = ( recu.toInt() );                 // on transforme la chaine de caractères reçue en valeur numérique entière
  257.         buzz = 0;                                 // on dit que le buzzer n'a pas sonné
  258.  
  259.         MS_nouveauTemps ("    Nouveau temps : "); // on affiche le nouveau temps a chronométrer sur le moniteur série
  260.  
  261.       }
  262.     }
  263.   }
  264. }
  265.  
  266. // --------------------------------------------
  267. // Fonctions activation Buzzer ----------------
  268. // --------------------------------------------
  269.  
  270. void bipBuzzer (int longu, int freq){
  271.  
  272.   for (int i = 0; i < longu; i++) {                 // début du bip fin du buzzer
  273.  
  274.     digitalWrite( buzzer, HIGH );                   // on allume le buzzer...
  275.     delayMicroseconds( freq );                      // pendant 189 ms
  276.  
  277.     digitalWrite( buzzer, LOW );                    // on éteind le buzzer...
  278.     delayMicroseconds( freq );                      // pendant 189 ms
  279.  
  280.   }
  281. }
  282.  
  283. // --------------------------------------------------------------------------------
  284. // Fonctions Moniteur Série -------------------------------------------------------
  285. // --------------------------------------------------------------------------------
  286.  
  287. // --------------------------------------------
  288. // Fonction chargement ------------------------
  289. // --------------------------------------------
  290. void MS_fauxChargement (){
  291.  
  292.   for (int i = 0 ; i <= 27 ; i++) {               // fausse pogression de l'initialisation
  293.  
  294.     Serial.write ("|");                           // affiche des "|"
  295.     delay (1000 / 28);                            // 28 "|" en 1 seconde
  296.  
  297.   }
  298.   Serial.println ();                              // retour à la ligne
  299. }
  300.  
  301. // --------------------------------------------
  302. // Fonction barre horizontale -----------------
  303. // ( Mise en page du moniteur série ) ---------
  304. // --------------------------------------------
  305.  
  306. void MS_barreHoriz (){
  307.  
  308.   Serial.write ("| ------------------------ |");  // mise en page du message affiché sur le moniteur série
  309.   Serial.println ();                              // retour à la ligne
  310.  
  311. }
  312.  
  313. // --------------------------------------------
  314. // centrage de texte dans un cadre ------------
  315. // ( Mise en page du moniteur série ) ---------
  316. // --------------------------------------------
  317.  
  318. void MS_centreTexteCadre (String texte){
  319.  
  320.   for (int i = 0 ; i <  int(( 28 - texte.length() )/ 2 ) ; i ++){
  321.     Serial.write ( " " );
  322.   }
  323.  
  324.   Serial.println (texte);
  325.  
  326. }
  327.  
  328. // --------------------------------------------
  329. // affichage Nouveau temps --------------------
  330. // ( Mise en page du moniteur série ) ---------
  331. // --------------------------------------------
  332.  
  333. void MS_nouveauTemps (String texte){
  334.  
  335.   Serial.println ();                        // retour à la ligne
  336.   Serial.print (texte);                     // on affiche "Nouveau temps : " sur le moniteur série
  337.   Serial.print (temps);                     // on affiche la valeur du nouveau temps sur le port série
  338.   Serial.write (" s");                      // on affiche " s" sur le moniteur série
  339.   Serial.println ();                        // retour à la ligne
  340.   Serial.println ();                        // retour à la ligne
  341.  
  342. }
  343.  
  344. // --------------------------------------------
  345. // affichage Valeurs reçues -------------------
  346. // ( Mise en page du moniteur série ) ---------
  347. // --------------------------------------------
  348.  
  349. void MS_valeursRecues (){
  350.  
  351.         Serial.write ("      Valeur reçue : ");   // on ecrit "Valeur reçue : " sur le moniteur série
  352.         Serial.println ( valeurSerial );          // on écrit la valeur de la variable valeurSerial
  353.  
  354. }
  355.  
  356. // --------------------------------------------
  357. // Suite du projet ----------------------------
  358. // --------------------------------------------
  359. // Mettre des sécurités / vérifications au cas
  360. // ou les valeurs entrées ne soient pas des
  361. // chiffres.
  362. // --------------------------------------------
  363. // Rajouter un clavier ou en faire un avec des
  364. // boutons poussoirs et remplacer la saisie en
  365. // port série par la saisie sur le clavier.
  366. // C'est peut être même + simple à programmer.
  367. // --------------------------------------------
  368. // Dynamiser un peu plus le projet pour pouvoir
  369. // fait des comptes à rebourd de + de 99.99s.
  370. // Pour ça, il faut déplacer le point de façon
  371. // dynamique. Il faudra faire une fonction
  372. // avec des arguments et des tests de longueur
  373. // de la valeur "temps", avant.
  374. // --------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement