Advertisement
Ollivier

ThermometreHumiditéLumiereEcran20x4

Aug 16th, 2020
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 43.29 KB | None | 0 0
  1. /* ================================================================================================== */
  2. // KRONOS 1.1
  3. // Ollivier JULLIEN août 2020
  4. // 100% libre de droit
  5. // (en cas de copie, merci de citer l'auteur... il a travaillé dur pour vous le donner ;) )
  6. // Merci à Serge DUCATEZ
  7. /* ================================================================================================== */
  8. // à voir => chaînes formatées
  9. /* ================================================================================================== */
  10. // Calendrier / Pendule / thermomètre / hygromètre
  11. // Affichage multimode sur ecran LCD 1 couleur (bleu) 20x4
  12. //
  13. // RTC 1603 (RTC) Horloge en temps réel DFR0151
  14. //    https://wiki.dfrobot.com/Gravity__I2C_DS1307_RTC_Module_SKU__DFR0151
  15. //
  16. // SHT15  (Capteur humidité / hygrométrie) (double I2C / pseudo I2C ??)
  17. // Capteur de T° et d'humidité Gravity DFR0066
  18. //    https://wiki.dfrobot.com/SHT1x_Humidity_and_Temperature_Sensor__SKU__DFR0066_
  19. //
  20. // Module 5 boutons (analogique) DFR0075
  21. //     https://wiki.dfrobot.com/ADKeyboard_Module__SKU__DFR0075_
  22. //
  23. // capteur de lumière ambiante SEN0172 (juste parce que j'en ai un)
  24. //    https://wiki.dfrobot.com/LX1972_ambient_light_sensor_SKU_SEN0172
  25. //
  26. // Arduino Nano
  27. //
  28. // Afficheur LCD I2C 4X20 caractères
  29. //    https://www.gotronic.fr/pj2-sbc-lcd20x4-fr-1440.pdf
  30. //    https://www.gotronic.fr/pj2-pcf8574-3-1516.pdf
  31. //    https://www.gotronic.fr/pj2-lcd2004-1515.pdf
  32. /* ================================================================================================== */
  33.  
  34. /* ================================================================================================== */
  35. // Ce "truc" possède 4 modes (ecran) d'affichages de la date, l'heure, la température en °C, le taux
  36. // d'humidité de l'air, dont un avec défilement de la date du jour, et deux autres qui donnent la
  37. // température en °F.
  38. // Cette nouvelle version donne aussi l'intensité lumineuse ambiante.
  39. // De plus j'ai rajouté une animation de la pendule sur l'écran 2, et un nouvel icone "calendrier"
  40. // sur ce même écran.
  41. // Elle comporte aussi le clignotement des ":" des horloges.
  42. //
  43. // Utilisation
  44. //
  45. // Le controle se fait par 5 boutons (Ben oui j'en avais 5 de dispo, c'est l'opulence.
  46. //             BOUTON 1 BLANC
  47. //                    O
  48. //   BOUTON 2 ROUGE O O O BOUTON 4 VERT || AU CENTRE BOUTON 5 BLANC
  49. //                    O
  50. //             BOUTON 3 BLANC
  51. // BOUTON 2 ROUGE passe au mode suivant (et retourne au premier une fois au bout)
  52. // BOUTON 4 VERT  passe au mode précédent (et retourne au dernier une fois au bout)
  53. // BOUTON 1 BLANC affiches les valeurs maximum de température et d'humidité atteinte depuis qu'il est branché
  54. // BOUTON 3 BLANC affiches les valeurs minimum de température et d'humidité atteinte depuis qu'il est branché
  55. // BOUTON 5 BLANC si on vient de mini ou maxi, on affiche le dernier mode selectionné avec ROUGE ou VERT
  56. //
  57. // Il faudra un peu modifier le code pour l'utiliser avec des boutons poussoirs différents de ce module
  58. //
  59. /* ================================================================================================== */
  60. // Suite possible / prévue
  61. /* ================================================================================================== */
  62. // [x] FAIT : animation pendule sur 3 positions (3 caracteres speciaux), 4 mouvements
  63. // [x] FAIT : animation des ":" dans les horloges
  64. // [x] FAIT : ajouter un capteur de lumière ambiante SEN0172 (juste parce que j'en ai un)
  65. // [x] FAIT : ajouter une icone calendrier
  66. // [x] FAIT : le centrage automatique des lignes
  67. //    => date ecran 1 / ligne 1 | et | jour ecran 2 / Ligne 2
  68. // [x] FAIT : Rajouter l'année sur l'écran 1
  69. // Accents sur le 'u' de août et les 'e' sur février et décembre
  70. //    Peut me servir pour çà :
  71. //    http://www.electronic-engineering.ch/microchip/datasheets/lcd/charset.gif
  72. //    http://fabrice.sincere.pagesperso-orange.fr/cm_electronique/electronique_numerique20/annexe/conversion_decimal_hexa02.pdf
  73. // Connexion RF433 avec une autre sonde température (pour mode extérieur intérieur) (+2)
  74. // Mise à jour de l'heure par l'utilisateur (compliqué, mais...)
  75. // ... et peut être de nouveaux modes d'affichage (écrans)
  76. //
  77. // J'attends vos idées...
  78. //
  79. // REMARQUE : Il semblerait que dans ce code, 'lcd.printByte()' peut être remplacé par 'lcd.write()'
  80. // mais je ne sais pas si on a encore besoin du #DEFINE suivante... (je regarderai plus tard)
  81. //
  82. // #if defined(ARDUINO) && ARDUINO >= 100
  83. // #define printByte(args)  write(args);
  84. // #else
  85. // #define printByte(args)  print(args,BYTE);
  86. // #endif
  87. //
  88. //----------------------------------------------------------------------------------------------------------
  89. // IMPORTATION DES BIBLIOTHEQUES                                                                            |
  90. //----------------------------------------------------------------------------------------------------------
  91. #include <Wire.h>                                       // chargement de la bibliothèque de gestion simplifiée du cablage (I2C)
  92. #include <DS1307.h>                                     // chargement de la bibliothèque de gestion du module RTC (Real Time Clock)
  93. #include <SHT1x.h>                                      // chargement de la bibliothèque de gestion du module temperature humidité sht15
  94. #include <LiquidCrystal_I2C.h>                          // chargement de la bibliothèque de gestion de l'ecran 4x20 I2C
  95.  
  96. LiquidCrystal_I2C lcd(0x27, 20, 4);                     // instanciation de l'occurence lcd() de l'objet LiquidCrystal_I2C
  97.  
  98. #define dataPin  10                                     // pin digital de connexion data Senseur SHT15
  99. #define clockPin 11                                     // pin digital de connexion SCK Senseur SHT15
  100. SHT1x sht15(dataPin, clockPin);                         // instanciation de l'occurence sht15() de l'objet SHT1x
  101.  
  102. //----------------------------------------------------------------------------------------------------------
  103. // A modifier pour mettre "à l'heure"                                                                       |
  104. //----------------------------------------------------------------------------------------------------------
  105. #define update_mode 0                                   // 1 : Mise à jour du temps ; 0 : Affiche l'heure
  106. //----------------------------------------------------------------------------------------------------------
  107.  
  108. //----------------------------------------------------------------------------------------------------------
  109. // A modifier pour mettre "à l'heure"                                                                       |
  110. //----------------------------------------------------------------------------------------------------------
  111. #define TIME_YR    20  // <=                // année sans "20" de 2000                                      |
  112. #define TIME_MTH   8   // <=                // numéro du mois de l'année                                    |
  113. #define TIME_DATE  13  // <=                // jour du mois                                                 |
  114. #define TIME_DOW   4   // <=                // jour de la semaine (lundi : 1; mardi : 2; mercredi : 3; etc) |
  115. #define TIME_HR    16  // <=                // heures                                                       |
  116. #define TIME_MIN   10  // <=                // minutes                                                      |
  117. #define TIME_SEC   0   // <=                // secondes                                                     |
  118. //----------------------------------------------------------------------------------------------------------
  119.  
  120. char* jour[] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"}; // nom du jour de la semaine
  121.  
  122. char* mois[] = {"janvier", "fevrier", "mars", "avril", "mai", "juin", "juillet", "aout", "septembre", "octobre", "novembre", "decembre"}; // nom du mois
  123.  
  124. // ???---???---  permet l'affichage des caractères spéciaux  ---???---???
  125. #if defined(ARDUINO) && ARDUINO >= 100
  126. #define printByte(args)  write(args);
  127. #else
  128. #define printByte(args)  print(args,BYTE);
  129. #endif
  130. // ???---???---            ???---???---???---???             ---???---???
  131.  
  132. uint8_t pendulePre[8] = {0x0E, 0x15, 0x17, 0x11, 0x0E, 0x00, 0x00, 0x00};
  133. uint8_t pendulePost[8] = {0x00, 0x00, 0x00, 0x0E, 0x15, 0x17, 0x11, 0x0E};
  134. uint8_t pendule[8] = {0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0};          // caractère spécial pendule
  135. uint8_t goutte[8] = {0x04, 0x04, 0x0A, 0x0A, 0x11, 0x11, 0x11, 0x0E}; // caractère spécial goutte
  136. uint8_t thermo[8] = {0x04, 0x0A, 0x0B, 0x0A, 0x0F, 0x0E, 0x0F, 0x0E}; // caractère spécial thermomètre
  137. uint8_t lum[8] = {0x00, 0x04, 0x15, 0x0E, 0x1F, 0x0E, 0x15, 0x04};    //caractère spécial lumière
  138. uint8_t cal[8] = {0x1F, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F};   //caractère spécial calendrier
  139. // https://maxpromer.github.io/LCD-Character-Creator/
  140.  
  141. int rtc[7];                                       // tableau qui contiendra les valeurs du temps présent
  142.  
  143. unsigned long cycle;                              // repère temporel pour l'affichage des secondes ("refresh" ou nouveau Serial.print())
  144. unsigned long cycleSensor;                        // repère temporel pour la lecture des senseur de température et humidité
  145. unsigned long MargeCycleSensor = 30000;           // delais entre chaque lecture des senseurs
  146.  
  147. float temp_c;                                     // température en celsius
  148. float temp_f;                                     // température en Fareneit
  149. float humidity;                                   // taux d'humidité de l'air
  150.  
  151. float temp_c_max = 0;                             // température max en celsius
  152. float temp_c_min = 1000;                          // température min en celsius
  153. float temp_f_max = 0;                             // température max en Fareneit
  154. float temp_f_min = 1000;                          // température min en Fareneit
  155. float hum_max = 0;                                // taux max d'humidité de l'air
  156. float hum_min = 101;                              // taux min d'humidité de l'air
  157.  
  158. int modeAff = 0;                                  // mode d'écran à afficher
  159. int modeAffMem;                                   // mise en memoire du dernier mode ecran affiché
  160.  
  161. int longueurLigne;                                // nombre de caractère à l'écran (à afficher)
  162. int avance = 0;                                   // position du repère de défilement
  163. int debutAff;                                     // premier caractère de la ligne affiché
  164. int finAff;                                       // dernier caratcère de la ligne affiché
  165.  
  166. int valeurTouche[5] = {600, 650, 720,  800, 900 };  // valeurs analogiques de basculement d'un bouton à l'autre
  167. // (j'ai modifié le 3eme je suis passé de 700 à 720)
  168. int nombreCle = 5;                                // détermine le nombre de boutons
  169. int cleActive;                                    // bouton activé
  170. int cle = -1;                                     // valeur du bouton
  171. int ancienneCle = -1;                             // ancienne valeur connu des boutons
  172. const int nombreMode = 3;                         // nombre de mode : 4 (mode : 0)
  173.  
  174. int pinAnalogLumiere = 1;
  175. int lumiere;
  176.  
  177. int cyclePendule = 1;
  178.  
  179. bool etatDeuxPoints = 0;
  180.  
  181. int positionCentrage;
  182.  
  183. /* ================================================================================================== */
  184. // fontctions
  185. /* ================================================================================================== */
  186.  
  187. /* ================================================================================================== */
  188. // fonction d'affichage de la lumiere
  189. /* ================================================================================================== */
  190.  
  191. void afficheLumiere(){
  192.   lcd.home();
  193.   lcd.printByte(3);
  194.   lcd.print(" ");
  195.   lcd.print(lumiere);
  196.   lcd.print("%");
  197. }
  198.  
  199. /* ================================================================================================== */
  200. // fonction d'affichage du mode avec défilement
  201. /* ================================================================================================== */
  202.  
  203. void showDefil1() {
  204.   RTC.get(rtc, true); {
  205.  
  206. //------------------------------------------------------------------------------------------------------
  207.    
  208.     // ligne 1
  209.     String ligne1 = String(jour[rtc[3] - 1]) + " " + String(rtc[4]);  // 'jour de la semaine' + " " + 'numéro du jour'
  210.     if (rtc[4] < 2) {                                                 // si le 'numéro du jour' est "1"...
  211.       ligne1 += "er ";                                                // ... on rajoute "er" juste après
  212.     }
  213.     ligne1 += " " + String(mois[rtc[5] - 1]) + " " + String(rtc[6]);  // " " + 'nom du mois' + " " + 'année' (4 chiffres)
  214.     longueurLigne = ligne1.length();                                  // longuer de la chaine (nombre de caractère)
  215.  
  216.     if (avance < 19) {                                                // du tour 0 au tour 18
  217.  
  218.       debutAff = 0;                                                   // premier caractère = 0
  219.       finAff = avance + 1;                                            // dernier caractère = numéro du tour (valeur de 'avance')
  220.       lcd.setCursor((19 - avance), 0);                                // on positionne le curseur "(a droite - le nombre de tour fait)
  221.       avance += 1;                                                    // on avance d'un cran le repere
  222.  
  223.     } 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)
  224.  
  225.       debutAff = avance - 19;                                         // le premier caractere prend la valeur avance - 19
  226.       finAff = avance + 1;                                            // le dernier caractère prend la valeur avance + 1
  227.       lcd.setCursor(0, 0);                                            // curseur en haut à gauche
  228.       avance += 1;                                                    // on avance d'un cran le repere
  229.  
  230.     } else if (avance > (longueurLigne + 19)) {                       // si c'est la fin
  231.  
  232.       lcd.setCursor(0, 0);                                            // curseur en haut à gauche
  233.       avance = 0;
  234.  
  235.     }
  236.  
  237.     ligne1 = ligne1.substring(int(debutAff), int(finAff));            // on ne prend que ce qui est à afficher de la ligne
  238.  
  239.     if (ligne1.length() < 20 && avance > 19) {                        //
  240.       for (int i = 0; i <= 20 - ligne1.length(); i++) {               //
  241.         ligne1 += " ";                                                //on ajoute " " a la fin de la chaine pour que le 0 ne reste pas affiché
  242.       }
  243.     }
  244.     lcd.print(ligne1);                                                // on l'affiche
  245.  
  246. //------------------------------------------------------------------------------------------------------
  247.  
  248.     // Ligne 2                                                        // Construction de la ligne2
  249.  
  250.     lcd.setCursor(0, 1);
  251.     lcd.print("  ");
  252.     lcd.printByte(0);
  253.     lcd.print("   ");
  254.     if (rtc[2] < 10) {
  255.       lcd.print("0");                             // on rajoute un zéro si les heures sont inférieures à 10
  256.     }
  257.     lcd.print( rtc[2]);                           // heures minutes secondes
  258.     if (etatDeuxPoints == 1){
  259.       lcd.print(":");                             // ":"
  260.     } else {
  261.       lcd.print(" ");                             // " "
  262.     }
  263.     if (rtc[1] < 10) {
  264.       lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  265.     }
  266.     lcd.print( rtc[1]);                           // valeur des minutes
  267.     if (etatDeuxPoints == 1){
  268.       lcd.print(":");                             // ":"
  269.     } else {
  270.       lcd.print(" ");                             // " "
  271.     }
  272.     if (rtc[0] < 10) {
  273.       lcd.print("0");                             // on rajoute un zéro si les secondes sont inférieures à 10
  274.     }
  275.     lcd.print( rtc[0]);
  276.     lcd.print("   ");
  277.     lcd.printByte(0);
  278.     etatDeuxPoints = !etatDeuxPoints;
  279.  
  280. //------------------------------------------------------------------------------------------------------
  281.  
  282.     // Autre construction de la ligne possible
  283.    
  284.     /*String ligne2;                                                    // création de la chaine
  285.     if (rtc[2] < 10) {                                                // si heure < 10
  286.       ligne2 = "0" + String(rtc[2]) + ":";                            // on fait la concaténation en commencant par un "0"
  287.     } else {                                                           // sinon
  288.       ligne2 = String(rtc[2]) + ":";                                  // on fait la concaténation
  289.     }
  290.     if (rtc[1] < 10) {
  291.       ligne2 += "0" + String(rtc[1]) + ":";
  292.     } else {
  293.       ligne2 += String(rtc[1]) + ":";
  294.     }
  295.     if (rtc[0] < 10) {
  296.       ligne2 += "0" + String(rtc[0]);
  297.     } else {
  298.       ligne2 += String(rtc[0]);
  299.     }
  300.     lcd.setCursor(6, 1);
  301.     lcd.print(ligne2);*/
  302.  
  303.     //------------------------------------------------------------------------------------------------------
  304.  
  305.     // Ligne 3                                                        // Construction de la ligne3
  306.     lcd.setCursor(0, 2);
  307.     lcd.printByte(2);                                             // affichage du caractère spécial
  308.     lcd.print(" ");
  309.     if (temp_c < 10) {
  310.       lcd.print("0");                                             // on rajoute un zéro si les minutes sont inférieures à 10
  311.     }
  312.     lcd.print(temp_c, 1);                                         // valeur de la température en Celcius
  313.     lcd.write(223);                                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  314.     lcd.print("C");
  315.     lcd.print(" -- ");
  316.     lcd.print(temp_f, 1);                                         // valeur de la température en Celcius
  317.     lcd.write(223);                                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  318.     lcd.print("F ");
  319.     lcd.printByte(2);
  320.  
  321.     // Ligne 4
  322.     lcd.setCursor(0, 3);
  323.     lcd.printByte(1);
  324.     lcd.print("  ");
  325.     lcd.print(humidity);                                          // valeur tu taux d'humidité de l'air (en %)
  326.     lcd.print("%");
  327.     lcd.print("  -  ");
  328.     lcd.print(lumiere);                                          // valeur tu taux d'humidité de l'air (en %)
  329.     lcd.print("%");
  330.     lcd.print("  ");
  331.     lcd.printByte(3);
  332.   }
  333. }
  334.  
  335. /* ================================================================================================== */
  336. // fonction d'affichage des valeurs maxi
  337. /* ================================================================================================== */
  338.  
  339. void showMax() {
  340.   lcd.setCursor(6, 0);
  341.   lcd.print("MAXIMUM");
  342.   lcd.setCursor(0, 1);
  343.   lcd.printByte(2);
  344.   lcd.print("      ");
  345.   if (temp_c_max < 10) {
  346.     lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  347.   }
  348.   lcd.print(temp_c_max, 1);                     // valeur de la température en Celcius
  349.   lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  350.   lcd.print("C");
  351.   lcd.print("      ");
  352.   lcd.printByte(2);
  353.   lcd.setCursor(0, 2);
  354.   lcd.printByte(2);
  355.   lcd.print("      ");
  356.   if (temp_f_max < 10) {
  357.     lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  358.   }
  359.   lcd.print(temp_f_max, 1);                     // valeur de la température en Celcius
  360.   lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  361.   lcd.print("F");
  362.   lcd.print("      ");
  363.   lcd.printByte(2);
  364.   lcd.setCursor(0, 3);
  365.   lcd.printByte(1);
  366.   lcd.print("      ");
  367.   lcd.print(hum_max);                           // valeur de la température en Celcius
  368.   lcd.print("%");
  369.   lcd.print("      ");
  370.   lcd.printByte(1);
  371. }
  372.  
  373. /* ================================================================================================== */
  374. // fonction d'affichage des valeurs mini
  375. /* ================================================================================================== */
  376.  
  377. void showMin() {
  378.   lcd.setCursor(6, 0);
  379.   lcd.print("MINIMUM");
  380.   lcd.setCursor(0, 1);
  381.   lcd.printByte(2);
  382.   lcd.print("      ");
  383.   if (temp_c_min < 10) {
  384.     lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  385.   }
  386.   lcd.print(temp_c_min, 1);                     // valeur de la température en Celcius
  387.   lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  388.   lcd.print("C");
  389.   lcd.print("      ");
  390.   lcd.printByte(2);
  391.   lcd.setCursor(0, 2);
  392.   lcd.printByte(2);
  393.   lcd.print("      ");
  394.   if (temp_f_min < 10) {
  395.     lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  396.   }
  397.   lcd.print(temp_f_min, 1);                     // valeur de la température en Celcius
  398.   lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  399.   lcd.print("F");
  400.   lcd.print("      ");
  401.   lcd.printByte(2);
  402.   lcd.setCursor(0, 3);
  403.   lcd.printByte(1);
  404.   lcd.print("      ");
  405.   lcd.print(hum_min);                           // valeur de la température en Celcius
  406.   lcd.print("%");
  407.   lcd.print("      ");
  408.   lcd.printByte(1);
  409. }
  410.  
  411. /* ================================================================================================== */
  412. // fonction d'affichage de l'ecran (mode) 3
  413. /* ================================================================================================== */
  414.  
  415. void showAll3() {
  416.   RTC.get(rtc, true); {
  417.     lcd.setCursor(0, 0);
  418.     lcd.print("  ");
  419.     lcd.printByte(6);
  420.     lcd.print("  ");
  421.     if (rtc[4] < 10) {
  422.       lcd.print("0");                            // on rajoute un zéro si les minutes sont inférieures à 10
  423.     }
  424.     lcd.print(rtc[4]);
  425.     lcd.print("/");
  426.     if (rtc[5] < 10) {
  427.       lcd.print("0");                            // on rajoute un zéro si les minutes sont inférieures à 10
  428.     }
  429.     lcd.print(rtc[5]);
  430.     lcd.print("/");
  431.     lcd.print(rtc[6]);
  432.     lcd.print("  ");
  433.     lcd.printByte(6);
  434.     lcd.setCursor(0, 1);
  435.     lcd.printByte(0);
  436.     lcd.print("     ");
  437.     if (rtc[2] < 10) {
  438.       lcd.print("0");                             // on rajoute un zéro si les heures sont inférieures à 10
  439.     }
  440.     lcd.print( rtc[2]);                           // heures minutes secondes
  441.     if (etatDeuxPoints == 1){
  442.       lcd.print(":");                             // ":"
  443.     } else {
  444.       lcd.print(" ");                             // " "
  445.     }
  446.     if (rtc[1] < 10) {
  447.       lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  448.     }
  449.     lcd.print( rtc[1]);                           // valeur des minutes
  450.     if (etatDeuxPoints == 1){
  451.       lcd.print(":");                             // ":"
  452.     } else {
  453.       lcd.print(" ");                             // " "
  454.     }
  455.     if (rtc[0] < 10) {
  456.       lcd.print("0");                             // on rajoute un zéro si les secondes sont inférieures à 10
  457.     }
  458.     lcd.print( rtc[0]);
  459.     lcd.print("     ");
  460.     lcd.printByte(0);
  461.    
  462.     lcd.setCursor(0, 2);
  463.     lcd.printByte(2);
  464.     lcd.print("  ");
  465.     if (temp_c < 10) {
  466.       lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  467.     }
  468.     lcd.print(temp_c, 1);                         // valeur de la température en Celcius
  469.     lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  470.     lcd.print("C");
  471.     lcd.print(" - ");
  472.     lcd.print(temp_f, 1);                         // valeur de la température en Celcius
  473.     lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  474.     lcd.print("F");
  475.     lcd.print(" ");
  476.     lcd.printByte(2);
  477.     lcd.setCursor(0, 3);
  478.     lcd.printByte(1);
  479.     lcd.print("  ");
  480.     lcd.print(humidity);                          // valeur du taux d'humidité de l'air (en %)
  481.     lcd.print("%");
  482.     lcd.print("  -  ");
  483.     lcd.print(lumiere);                          // valeur de l'intensité lumineuse (en %)
  484.     lcd.print("%");
  485.     lcd.print("  ");
  486.     lcd.printByte(3);
  487.     etatDeuxPoints = !etatDeuxPoints;
  488.   }
  489. }
  490.  
  491. /* ================================================================================================== */
  492. // fonction d'affichage de l'ecran (mode) 2
  493. /* ================================================================================================== */
  494.  
  495. void showAll2() {
  496.   RTC.get(rtc, true); {                           // récupération des valeurs du module RTC
  497.     lcd.setCursor(0, 0);
  498.     if (rtc[4] < 10) {
  499.       lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  500.     }
  501.     lcd.print(rtc[4]);
  502.     lcd.print("/");
  503.     if (rtc[5] < 10) {
  504.       lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  505.     }
  506.     lcd.print(rtc[5]);
  507.     lcd.print("/");
  508.     lcd.print(rtc[6]);
  509.     lcd.print(" ");
  510.    
  511.     if (cyclePendule < 4){
  512.       if (cyclePendule == 2){
  513.         lcd.printByte(0);
  514.       } else if (cyclePendule == 1){
  515.         lcd.printByte(4);
  516.       } else if (cyclePendule == 3){
  517.         lcd.printByte(5);
  518.       }      
  519.       cyclePendule += 1;
  520.     }else{
  521.       cyclePendule = 0;
  522.       lcd.printByte(0);
  523.       cyclePendule += 1;
  524.     }
  525.    
  526.     if (rtc[2] < 10) {
  527.       lcd.print("0");                             // on rajoute un zéro si les heures sont inférieures à 10
  528.     }
  529.     lcd.print( rtc[2]);                           // heures minutes secondes
  530.     if (etatDeuxPoints == 1){
  531.       lcd.print(":");                             // ":"
  532.     } else {
  533.       lcd.print(" ");                             // " "
  534.     }
  535.     if (rtc[1] < 10) {
  536.       lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  537.     }
  538.     lcd.print( rtc[1]);                           // valeur des minutes
  539.     if (etatDeuxPoints == 1){
  540.       lcd.print(":");                             // ":"
  541.     } else {
  542.       lcd.print(" ");                             // " "
  543.     }
  544.     if (rtc[0] < 10) {
  545.       lcd.print("0");                             // on rajoute un zéro si les secondes sont inférieures à 10
  546.     }
  547.     lcd.print( rtc[0]);
  548.  
  549.     String ligne1 = String( jour[rtc[3] - 1]);
  550.     longueurLigne = ligne1.length();
  551.     if (longueurLigne <= 20){
  552.       positionCentrage = (20 - longueurLigne)/2;
  553.       lcd.setCursor(positionCentrage, 1);
  554.     }else{
  555.     lcd.setCursor(0, 1);
  556.     }
  557.     lcd.print(ligne1);
  558. /*
  559.     lcd.setCursor(6, 1);
  560.     lcd.print(jour[rtc[3] - 1]);
  561. */
  562.     lcd.setCursor(0, 2);
  563.     lcd.printByte(2);
  564.     lcd.print(" ");
  565.     lcd.print(temp_c, 1);                         // valeur de la température en Celcius
  566.     lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  567.     lcd.print("C - ");
  568.     lcd.printByte(1);
  569.     lcd.print(" ");
  570.     lcd.print(humidity);                          // valeur tu taux d'humidité de l'air (en %)
  571.     lcd.print("%");
  572.     lcd.setCursor(0, 3);
  573.     lcd.printByte(2);
  574.     lcd.print(" ");
  575.     lcd.print(temp_f, 1);                         // valeur de la température en Farenheight
  576.     lcd.write(223);                               // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  577.     lcd.print("F - ");
  578.     lcd.printByte(3);
  579.     lcd.print("   ");
  580.     lcd.print(lumiere);                         // valeur de l'intensité de la lumière (%)
  581.     lcd.print("%");
  582.     etatDeuxPoints = !etatDeuxPoints;    
  583.   }
  584. }
  585.  
  586. /* ================================================================================================== */
  587. // fonction d'affichage de l'ecran (mode) 1
  588. /* ================================================================================================== */
  589. //    Météo
  590. /* ================================================================================================== */
  591.  
  592. void showMeteo1 () {                              // fonction qui affiche la température et l'humidité
  593.   lcd.setCursor(0, 2);                            // position du curseur 1er caractère (0) 3ème ligne (2)
  594.   lcd.printByte(2);
  595.   lcd.print(" : ");
  596.   //lcd.print("T : ");                            // __T : __
  597.   lcd.print(temp_c, 1);                           // valeur de la température en Celcius
  598.   lcd.write(223);                                 // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  599.   lcd.print("C  (");                               // _C (_
  600.   lcd.print(temp_f, 1);                           // valeur de la température en Farenheight
  601.   lcd.write(223);                                 // caractère "°" (attenteion utiliser lcd.write(); pas lcd.print();
  602.   lcd.print("F)");                                // _F)_
  603.   lcd.setCursor(0, 3);                            // position du curseur 1er caractère (0) 4ème ligne (3)
  604.   lcd.printByte(1);
  605.   lcd.print(" : ");                               // _ : _
  606.   lcd.print(humidity);                            // valeur tu taux d'humidité de l'air (en %)
  607.   lcd.print("% - ");                              // _%_
  608.   lcd.printByte(3);
  609.   lcd.print(" : ");                               // _ : _
  610.   lcd.print(lumiere);                            // valeur tu taux d'humidité de l'air (en %)
  611.   lcd.print("%");                                 // _%_
  612. }
  613.  
  614. /* ================================================================================================== */
  615. //    Calendrier / Horloge
  616. /* ================================================================================================== */
  617.  
  618. void showtime1() {                                // fonction qui affiche l'heure
  619.   RTC.get(rtc, true);                             // récupération des valeurs du module RTC
  620.   {
  621.  
  622.     String ligne1 = String(jour[rtc[3] - 1]) + " " + String(rtc[4]);
  623.     if (rtc[4] < 2) {
  624.       ligne1 += "er";                             // on rajouter "er" apres le numero du jour si on est le 1er du mois
  625.     }
  626.     ligne1 += " " + String(mois[rtc[5] - 1]);
  627.     longueurLigne = ligne1.length();
  628.     if (longueurLigne <= 20){
  629.       positionCentrage = (20 - longueurLigne)/2;
  630.       lcd.setCursor(positionCentrage, 0);
  631.     }else{
  632.     lcd.setCursor(0, 0);
  633.     }
  634.     lcd.print(ligne1);
  635.    
  636. /*    lcd.setCursor(0, 0);                          // position du curseur 1er caractère (0) 1ère ligne (0)
  637.     lcd.print( jour[rtc[3] - 1]);                 // jour de la semaine
  638.     lcd.print(" ");                               // "espace"
  639.     lcd.print(rtc[4]);                            // date mois année : numéro du jour
  640.     if (rtc[4] < 2) {
  641.       lcd.print("er");                            // on rajouter "er" apres le numero du jour si on est le 1er du mois
  642.     }
  643.     lcd.print(" ");                               // "espace"
  644.     lcd.print( mois[rtc[5] - 1]);                 // mois de l'année
  645.     lcd.print(" ");                               // "espace"
  646.     //lcd.print( rtc[6]);                         // année avec "20" de 2000
  647. */
  648.     lcd.setCursor(0, 1);
  649.     lcd.printByte(0);
  650.     lcd.print(" : ");
  651.     if (rtc[2] < 10) {
  652.       lcd.print("0");                             // on rajoute un zéro si les heures sont inférieures à 10
  653.     }
  654.     lcd.print( rtc[2]);                           // heures minutes secondes
  655.     if (etatDeuxPoints == 1){
  656.       lcd.print(":");                             // ":"
  657.     } else {
  658.       lcd.print(" ");                             // " "
  659.     }                              // ":"
  660.     if (rtc[1] < 10) {
  661.       lcd.print("0");                             // on rajoute un zéro si les minutes sont inférieures à 10
  662.     }
  663.     lcd.print( rtc[1]);                           // valeur des minutes
  664.     if (etatDeuxPoints == 1){
  665.       lcd.print(":");                             // ":"
  666.     } else {
  667.       lcd.print(" ");                             // " "
  668.     }                              // ":"
  669.     if (rtc[0] < 10) {
  670.       lcd.print("0");                             // on rajoute un zéro si les secondes sont inférieures à 10
  671.     }
  672.     lcd.print( rtc[0]);                           // valeur des secondes
  673.     lcd.print("  ");
  674.     //lcd.printByte(6);
  675.     lcd.print(" ");
  676.     lcd.print(rtc[6]);
  677.     etatDeuxPoints = !etatDeuxPoints;
  678.   }
  679. }
  680.  
  681. /* ================================================================================================== */
  682. // fonction qui transforme les valeurs reçues du module 5 BP en numero de bouton
  683. /* ================================================================================================== */
  684.  
  685. int recupCle(unsigned int input) {                // transforme la valeur du clavier en numero de touche
  686.   int k;
  687.   for (k = 0; k < nombreCle; k++) {
  688.     if (input < valeurTouche[k]) {
  689.       return k;
  690.     }
  691.   }
  692.   if (k >= nombreCle) {
  693.     k = -1;                                       // En cas de valeur non valide
  694.   }
  695.   return k;
  696. }
  697.  
  698. /* ================================================================================================== */
  699. /* ================================================================================================== */
  700. // SETUP
  701. /* ================================================================================================== */
  702.  
  703. void setup() {
  704.   Serial.begin(9600);
  705.   lcd.init();                                     // initialisation de l'écran
  706.   Wire.begin();                                   // lancement connexion simplifiée
  707.   lcd.backlight();                                // éclairage de l'écran
  708.   lcd.createChar(0, pendule);                     // creation du caractère spécial pendule
  709.   lcd.createChar(1, goutte);                      // création du caractère spécial goutte
  710.   lcd.createChar(2, thermo);                      // création du caractère spécial thermometre
  711.   lcd.createChar(3, lum);                         // création du caractère spécial thermometre
  712.   lcd.createChar(4, pendulePre);                     // creation du caractère spécial pendule
  713.   lcd.createChar(5, pendulePost);                     // creation du caractère spécial pendule
  714.   lcd.createChar(6, cal);                     // creation du caractère spécial pendule
  715.  
  716.   //                      Mise à jour du Temps
  717.   if (update_mode) {                              // si updata_flag 1 l'heure est mise à jour
  718.     showtime1();                                  // on affiche l'heure actuelle
  719.     lcd.setCursor(5, 3);                          // sur la dernière ligne à partir de la cinquieme colonne
  720.     lcd.print("Ancienne heure");                  // on affiche l'heure actuelle
  721.     RTC.stop();                                   // on arete la l'horloge (RTC)
  722.     // valeurs de mise a jour du Temps
  723.     RTC.set(DS1307_SEC, TIME_SEC);                // secondes => (valeurs entrées ci dessus)
  724.     RTC.set(DS1307_MIN, TIME_MIN);                // minutes => (valeurs entrées ci dessus)
  725.     RTC.set(DS1307_HR, TIME_HR);                  // heures => (valeurs entrées ci dessus)
  726.     RTC.set(DS1307_DOW, TIME_DOW);                // jour de la semaine => (valeurs entrées ci dessus)
  727.     RTC.set(DS1307_DATE, TIME_DATE);              // numéro du jour du mois => (valeurs entrées ci dessus)
  728.     RTC.set(DS1307_MTH, TIME_MTH);                // mois => (valeurs entrées ci dessus)
  729.     RTC.set(DS1307_YR, TIME_YR);                  // année => (valeurs entrées ci dessus)
  730.     RTC.start();                                  // l'horloge (RTC) est relancée avec les nouvelles valeurs
  731.     showtime1();                                  // on affiche la nouvelle heure
  732.     lcd.setCursor(3, 3);                          // sur la dernière ligne à partir de la troisieme colonne
  733.     lcd.print("Heure mise à jour");               // on affiche que c'est fait
  734.  
  735.   } else {                                        // sinon on lance le Temps
  736.  
  737.     cycle = millis();                             // marquage temporel pour les secondes
  738.     cycleSensor = millis() + MargeCycleSensor;    // marquage plus marge pour les senseurs (1 seule fois)
  739.  
  740.   }
  741. }
  742.  
  743. /* ================================================================================================== */
  744. /* ================================================================================================== */
  745. // LOOP
  746. /* ================================================================================================== */
  747.  
  748. void loop() {
  749.  
  750.   // 1. on prend les valeurs lumière, température et humidité des capteur
  751.  
  752.   if (millis() - cycleSensor >= MargeCycleSensor) {     // toutes les 30s
  753.     lumiere = map(analogRead(pinAnalogLumiere), 0, 1023, 0, 100);
  754.     cycleSensor = millis();                             // réinitialisation du repère temporel des senseurs
  755.     temp_c = sht15.readTemperatureC();                  // lecture température celsius
  756.     temp_f = sht15.readTemperatureF();                  // lecture température Farenheit
  757.     humidity = sht15.readHumidity();                    // lecture taux d'humidité
  758.  
  759.     // 2. on met a jour les valeurs min et max si nécessaire
  760.  
  761.     if (temp_c > temp_c_max) {                          // si la température mesurée est supérieure à la température max enregistrée
  762.       temp_c_max = temp_c;                              // alors la température mesurée devient la température max
  763.     }
  764.  
  765.     if (temp_c < temp_c_min) {                          // (voir ci dessus et remplacer "max" par "min")
  766.       temp_c_min = temp_c;                              //
  767.     }
  768.  
  769.     if (temp_f > temp_f_max) {                          // meme principe que ci dessus : "voir ci-dessus et remplacer
  770.       temp_f_max = temp_f;                              //
  771.     }
  772.  
  773.     if (temp_f < temp_f_min) {                          // (pareil...)
  774.       temp_f_min = temp_f;                              //
  775.     }
  776.  
  777.     if (humidity > hum_max) {                           // ...
  778.       hum_max = humidity;                               //
  779.     }
  780.  
  781.     if (humidity < hum_min) {                           //
  782.       hum_min = humidity;                               //
  783.     }
  784.  
  785.   }
  786.  
  787.   // 3. on met à jour l'affichage toutes les secondes
  788.   // c'est ici que seront gérés les modes d'affichage contrôlé par un module 5 BP
  789.  
  790.   // Contrôle du mode d'affichage par le module 5 boutons
  791.   // https://wiki.dfrobot.com/ADKeyboard_Module__SKU__DFR0075_
  792.  
  793.   // on détermine le numero du mode d'affichage à faire
  794.   // ce numero va de 0 à nombreMode + 2
  795.   // nombreMode est le nombre d'affichage des valeurs
  796.   // il faut y rajouter 2 valeurs supplémentaire pour Min et Max
  797.  
  798.   cleActive = analogRead(0);                            // on recupere la valeur du bouton enfoncé
  799.   cle = recupCle(cleActive);                            // on la transforme en numero de bouton
  800.   if (cle != ancienneCle) {                             // on vient d'enfoncer
  801.     delay(50);                                          // pause'café
  802.     cleActive = analogRead(0);                          // on relit la valeur
  803.     cle = recupCle(cleActive);                          // on la transforme en numero de bouton
  804.     if (cle != ancienneCle) {                           // on vient de le relacher
  805.       ancienneCle = cle;                                // reaffectation
  806.       if (cle >= 0) {                                   // vérification validité
  807.         switch (cle) {                                  // on voit alors les différents cas
  808.           case 0:                                       // cle = 0; bouton 1 "haut"
  809.             if (modeAff <= 3) {                         // si on vient d'un mode affichage "horloge"
  810.               modeAffMem = modeAff;                     // on garde cette valeur en memoire
  811.             }
  812.             modeAff = (nombreMode + 1);                 // 3
  813.             lcd.clear();                                // efface ecran
  814.             break;                                      // stop => etape suivante
  815.           case 1:                                       // cle = 1; bouton 2 "gauche"
  816.             if (modeAff > 0) {                          // on vérifie qu'on soit pas au bout
  817.               modeAff -= 1;                             // on retire 1
  818.             } else {                                    // sinon
  819.               modeAff = nombreMode;                     // on passe au max
  820.             }
  821.             lcd.clear();                                // efface ecran
  822.             break;                                      // stop => etape suivante
  823.           case 2:                                       // cle = 2; bouton 3 "bas"
  824.             if (modeAff <= 3) {                         // si on vient d'un mode affichage "horloge"
  825.               modeAffMem = modeAff;                     // on garde cette valeur en memoire
  826.             }
  827.             modeAff = (nombreMode + 2);                 // 4
  828.             lcd.clear();                                // on vide l'ecran pour l'affichage du mode a venir
  829.             break;                                      // stop => etape suivante
  830.           case 3:                                       // cle = 3; bouton 4 "droite"
  831.             if (modeAff < nombreMode) {                 // si on est pas au "bout haut" des modes (nombreMode)
  832.               modeAff += 1;                             // on passe au niveau suivant (+1)
  833.             } else {                                    // sinon
  834.               modeAff = 0;                              // on remet le mode au "bout bas" des modes (0)
  835.             }
  836.             lcd.clear();                                // efface ecran
  837.             break;                                      // stop => etape suivante
  838.           case 4:                                       // pas encore utilisé bouton du milieu
  839.             if (modeAff > nombreMode) {                 // Si on est en mode mini ou maxi
  840.               modeAff = modeAffMem;                     // on rappelle le mode d'affichage mémorisé
  841.             }
  842.             lcd.clear();
  843.             break;                                      // stop => etape suivante
  844.         }
  845.       }
  846.     }
  847.   }
  848.  
  849.   if (millis() - cycle >= 500) {                     // toutes les secondes
  850.     cycle = millis();                                 // réinitialisation du repère temporel de l'heure (seconde)
  851.     if (update_mode == 0) {                           // si updata_flag 0
  852.  
  853.       switch (modeAff) {
  854.         case 0:
  855.           //afficheLumiere();
  856.           showtime1();                                // Affichage Mode 1
  857.           showMeteo1();
  858.           break;
  859.         case 1:
  860.           showAll2();                                 // Affichage Mode 2
  861.           break;
  862.         case 2:
  863.           showAll3();                                 // Affichage Mode 3
  864.           break;
  865.         case 3:
  866.           showDefil1();                               // Affichage Mode 4
  867.           break;
  868.         case 4:
  869.           showMax();                                 // Affichage Mode Max
  870.           break;
  871.         case 5:
  872.           showMin();                                 // Affichage Mode Min
  873.           break;
  874.       }
  875.     }
  876.   }
  877. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement