Advertisement
Ollivier

Ajustement horloge DeLorean pas BP v2

Apr 4th, 2020
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.47 KB | None | 0 0
  1. // --------------------------------------------------------------------------------
  2. // Ecran BACK TO THE FUTURE _ Ajustement par BP v2
  3. // --------------------------------------------------------------------------------
  4. // Objectif : créer un affichage type "Retour vers le Futur"
  5. // https://media.giphy.com/media/dgEIhYAo3lZiE/giphy.gif
  6. // avec possibilité d'ajuster la date avec des boutons poussoirs
  7. // A ma disposition :
  8. // https://www.elecfreaks.com/learn-en/microbitOctopus/sensor/octopus_ef04056.html
  9. // Quatre boutons poussoirs DFR0075W
  10. // https://wiki.dfrobot.com/DFRobot_Digital_Push_Button_SKU_DFR0029#Sample_Code
  11. // Un bouton poussoir "classique"
  12. // https://www.gotronic.fr/art-assortiment-de-15-bp-ronds-ad1009-19588.htm
  13. // sur Arduino Uno
  14. // Librairie Wire
  15. // https://www.arduino.cc/en/reference/wire
  16. // https://www.locoduino.org/spip.php?article77
  17. // Librairies TM1637Display
  18. // Téléchargement : https://github.com/avishorp/TM1637
  19. // Références : https://sminghub.github.io/Sming/api/classTM1637Display.html
  20. // ---------------------------------------------------------------------------------
  21.  
  22. // ---------------------------------------------------------------------------------
  23. // Instructions de montage ---------------------------------------------------------
  24. // ---------------------------------------------------------------------------------
  25. // Afficheur 7 digits 4 segments OCTOPUS EF04056
  26. // ---------------------------------------------------------------------------------
  27. // D9 (CLK)
  28. // D8 (DIO)
  29. // 5V
  30. // GND
  31. // ---------------------------------------------------------------------------------
  32.  
  33. // ---------------------------------------------------------------------------------
  34. // Boutons poussoirs DFR0075 -------------------------------------------------------
  35. // ---------------------------------------------------------------------------------
  36. // D7, D6, D5, D4
  37. // 5V
  38. // Gnd
  39. // ---------------------------------------------------------------------------------
  40.  
  41. // ---------------------------------------------------------------------------------
  42. // Bouton poussoir classique
  43. // ---------------------------------------------------------------------------------
  44. // D3
  45. // 5V
  46. // GND
  47. // ---------------------------------------------------------------------------------
  48.  
  49. // Chargement des librairies nécessaires -------------------------------------------
  50.  
  51. #include <Wire.h>                           // Librairie de câblage simplifié (??)
  52. #include <TM1637Display.h>                  // Librairie d'affichage pour afficheur LCD OCTOPUS EF04056
  53.  
  54. // ---------------------------------------------------------------------------------
  55. // Afficheur LCD Octopus EF04056
  56. // ---------------------------------------------------------------------------------
  57.  
  58. // on définit le pin de connexion sur lequel est CLK
  59. #define CLK 9
  60. // on définit le pin de connexion sur lequel est DIO
  61. #define DIO 8
  62.  
  63. int annee = 1974;
  64. uint8_t positionPoint ;
  65. // on crée le tableau contenant les positions su point
  66. const uint8_t posPoint[4] = {0b10000000 , 0b01000000, 0b00100000, 0b00010000};
  67. // Complément :
  68. // 0b10000000 – 0.000
  69. // 0b01000000 – 00.00
  70. // 0b00100000 – 000.0
  71. // 0b00010000 – 0000.
  72. // 0b11110000 – 0.0.0.0.
  73. // 0x40 - 00:00 <= pour les afficheurs avec ":" au centre
  74.  
  75. int curseur = 0;
  76.  
  77. // on initialise l'afficheur
  78. TM1637Display display(CLK, DIO);
  79.  
  80. // --------------------------------------------------------------------------------------------------------
  81. // boutons
  82. // --------------------------------------------------------------------------------------------------------
  83.  
  84. int boutonPlus = 7;
  85. int boutonMoins = 4;
  86. int boutonDroite = 5;
  87. int boutonGauche = 6;
  88.  
  89. int boutonSelect = 3;
  90.  
  91. bool etatBoutPlus = 0;
  92. bool etatBoutMoins = 0;
  93. bool etatBoutDroite = 0;
  94. bool etatBoutGauche = 0;
  95.  
  96. bool etatBoutSelect = 0;
  97.  
  98. int cle = 0;
  99. bool select = 0;
  100.  
  101. void setup() {
  102.  
  103.   Serial.begin(9600);               // on initialise et synchronise la communication entre le PC et Arduino
  104.   for (int i = 3 ; i <= 7 ; i++) {
  105.     pinMode (i, INPUT);             // on définit les pin 3 à 7 comme des entrées
  106.   }
  107.   // on vide l'écran
  108.   display.clear();
  109.   // on met la luminosité au max
  110.   display.setBrightness(3);
  111.   // on affiche la date par défaut (variable annee)
  112.   display.showNumberDecEx(annee, false, false, 4, 0);
  113.  
  114. }
  115.  
  116. void loop() {
  117.  
  118.   // on lance la fonction de reset pour l'affichage
  119.   ajustAffichage ();
  120.  
  121. }
  122.  
  123. // --------------------------------------------------------------------------------------------------------
  124. // - Fonctions -------------------------------------------------------------------------------- Fonctions -
  125. // --------------------------------------------------------------------------------------------------------
  126.  
  127. void ajustAffichage() {
  128.  
  129.   // on affiche dans le moniteur série
  130.   Serial.println ("------------");
  131.   // on lit l'état du bouton Select
  132.   etatBoutSelect = digitalRead (boutonSelect);
  133.   // on affiche dans le moniteur série
  134.   Serial.print ("Select :");
  135.   Serial.println (etatBoutSelect);
  136.   // on lit l'état du bouton Plus
  137.   etatBoutPlus = digitalRead (boutonPlus);
  138.   // on affiche dans le moniteur série
  139.   Serial.print ("Plus :");
  140.   Serial.println (etatBoutPlus);
  141.   // on lit l'état du bouton Moins
  142.   etatBoutMoins = digitalRead (boutonMoins);
  143.   // on affiche dans le moniteur série
  144.   Serial.print ("Moins :");
  145.   Serial.println (etatBoutMoins);
  146.   // on lit l'état du bouton Droite
  147.   etatBoutDroite = digitalRead (boutonDroite);
  148.   // on affiche dans le moniteur série
  149.   Serial.print ("Droite :");
  150.   Serial.println (etatBoutDroite);
  151.   // on lit l'état du bouton Gauche
  152.   etatBoutGauche = digitalRead (boutonGauche);
  153.   // on affiche dans le moniteur série
  154.   Serial.print ("Gauche :");
  155.   Serial.println (etatBoutGauche);
  156.   // si pas de bouton actif (tous relachés)(cle = 0)
  157.   if (cle == 0) {
  158.     // si le boutons Select est enfoncé (actif)
  159.     if (etatBoutSelect == 1) {
  160.       cle = 1;
  161.       // ou si le boutons Plus est enfoncé (actif)
  162.     } else if (etatBoutPlus == 1) {
  163.       cle = 2;
  164.       // si le boutons Moins est enfoncé (actif)
  165.     } else if (etatBoutMoins == 1) {
  166.       cle = 3;
  167.       // si le boutons Droite est enfoncé (actif)
  168.     } else if (etatBoutDroite == 1) {
  169.       cle = 4;
  170.       // si le boutons Gauche est enfoncé (actif)
  171.     } else if (etatBoutGauche == 1) {
  172.       cle = 5;
  173.     }
  174.     // on affiche dans le moniteur série
  175.     Serial.println ();
  176.     Serial.print ("Clé :");
  177.     Serial.println (cle);
  178.     Serial.println ("------------");
  179.     //cle = 0;
  180.     delay (100);
  181.     //delay (2000);  // à utiliser pour que l'affichage sue le  moniteur série soit lisible
  182.     // ATTENTION faut appuyer 4 secondes sur les bouton pour que ca marche
  183.     // avec 2000
  184.     // si un bouton etait actif (enfoncé)(cle != 0)
  185.   } else {
  186.     switch (cle) {
  187.       // si on vient de cliquer sur Select
  188.       case 1:
  189.         // on affiche dans le moniteur série
  190.         Serial.println("Bouton Select !!");
  191.         // si on est pas en mode Select
  192.         if (select == 0) {
  193.           // on affiche l'année avec le point en premier caractère
  194.           afficheAnnee();
  195.           // on passe en mode Select
  196.           select = 1;
  197.           // sinon si on est pas en mode Select
  198.         } else {
  199.           // on vide l'écran
  200.           afficheDate ();
  201.           // on sort du mode Select
  202.           select = 0;
  203.         }
  204.         //on passe à la fin du "switch"
  205.         break;
  206.       // si on vient de cliquer sur Plus
  207.       case 2:
  208.         // on affiche dans le moniteur série
  209.         Serial.println("Bouton Plus");
  210.         // si on est en mode Select (seulement)
  211.         if (select == 1) {
  212.           // on fait + 1 sur le chiffre sélectionné (celui qui a le point)
  213.           plusUn();
  214.         }
  215.         //on passe à la fin du "switch"
  216.         break;
  217.       // si on vient de cliquer sur Moins
  218.       case 3:
  219.         // on affiche dans le moniteur série
  220.         Serial.println("Bouton Moins");
  221.         // si on est en mode Select (seulement)
  222.         if (select == 1) {
  223.           // on fait - 1 sur le chiffre sélectionné (celui qui a le point)
  224.           moinsUn ();
  225.         }
  226.         //on passe à la fin du "switch"
  227.         break;
  228.       // si on vient de cliquer sur Droite
  229.       case 4:
  230.         // on affiche dans le moniteur série
  231.         Serial.println("Bouton Droite !!");
  232.         // si on est en mode Select (seulement)
  233.         if (select == 1) {
  234.           // on décale le point vers la droite (chiffre sélectionné)
  235.           aDroite();
  236.         }
  237.         //on passe à la fin du "switch"
  238.         break;
  239.       // si on vient de cliquer sur Gauche
  240.       case 5:
  241.         // on affiche dans le moniteur série
  242.         Serial.println("Bouton Gauche !!");
  243.         // si on est en mode Select (seulement)
  244.         if (select == 1) {
  245.           // on décale le point vers la gauche (chiffre sélectionné)
  246.           aGauche ();
  247.         }
  248.         //on passe à la fin du "switch"
  249.         break;
  250.     }
  251.     // on désactive tous les boutons
  252.     cle = 0;
  253.     // petite pause café
  254.     delay (100);
  255.     // delay (2000);  // à utiliser pour que l'affichage sur le Moniteur série soit lisible
  256.     // ATTENTION faut appuyer 4 secondes sur les bouton pour que ca marche
  257.     // avec 2000
  258.   }
  259. }
  260.  
  261. void afficheAnnee () {
  262.  
  263.   // on prépare l'écran
  264.   initEcran ();
  265.  
  266.   // on détermine la position du curseur en marquant le point
  267.   positionPoint = posPoint[0];
  268.   //on indique que le point est en 0 (point sur le premier chiffre)
  269.   curseur = 0;
  270.  
  271.   // on affiche
  272.   display.showNumberDecEx(annee, positionPoint, false, 4, 0);
  273. }
  274.  
  275. void aDroite () {
  276.   // on prépare l'écran
  277.   initEcran ();
  278.  
  279.   // on détermine la position du curseur en marquant le point
  280.   // si le curseur n'est pas sur le quatrième chiffre
  281.   if (curseur < 3) {
  282.     // on décale la position d'un chiffre sur la droite
  283.     curseur += 1;
  284.     // si le curseur est sur le quatrième chiffre
  285.   } else {
  286.     // on remet le point sur le premier chiffre
  287.     curseur = 0;
  288.   }
  289.   // on indique la nouvelle position du point
  290.   positionPoint = posPoint[curseur];
  291.  
  292.   // on affiche
  293.   display.showNumberDecEx(annee, positionPoint, false, 4, 0);
  294. }
  295.  
  296. void aGauche () {
  297.   // on prépare l'écran
  298.   initEcran ();
  299.  
  300.   // on détermine la position du curseur en marquant le point
  301.   if (curseur > 0) {
  302.     curseur -= 1;
  303.   } else {
  304.     curseur = 3;
  305.   }
  306.   positionPoint = posPoint[curseur];
  307.  
  308.   // on affiche
  309.   display.showNumberDecEx(annee, positionPoint, false, 4, 0);
  310. }
  311.  
  312. void plusUn () {
  313.   // on prépare l'écran
  314.   initEcran ();
  315.  
  316.   // Attention cette méthode est un peu barbare, on peut faire mieux.
  317.   // on détermine la position du curseur en marquant le point
  318.   // si le point se trouve sur le quatrième caractère
  319.   if (curseur == 3) {
  320.     // on fait +1 à la date
  321.     annee += 1;
  322.     // sinon si le point se trouve sur le troisième caractère
  323.   } else if (curseur == 2) {
  324.     // on fait +10 à la date
  325.     annee += 10;
  326.   } else if (curseur == 1) {
  327.     // on fait +100 à la date
  328.     annee += 100;
  329.     // si le point est sur le premier chiffre
  330.   } else if (curseur == 0) {
  331.     //si le premier chiffe n'est pas un 9
  332.     if (annee <= 9000) {
  333.       // on fait +1000 à la date
  334.       annee += 1000;
  335.       // si le premier chiffre est un 9
  336.     } else {
  337.       // on fait -9000 à la date
  338.       annee -= 9000;
  339.     }
  340.   }
  341.   // on indique la nouvelle position du point
  342.   positionPoint = posPoint[curseur];
  343.  
  344.   // on affiche
  345.   display.showNumberDecEx(annee, positionPoint, false, 4, 0);
  346. }
  347.  
  348. void moinsUn () {
  349.   // prépare l'écran
  350.   initEcran();
  351.  
  352.   // on détermine la position du curseur en marquant le point
  353.   if (curseur == 3) {
  354.     annee -= 1;
  355.   } else if (curseur == 2) {
  356.     annee -= 10;
  357.   } else if (curseur == 1) {
  358.     annee -= 100;
  359.   } else if (curseur == 0) {
  360.     if (annee >= 1000) {
  361.       annee -= 1000;
  362.     } else {
  363.       annee += 9000;
  364.     }
  365.   }
  366.   positionPoint = posPoint[curseur];
  367.  
  368.   // on affiche
  369.   display.showNumberDecEx(annee, positionPoint, false, 4, 0);
  370. }
  371.  
  372. // Affichage sans mode Select
  373. void afficheDate () {
  374.   // on vide l'écran
  375.   display.clear();
  376.   // on met la luminosité au max
  377.   display.setBrightness(3);
  378.   // on affiche la date par défaut (variable annee)
  379.   display.showNumberDecEx(annee, false, false, 4, 0);
  380. }
  381.  
  382. void initEcran () {
  383.   // on efface les donnée à afficher
  384.   display.clear();
  385.  
  386.   // on règle la luminosité à la moitié
  387.   display.setBrightness(1);
  388. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement