Advertisement
Ollivier

date heure temp hum LCD 4x20

Aug 13th, 2020 (edited)
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 31.92 KB | None | 0 0
  1. /* ================================================================================================== */
  2. // KRONOS 1.0
  3. /* ================================================================================================== */
  4. // à voir => chaînes formatées
  5. /* ================================================================================================== */
  6. // Calendrier / Pendule / thermomètre / hygromètre
  7. // Affichage multimode sur ecran LCD 1 couleur (bleu) 20x4
  8. // RTC 1603 (RTC)
  9. // SHT15  (Capteur humidité / hygrométrie)
  10. // Module 5 boutons (analogique) DFR0075 https://wiki.dfrobot.com/ADKeyboard_Module__SKU__DFR0075_
  11. // Arduino Nano
  12. // Afficheur LCD I2C 4X20 caractères
  13. //  https://www.gotronic.fr/pj2-sbc-lcd20x4-fr-1440.pdf
  14. //  https://www.gotronic.fr/pj2-pcf8574-3-1516.pdf
  15. //  https://www.gotronic.fr/pj2-lcd2004-1515.pdf
  16. /* ================================================================================================== */
  17.  
  18. /* ================================================================================================== */
  19. // Ce "truc" possède 4 modes (ecran) d'affichages de la date, l'heure,
  20. /* ================================================================================================== */
  21. //----------------------------------------------------------------------------------------------------------
  22. // IMPORTATION DES BIBLIOTHEQUES                                                                            |
  23. //----------------------------------------------------------------------------------------------------------
  24. #include <Wire.h>                                       // chargement de la bibliothèque de gestion simplifiée du cablage (I2C)
  25. #include <DS1307.h>                                     // chargement de la bibliothèque de gestion du module RTC (Real Time Clock)
  26. #include <SHT1x.h>                                      // chargement de la bibliothèque de gestion du module temperature humidité sht15
  27. #include <LiquidCrystal_I2C.h>                          // chargement de la bibliothèque de gestion de l'ecran 4x20 I2C
  28.  
  29. LiquidCrystal_I2C lcd(0x27, 20, 4);                     // instanciation de l'occurence lcd() de l'objet LiquidCrystal_I2C
  30.  
  31. #define dataPin  10                                     // pin digital de connexion data Senseur SHT15
  32. #define clockPin 11                                     // pin digital de connexion SCK Senseur SHT15
  33. SHT1x sht15(dataPin, clockPin);                         // instanciation de l'occurence sht15() de l'objet SHT1x
  34.  
  35. //----------------------------------------------------------------------------------------------------------
  36. // A modifier pour mettre "à l'heure"                                                                       |
  37. //----------------------------------------------------------------------------------------------------------
  38. #define update_mode 0                                   // 1 : Mise à jour du temps ; 0 : Affiche l'heure
  39. //----------------------------------------------------------------------------------------------------------
  40.  
  41. //----------------------------------------------------------------------------------------------------------
  42. // A modifier pour mettre "à l'heure"                                                                       |
  43. //----------------------------------------------------------------------------------------------------------
  44. #define TIME_YR    20  // <=                // année sans "20" de 2000                                      |
  45. #define TIME_MTH   8   // <=                // numéro du mois de l'année                                    |
  46. #define TIME_DATE  13  // <=                // jour du mois                                                 |
  47. #define TIME_DOW   4   // <=                // jour de la semaine (lundi : 1; mardi : 2; mercredi : 3; etc) |
  48. #define TIME_HR    16  // <=                // heures                                                       |
  49. #define TIME_MIN   10  // <=                // minutes                                                      |
  50. #define TIME_SEC   0   // <=                // secondes                                                     |
  51. //----------------------------------------------------------------------------------------------------------
  52.  
  53. char* jour[] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"}; // nom du jour de la semaine
  54.  
  55. char* mois[] = {"janvier", "fevrier", "mars", "avril", "mai", "juin", "juillet", "aout", "septembre", "octobre", "novembre", "decembre"}; // nom du mois
  56.  
  57. // ???---???---  permet l'affichage des caractères spéciaux  ---???---???
  58. #if defined(ARDUINO) && ARDUINO >= 100
  59. #define printByte(args)  write(args);
  60. #else
  61. #define printByte(args)  print(args,BYTE);
  62. #endif
  63. // ???---???---            ???---???---???---???             ---???---???
  64.  
  65. uint8_t pendule[8] = {0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0};          // caractère spécial pendule
  66. uint8_t goutte[8] = {0x04, 0x04, 0x0A, 0x0A, 0x11, 0x11, 0x11, 0x0E}; // caractère spécial goutte
  67. uint8_t thermo[8] = {0x04, 0x0A, 0x0B, 0x0A, 0x0F, 0x0E, 0x0F, 0x0E}; // caractère spécial thermomètre
  68. // https://maxpromer.github.io/LCD-Character-Creator/
  69.  
  70. int rtc[7];                                       // tableau qui contiendra les valeurs du temps présent
  71.  
  72. unsigned long cycle;                              // repère temporel pour l'affichage des secondes ("refresh" ou nouveau Serial.print())
  73. unsigned long cycleSensor;                        // repère temporel pour la lecture des senseur de température et humidité
  74. unsigned long MargeCycleSensor = 30000;           // delais entre chaque lecture des senseurs
  75.  
  76. float temp_c;                                     // température en celsius
  77. float temp_f;                                     // température en Fareneit
  78. float humidity;                                   // taux d'humidité de l'air
  79.  
  80. float temp_c_max = 0;                             // température max en celsius
  81. float temp_c_min = 1000;                          // température min en celsius
  82. float temp_f_max = 0;                             // température max en Fareneit
  83. float temp_f_min = 1000;                          // température min en Fareneit
  84. float hum_max = 0;                                // taux max d'humidité de l'air
  85. float hum_min = 101;                              // taux min d'humidité de l'air
  86.  
  87. int modeAff = 0;                                  // mode d'écran à afficher
  88. int modeAffMem;                                   // mise en memoire du dernier mode ecran affiché
  89.  
  90. int longueurLigne;                                // nombre de caractère à l'écran (à afficher)
  91. int avance = 0;                                   // position du repère de défilement
  92. int debutAff;                                     // premier caractère de la ligne affiché
  93. int finAff;                                       // dernier caratcère de la ligne affiché
  94.  
  95. int valeurTouche[5] = {600, 650, 720,  800, 900 };  // valeurs analogiques de basculement d'un bouton à l'autre
  96.                                                   // (j'ai modifié le 3eme je suis passé de 700 à 720)
  97. int nombreCle = 5;                                // détermine le nombre de boutons
  98. int cleActive;                                    // bouton activé
  99. int cle = -1;                                     // valeur du bouton
  100. int ancienneCle = -1;                             // ancienne valeur connu des boutons
  101. const int nombreMode = 3;                         // nombre de mode : 4 (mode : 0)
  102.  
  103. /* ================================================================================================== */
  104.  
  105. // fontction de défilement
  106. /* ================================================================================================== */
  107. void showDefil1() {
  108.   RTC.get(rtc, true); {
  109.     // ligne 1
  110.     String ligne1 = String(jour[rtc[3] - 1]) + " " + String(rtc[4]);  // 'jour de la semaine' + " " + 'numéro du jour'
  111.     if (rtc[4] < 2) {                                                 // si le 'numéro du jour' est "1"...
  112.       ligne1 += "er ";                                                // ... on rajoute "er" juste après
  113.     }
  114.     ligne1 += " " + String(mois[rtc[5] - 1]) + " " + String(rtc[6]);  // " " + 'nom du mois' + " " + 'année' (4 chiffres)
  115.     longueurLigne = ligne1.length();                                  // longuer de la chaine (nombre de caractère)
  116.  
  117.     if (avance < 19) {                                                // du tour 0 au tour 18
  118.  
  119.       debutAff = 0;                                                   // premier caractère = 0
  120.       finAff = avance + 1;                                            // dernier caractère = numéro du tour (valeur de 'avance')
  121.       lcd.setCursor((19 - avance), 0);                                // on positionne le curseur "(a droite - le nombre de tour fait)
  122.       avance += 1;                                                    // on avance d'un cran le repere
  123.  
  124.     } else if (avance >= 19 && avance <= (longueurLigne + 19)) {      // du tour 19 au tour longueur + 19 (tant qu'on est pas a la fin de la ligne)
  125.  
  126.       debutAff = avance - 19;                                         // le premier caractere prend la valeur avance - 19
  127.       finAff = avance + 1;                                            // le dernier caractère prend la valeur avance + 1
  128.       lcd.setCursor(0, 0);                                            // curseur en haut à gauche
  129.       avance += 1;                                                    // on avance d'un cran le repere
  130.  
  131.     } else if (avance > (longueurLigne + 19)) {                       // si c'est la fin
  132.  
  133.       //debutAff = longueurLigne - 20;                                  //
  134.       //finAff = longueurLigne;                                         //
  135.       lcd.setCursor(0, 0);                                            // curseur en haut à gauche
  136.       avance = 0;
  137.  
  138.     }
  139.  
  140.     ligne1 = ligne1.substring(int(debutAff), int(finAff));            // on ne prend que ce qui est à afficher de la ligne
  141.  
  142.     if (ligne1.length() < 20 && avance > 19) {                        //
  143.       for (int i = 0; i <= 20 - ligne1.length(); i++) {             //
  144.         ligne1 += " ";                                                //on ajoute " " a la fin de la chaine pour que le 0 ne reste pas affiché
  145.       }
  146.     }                                                                
  147.     lcd.print(ligne1);                                                // on l'affiche
  148.  
  149.     // Ligne 2                                                        // Construction de la ligne2
  150.  
  151.     String ligne2;                                                    // création de la chaine
  152.     if (rtc[2] < 10) {                                                // si heure < 10
  153.       ligne2 = "0" + String(rtc[2]) + ":";                            // on fait la concaténation en commencant par un "0"  
  154.     }else{                                                            // sinon
  155.       ligne2 = String(rtc[2]) + ":";                                  // on fait la concaténation
  156.     }
  157.     if (rtc[1] < 10) {
  158.       ligne2 += "0" + String(rtc[1]) + ":";
  159.     }else{
  160.       ligne2 += String(rtc[1]) + ":";
  161.     }
  162.     if (rtc[0] < 10) {
  163.       ligne2 += "0" + String(rtc[0]);
  164.     }else{
  165.       ligne2 += String(rtc[0]);
  166.     }
  167.     lcd.setCursor(6, 1);
  168.     lcd.print(ligne2);
  169.  
  170. // Ligne 3                                                        // Construction de la ligne3
  171.     lcd.setCursor(0, 2);
  172.     lcd.printByte(2);                                             // affichage du caractère spécial
  173.     lcd.print("      ");
  174.     if (temp_c < 10) {
  175.       lcd.print("0");                                             // on rajoute un zéro si les minutes sont inférieures à 10
  176.     }
  177.     lcd.print(temp_c, 1);                                         // valeur de la température en Celcius
  178.     lcd.write(223);                                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  179.     lcd.print("C");
  180.     lcd.print("      ");
  181.     lcd.printByte(2);
  182.  
  183. // Ligne 4
  184.     lcd.setCursor(0, 3);
  185.     lcd.printByte(1);
  186.     lcd.print("      ");
  187.     lcd.print(humidity);                                          // valeur tu taux d'humidité de l'air (en %)
  188.     lcd.print("%");
  189.     lcd.print("      ");
  190.  
  191.     lcd.printByte(1);
  192.   }
  193. }
  194.  
  195. /* ================================================================================================== */
  196.  
  197. void showMax() {
  198.   lcd.setCursor(6, 0);
  199.   lcd.print("MAXIMUM");
  200.   lcd.setCursor(0, 1);
  201.   lcd.printByte(2);
  202.   lcd.print("      ");
  203.   if (temp_c_max < 10) {
  204.     lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  205.   }
  206.   lcd.print(temp_c_max, 1);                     // valeur de la température en Celcius
  207.   lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  208.   lcd.print("C");
  209.   lcd.print("      ");
  210.   lcd.printByte(2);
  211.   lcd.setCursor(0, 2);
  212.   lcd.printByte(2);
  213.   lcd.print("      ");
  214.   if (temp_f_max < 10) {
  215.     lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  216.   }
  217.   lcd.print(temp_f_max, 1);                     // valeur de la température en Celcius
  218.   lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  219.   lcd.print("F");
  220.   lcd.print("      ");
  221.   lcd.printByte(2);
  222.   lcd.setCursor(0, 3);
  223.   lcd.printByte(1);
  224.   lcd.print("      ");
  225.   lcd.print(hum_max);                           // valeur de la température en Celcius
  226.   lcd.print("%");
  227.   lcd.print("      ");
  228.   lcd.printByte(1);
  229. }
  230.  
  231. void showMin() {
  232.   lcd.setCursor(6, 0);
  233.   lcd.print("MINIMUM");
  234.   lcd.setCursor(0, 1);
  235.   lcd.printByte(2);
  236.   lcd.print("      ");
  237.   if (temp_c_min < 10) {
  238.     lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  239.   }
  240.   lcd.print(temp_c_min, 1);                     // valeur de la température en Celcius
  241.   lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  242.   lcd.print("C");
  243.   lcd.print("      ");
  244.   lcd.printByte(2);
  245.   lcd.setCursor(0, 2);
  246.   lcd.printByte(2);
  247.   lcd.print("      ");
  248.   if (temp_f_min < 10) {
  249.     lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  250.   }
  251.   lcd.print(temp_f_min, 1);                     // valeur de la température en Celcius
  252.   lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  253.   lcd.print("F");
  254.   lcd.print("      ");
  255.   lcd.printByte(2);
  256.   lcd.setCursor(0, 3);
  257.   lcd.printByte(1);
  258.   lcd.print("      ");
  259.   lcd.print(hum_min);                           // valeur de la température en Celcius
  260.   lcd.print("%");
  261.   lcd.print("      ");
  262.   lcd.printByte(1);
  263. }
  264.  
  265. void showAll3() {
  266.   RTC.get(rtc, true); {
  267.     lcd.setCursor(5, 0);
  268.     if (rtc[4] < 10) {
  269.       lcd.print("0");                            // on rajoute un zéro si les minutes sont inférieures à 10
  270.     }
  271.     lcd.print(rtc[4]);
  272.     lcd.print("/");
  273.     if (rtc[5] < 10) {
  274.       lcd.print("0");                            // on rajoute un zéro si les minutes sont inférieures à 10
  275.     }
  276.     lcd.print(rtc[5]);
  277.     lcd.print("/");
  278.     lcd.print(rtc[6]);
  279.     lcd.setCursor(0, 1);
  280.     lcd.printByte(0);
  281.     lcd.print("     ");
  282.     if (rtc[2] < 10) {
  283.       lcd.print("0");                             // on rajoute un zéro si les heures sont inférieures à 10
  284.     }
  285.     lcd.print( rtc[2]);                           // heures minutes secondes
  286.     lcd.print(":");                               // ":"
  287.     if (rtc[1] < 10) {
  288.       lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  289.     }
  290.     lcd.print( rtc[1]);                           // valeur des minutes
  291.     lcd.print(":");                               // ":"
  292.     if (rtc[0] < 10) {
  293.       lcd.print("0");                             // on rajoute un zéro si les secondes sont inférieures à 10
  294.     }
  295.     lcd.print( rtc[0]);
  296.     lcd.print("     ");
  297.     lcd.printByte(0);
  298.     lcd.setCursor(0, 2);
  299.     lcd.printByte(2);
  300.     lcd.print("      ");
  301.     if (temp_c < 10) {
  302.       lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  303.     }
  304.     lcd.print(temp_c, 1);                         // valeur de la température en Celcius
  305.     lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  306.     lcd.print("C");
  307.     lcd.print("      ");
  308.     lcd.printByte(2);
  309.     lcd.setCursor(0, 3);
  310.     lcd.printByte(1);
  311.     lcd.print("      ");
  312.     lcd.print(humidity);                          // valeur tu taux d'humidité de l'air (en %)
  313.     lcd.print("%");
  314.     lcd.print("      ");
  315.  
  316.     lcd.printByte(1);
  317.   }
  318. }
  319.  
  320. void showAll2() {
  321.   RTC.get(rtc, true); {                           // récupération des valeurs du module RTC
  322.     lcd.setCursor(0, 0);
  323.     if (rtc[4] < 10) {
  324.       lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  325.     }
  326.     lcd.print(rtc[4]);
  327.     lcd.print("/");
  328.     if (rtc[5] < 10) {
  329.       lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  330.     }
  331.     lcd.print(rtc[5]);
  332.     lcd.print("/");
  333.     lcd.print(rtc[6]);
  334.     lcd.print(" ");
  335.     lcd.printByte(0);
  336.     if (rtc[2] < 10) {
  337.       lcd.print("0");                             // on rajoute un zéro si les heures sont inférieures à 10
  338.     }
  339.     lcd.print( rtc[2]);                           // heures minutes secondes
  340.     lcd.print(":");                               // ":"
  341.     if (rtc[1] < 10) {
  342.       lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  343.     }
  344.     lcd.print( rtc[1]);                           // valeur des minutes
  345.     lcd.print(":");                               // ":"
  346.     if (rtc[0] < 10) {
  347.       lcd.print("0");                             // on rajoute un zéro si les secondes sont inférieures à 10
  348.     }
  349.     lcd.print( rtc[0]);
  350.     lcd.setCursor(6, 1);
  351.     lcd.print( jour[rtc[3] - 1]);
  352.     lcd.setCursor(0, 2);
  353.     lcd.printByte(2);
  354.     lcd.print(" ");
  355.     lcd.print(temp_c, 1);                         // valeur de la température en Celcius
  356.     lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  357.     lcd.print("C - ");
  358.     lcd.printByte(1);
  359.     lcd.print(" ");
  360.     lcd.print(humidity);                          // valeur tu taux d'humidité de l'air (en %)
  361.     lcd.print("%");
  362.     lcd.setCursor(5, 3);
  363.     lcd.print("(");
  364.     lcd.printByte(2);
  365.     lcd.print(" ");
  366.     lcd.print(temp_f, 1);                         // valeur de la température en Farenheight
  367.     lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  368.     lcd.print("F)");
  369.   }
  370. }
  371.  
  372. void showMeteo1 () {                              // fonction qui affiche la température et l'humidité
  373.   lcd.setCursor(0, 2);                            // position du curseur 1er caractère (0) 3ème ligne (2)
  374.   lcd.printByte(2);
  375.   lcd.print(" : ");
  376.   //lcd.print("T : ");                            // __T : __
  377.   lcd.print(temp_c, 1);                           // valeur de la température en Celcius
  378.   lcd.write(223);                                 // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  379.   lcd.print("C (");                               // _C (_
  380.   lcd.print(temp_f, 1);                           // valeur de la température en Farenheight
  381.   lcd.write(223);                                 // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  382.   lcd.print("F)");                                // _F)_
  383.   lcd.setCursor(0, 3);                            // position du curseur 1er caractère (0) 4ème ligne (3)
  384.   lcd.printByte(1);
  385.   lcd.print(" :    ");                            // _H :    _
  386.   //lcd.print("H :    ");                         // _H :    _
  387.   lcd.print(humidity);                            // valeur tu taux d'humidité de l'air (en %)
  388.   lcd.print("%");                                 // _%_
  389. }
  390.  
  391.  
  392. void showtime1() {                                // fonction qui affiche l'heure
  393.   RTC.get(rtc, true);                             // récupération des valeurs du module RTC
  394.   {
  395.     //lcd.clear();                                // efface l'écran
  396.     lcd.setCursor(0, 0);                          // position du curseur 1er caractère (0) 1ère ligne (0)
  397.     lcd.print( jour[rtc[3] - 1]);                 // jour de la semaine
  398.     lcd.print(" ");                               // "espace"
  399.     lcd.print(rtc[4]);                            // date mois année : numéro du jour
  400.     if (rtc[4] < 2) {
  401.       lcd.print("er");                            // on rajouter "er" apres le numero du jour si on est le 1er du mois
  402.     }
  403.     lcd.print(" ");                               // "espace"
  404.     lcd.print( mois[rtc[5] - 1]);                 // mois de l'année
  405.     lcd.print(" ");                               // "espace"
  406.     //lcd.print( rtc[6]);                         // année avec "20" de 2000
  407.  
  408.     lcd.setCursor(0, 1);
  409.     lcd.printByte(0);
  410.     lcd.print(" :   ");
  411.     if (rtc[2] < 10) {
  412.       lcd.print("0");                             // on rajoute un zéro si les heures sont inférieures à 10
  413.     }
  414.     lcd.print( rtc[2]);                           // heures minutes secondes
  415.     lcd.print(":");                               // ":"
  416.     if (rtc[1] < 10) {
  417.       lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  418.     }
  419.     lcd.print( rtc[1]);                           // valeur des minutes
  420.     lcd.print(":");                               // ":"
  421.     if (rtc[0] < 10) {
  422.       lcd.print("0");                             // on rajoute un zéro si les secondes sont inférieures à 10
  423.     }
  424.     lcd.print( rtc[0]);                           // valeur des secondes
  425.   }
  426. }
  427.  
  428. int recupCle(unsigned int input) {                // transforme la valeur du clavier en numero de touche
  429.   int k;
  430.   for (k = 0; k < nombreCle; k++) {
  431.     if (input < valeurTouche[k]) {
  432.       return k;
  433.     }
  434.   }
  435.   if (k >= nombreCle) {
  436.     k = -1;                                       // En cas de valeur non valide
  437.   }
  438.   return k;
  439. }
  440. /* ================================================================================================== */
  441. // SETUP
  442. /* ================================================================================================== */
  443.  
  444. void setup() {
  445.   Serial.begin(9600);
  446.   lcd.init();                                     // initialisation de l'écran
  447.   Wire.begin();                                   // lancement connexion simplifiée
  448.   lcd.backlight();                                // éclairage de l'écran
  449.   lcd.createChar(0, pendule);                     // creation du caractère spécial pendule
  450.   lcd.createChar(1, goutte);                      // création du caractère spécial goutte
  451.   lcd.createChar(2, thermo);                      // création du caractère spécial thermometre
  452.  
  453.   //                      Mise à jour du Temps
  454.   if (update_mode) {                              // si updata_flag 1 l'heure est mise à jour
  455.     showtime1();                                  // on affiche l'heure actuelle
  456.     lcd.setCursor(5, 3);                          // sur la dernière ligne à partir de la cinquieme colonne
  457.     lcd.print("Ancienne heure");                  // on affiche l'heure actuelle
  458.     RTC.stop();                                   // on arete la l'horloge (RTC)
  459.                                                   // valeurs de mise a jour du Temps
  460.     RTC.set(DS1307_SEC, TIME_SEC);                // secondes => (valeurs entrées ci dessus)
  461.     RTC.set(DS1307_MIN, TIME_MIN);                // minutes => (valeurs entrées ci dessus)
  462.     RTC.set(DS1307_HR, TIME_HR);                  // heures => (valeurs entrées ci dessus)
  463.     RTC.set(DS1307_DOW, TIME_DOW);                // jour de la semaine => (valeurs entrées ci dessus)
  464.     RTC.set(DS1307_DATE, TIME_DATE);              // numéro du jour du mois => (valeurs entrées ci dessus)
  465.     RTC.set(DS1307_MTH, TIME_MTH);                // mois => (valeurs entrées ci dessus)
  466.     RTC.set(DS1307_YR, TIME_YR);                  // année => (valeurs entrées ci dessus)
  467.     RTC.start();                                  // l'horloge (RTC) est relancée avec les nouvelles valeurs
  468.     showtime1();                                  // on affiche la nouvelle heure
  469.     lcd.setCursor(3, 3);                          // sur la dernière ligne à partir de la troisieme colonne
  470.     lcd.print("Heure mise à jour");               // on affiche que c'est fait
  471.  
  472.   } else {                                        // sinon on lance le Temps
  473.  
  474.     cycle = millis();                             // marquage temporel pour les secondes
  475.     cycleSensor = millis() + MargeCycleSensor;    // marquage plus marge pour les senseurs (1 seule fois)
  476.  
  477.   }
  478. }
  479.  
  480. /* ================================================================================================== */
  481. // LOOP
  482. /* ================================================================================================== */
  483.  
  484. void loop() {
  485.  
  486.   // 1. on prend les valeurs température et humidité du capteur
  487.  
  488.   if (millis() - cycleSensor >= MargeCycleSensor) {     // toutes les 30s
  489.     cycleSensor = millis();                             // réinitialisation du repère temporel des senseurs
  490.     temp_c = sht15.readTemperatureC();                  // lecture température celsius
  491.     temp_f = sht15.readTemperatureF();                  // lecture température Farenheit
  492.     humidity = sht15.readHumidity();                    // lecture taux d'humidité
  493.  
  494.     // 2. on met a jour les valeurs min et max si nécessaire
  495.    
  496.     if (temp_c > temp_c_max) {                          // si la température mesurée est supérieure à la température max enregistrée
  497.       temp_c_max = temp_c;                              // alors la température mesurée devient la température max
  498.     }
  499.    
  500.     if (temp_c < temp_c_min) {                          // (voir ci dessus et remplacer "max" par "min")
  501.       temp_c_min = temp_c;                              //
  502.     }
  503.  
  504.     if (temp_f > temp_f_max) {                          // meme principe que ci dessus : "voir ci-dessus et remplacer
  505.       temp_f_max = temp_f;                              //
  506.     }
  507.  
  508.     if (temp_f < temp_f_min) {                          // (pareil...)
  509.       temp_f_min = temp_f;                              //
  510.     }
  511.  
  512.     if (humidity > hum_max) {                           // ...
  513.       hum_max = humidity;                               //
  514.     }
  515.    
  516.     if (humidity < hum_min) {                           //
  517.       hum_min = humidity;                               //
  518.     }
  519.  
  520.   }
  521.  
  522.   // 3. on met à jour l'affichage toutes les secondes
  523.   // c'est ici que seront gérés les modes d'affichage contrôlé par un module 5 BP
  524.  
  525.   // Contrôle du mode d'affichage par le module 5 boutons
  526.   // https://wiki.dfrobot.com/ADKeyboard_Module__SKU__DFR0075_
  527.  
  528.   // on détermine le numero du mode d'affichage à faire
  529.   // ce numero va de 0 à nombreMode + 2
  530.   // nombreMode est le nombre d'affichage des valeurs
  531.   // il faut y rajouter 2 valeurs supplémentaire pour Min et Max
  532.  
  533.   cleActive = analogRead(0);                            // on recupere la valeur du bouton enfoncé
  534.   cle = recupCle(cleActive);                            // on la transforme en numero de bouton
  535.   if (cle != ancienneCle) {                             // on vient d'enfoncer
  536.     delay(50);                                          // pause'café
  537.     cleActive = analogRead(0);                          // on relit la valeur
  538.     cle = recupCle(cleActive);                          // on la transforme en numero de bouton
  539.     if (cle != ancienneCle) {                           // on vient de le relacher
  540.       ancienneCle = cle;                                // reaffectation
  541.       if (cle >= 0) {                                   // vérification validité
  542.         switch (cle) {                                  // on voit alors les différents cas
  543.           case 0:                                       // cle = 0; bouton 1 "haut"
  544.             if (modeAff <= 3) {                         // si on vient d'un mode affichage "horloge"
  545.               modeAffMem = modeAff;                     // on garde cette valeur en memoire
  546.             }
  547.             modeAff = (nombreMode + 1);                 // 3
  548.             lcd.clear();                                // efface ecran
  549.             break;                                      // stop => etape suivante
  550.           case 1:                                       // cle = 1; bouton 2 "gauche"
  551.             if (modeAff > 0) {                          // on vérifie qu'on soit pas au bout
  552.               modeAff -= 1;                             // on retire 1
  553.             } else {                                    // sinon
  554.               modeAff = nombreMode;                     // on passe au max
  555.             }
  556.             lcd.clear();                                // efface ecran
  557.             break;                                      // stop => etape suivante
  558.           case 2:                                       // cle = 2; bouton 3 "bas"
  559.             if (modeAff <= 3) {                         // si on vient d'un mode affichage "horloge"
  560.               modeAffMem = modeAff;                     // on garde cette valeur en memoire
  561.             }
  562.             modeAff = (nombreMode + 2);                 // 4
  563.             lcd.clear();                                // on vide l'ecran pour l'affichage du mode a venir
  564.             break;                                      // stop => etape suivante
  565.           case 3:                                       // cle = 3; bouton 4 "droite"
  566.             if (modeAff < nombreMode) {                 // si on est pas au "bout haut" des modes (nombreMode)
  567.               modeAff += 1;                             // on passe au niveau suivant (+1)
  568.             } else {                                    // sinon
  569.               modeAff = 0;                              // on remet le mode au "bout bas" des modes (0)
  570.             }
  571.             lcd.clear();                                // efface ecran
  572.             break;                                      // stop => etape suivante
  573.           case 4:                                       // pas encore utilisé bouton du milieu
  574.             if (modeAff > nombreMode) {                 // Si on est en mode mini ou maxi
  575.               modeAff = modeAffMem;                     // on rappelle le mode d'affichage mémorisé
  576.             }
  577.             lcd.clear();
  578.             break;                                      // stop => etape suivante
  579.         }
  580.       }
  581.     }
  582.   }
  583.  
  584.   if (millis() - cycle >= 500) {                     // toutes les secondes
  585.     cycle = millis();                                 // réinitialisation du repère temporel de l'heure (seconde)
  586.     if (update_mode == 0) {                           // si updata_flag 0
  587.  
  588.       switch (modeAff) {
  589.         case 0:
  590.           showtime1();                                // Affichage Mode 1
  591.           showMeteo1();
  592.           break;
  593.         case 1:
  594.           showAll2();                                 // Affichage Mode 2
  595.           break;
  596.         case 2:
  597.           showAll3();                                 // Affichage Mode 3
  598.           break;
  599.         case 3:
  600.           showDefil1();                               // Affichage Mode 4
  601.           break;
  602.         case 4:
  603.           showMax();                                 // Affichage Mode Max
  604.           break;
  605.         case 5:
  606.           showMin();                                 // Affichage Mode Min
  607.           break;
  608.       }
  609.     }
  610.   }
  611. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement