claudiusmarius

thermochagpt

Oct 20th, 2025
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 164.63 KB | None | 0 0
  1. /**************************************************************************************************************************************************************************
  2. //**************************************************** Thermomètre Navette Textile v3.0Claude Menu - Carte Nano (com25) ****************************************************
  3. //**************************************************************************************************************************************************************************
  4. // Version opérationnelle avec un risque d'instabilité du programme.
  5. // Dfplayer opérationnel.
  6. // Buzzer système.
  7. // Stockage des messages à afficher sur l'écran OLED en mémoire programme. (Mémoire Flash)
  8. // Prise en compte des éventuels évènements lors des boucles bloquantes :
  9. //  - Détection des changements d'état des Dip Switch,
  10. //  - Détection des changements d'état des boutons poussoirs
  11. //  - Détection de la date et l'heure de départ du compte à rebours de la nouvelle année,
  12. //  - Détection de la nouvelle heure pour l'annonce audio,
  13. //  - Détection du changement de la valeur du potentiomètre du volume du Dfplayer.
  14. // Points clignotants de l'heure sur l'écran OLED.
  15. // Compte à rebours de la nouvelle année sur l'écran OLED.
  16. // Moyenne de 50 relevés effectués sur la LDR.
  17. // Echelle 1 de 10 à 36.5° et Echelle 2 de 20 à 46.5°.
  18. // Led55 alumée = Echelle 1; Led55 et led54 = Echelle 2.
  19. // Animation des barrettes de leds adressables après le compte à rebours de la nouvelle année.
  20. // Menu Réglage heure, date.
  21. //**************************************************************************************************************************************************************************
  22. #include <Wire.h>                                                                                                                     // Librairie pour la gestion de la communication I2C
  23. #include <Adafruit_SSD1306.h>                                                                                                         // Librairie pour la gestion de l'afficheur OLED 1.3" (128x64)
  24. #include <Adafruit_NeoPixel.h>                                                                                                        // Librairie pour la gestion des Barrettes de leds adressables Neopixel (WS2812B)
  25. #include <SPI.h>                                                                                                                      // Librairie pour la gestion de la communication SPI avec le Module Horloge DS3234
  26. #include <SparkFunDS3234RTC.h>                                                                                                        // Librairie pour la gestion du Module Horloge DS3234
  27. #include "DHT.h"                                                                                                                      // Librairie pour la gestion du Capteur DHT22 (Température et Taux Humidité)
  28. #include "DFRobotDFPlayerMini.h"                                                                                                      // Librairie pour la gestion du Module Audio Dfplayer
  29. #include <TimerOne.h>                                                                                                                 // Librairie pour la gestion de l'interruption logicielle par Timer
  30. #include <avr/pgmspace.h>                                                                                                             // Librairie pour la gestion de la Mémoire
  31. /*#include <avr/pgmspace.h>*/
  32. #define DHTTYPE DHT22                                                                                                                 // Définit le type de capteur (Température et Taux Humidité)
  33.  
  34. #define BrocheBPDroite              A2                                                                                                // Broche Entrée Bouton Poussoir "Droite"
  35. #define BrocheBPOK                  A3                                                                                                // Broche Entrée Bouton Poussoir "OK"
  36. #define BrocheBPGauche              A1                                                                                                // Broche Entrée Bouton Poussoir "Gauche"
  37. #define BrocheDipSwitchMuteGeneral  2                                                                                                 // Broche Entrée Dip Switch Mute Général
  38. #define BrocheDipSwitchMutePartiel  3                                                                                                 // Broche Entrée Dip Switch Mute Partiel
  39. #define BrocheDipSwitchVoix         5                                                                                                 // Broche Entrée Dip Switch Voix
  40. #define BrochePotentiometreVolume   A6                                                                                                // Broche Entrée Potentiomètre du Volume du Dfplayer
  41. #define BrocheLDR                   A7                                                                                                // Broche Entrée Cellule Photoélectrique LDR
  42. #define BrocheBuzzer                A0                                                                                                // Broche du Buzzer 5v
  43. #define BrocheCapteurDHT22          7                                                                                                 // Broche du Capteur DHT22
  44. #define BrocheBarrettesTemperature  6                                                                                                 // Broche d'entrée (DIN) des Barrettes de leds adressables Neopixel pour l'affichage de la température courante et des vitesses de variations de la température et du taux d'humidité
  45. #define BrocheDS3234                10                                                                                                // Broche du Module Horloge DS3234
  46. #define BrocheOledReset             4                                                                                                 // Broche du Reset le l'Afficheur OLED
  47.  
  48. Adafruit_SSD1306 display(BrocheOledReset);                                                                                            // Crée l'objet "display"
  49.  
  50. const byte numLedRougeEchelleTemp1 PROGMEM = 55;                                                                                      // Définit la led 55 témoin de l'échelle de Température 1 ou 2 (10° à 36.5°)
  51. const byte numLedRougeEchelleTemp2 PROGMEM = 54;                                                                                      // Définit la led 54 témoin de l'échelle de Température 2 (20° à 46.5°)
  52.  
  53. const byte nombreLedsColonne PROGMEM = 56;                                                                                            // Nombre de leds adressables de la colonne pour l'affichage de la température courante et des vitesses de variations de la température et du taux d'humidité (7 barrettes de 8 leds)
  54.  
  55. int LastvaleurLuminositeAmbiante = -1;                                                                                                // Dernière valeur de la luminosité ambiante lue par la LDR
  56.  
  57. float tauxHumiditeCourant = 0;                                                                                                        // Taux d'humidité courant relevé par le capteur DHT22
  58. float LasttauxHumiditeCourant = -1;                                                                                                   // Dernière valeur courante du taux d'humidité courant relevée par le capteur DHT22
  59. float temperatureCourante = 0;                                                                                                        // Température courante relevée par le capteur DHT22
  60. float LasttemperatureCourante = -1;                                                                                                   // Dernière valeur courante de la température courante relevée par le capteur DHT22
  61.  
  62. const byte k PROGMEM = 150;                                                                                                           // Coefficient pour le calcul de la vitesse de la variation de la température et de la vitesse de la variation du taux d'humidité
  63. float T1 = 0;                                                                                                                         // Relevé de la première température pour le calcul de la vitesse de la variation de la température
  64. float T2 = 0;                                                                                                                         // Relevé de la deuxième température pour le calcul de la vitesse de la variation de la température
  65. float H1 = 0;                                                                                                                         // Relevé du premier taux d'humidité pour le calcul de la vitesse de la variation du taux d'humidité
  66. float H2 = 0;                                                                                                                         // Relevé du deuxième taux d'humidité pour le calcul de la vitesse de la variation du taux d'humidité
  67. unsigned long t1TempoReleveVariations = 0;                                                                                            // Début de la temporisation pour le calcul et l'affichage des vitesses de variations de la température et du taux d'humidité
  68. boolean MajAffichageVariations = false;                                                                                               // Indicateur Activation / Désactivation de l'affichage des vitesses de variations de la température et du taux d'humidité
  69. const unsigned long FrequenceReleveVariations PROGMEM = 30000;                                                                        // Fréquence de calcul et d'affichage des vitesses de variations de la température et du taux d'humidité
  70. const unsigned long TempoAffichageVariations PROGMEM = 5000;                                                                          // Durée de l'affichage des vitesses de la variations de la température et du taux d'humidité
  71.  
  72. byte PageOled = 0;                                                                                                                    // Page courante de l'écran OLED
  73. unsigned long t1TempoAffichageMessageOled = 0;                                                                                        // Début de la temporisation de la durée d'affichage de certains messages sur l'écran OLED (3 secondes)
  74. const unsigned long TempoAffichageMessageOled PROGMEM = 3000;                                                                         // Durée d'affichage des messages sur l'écran OLED
  75.  
  76. boolean MajAffichageTemperatureCourante = false;                                                                                      // Indicateur Activation / Désactivation de l'affichage de la température courante sur la colonne de leds
  77. boolean MajTauxHumiditeCourant = false;                                                                                               // Indicateur Activation / Désactivation de l'affichage du taux d'humidité courant sur l'afficheur Oled
  78.  
  79. byte Hrs = 0;                                                                                                                         // Heure Courante
  80. byte Mins = 0;                                                                                                                        // Minutes courante
  81. byte Secs = 0;                                                                                                                        // Seconde Courante
  82. int LastMins = -1;                                                                                                                    // Dernière valeur courante des minutes
  83. volatile boolean Osc2Points = true;                                                                                                   // Indicateur pour l'oscillation des 2 points de l'affichage de l'heure sur l'écran OLED
  84.  
  85. byte Jour = 0;                                                                                                                        // Jour du mois de la date courante (1 à 31)
  86. byte Mois = 0;                                                                                                                        // Mois de la date courante (1 à 12)
  87. byte Annee = 0;                                                                                                                       // Année de la date courante (0 à 99)
  88. int LastJour = -1;                                                                                                                    // Dernière valeur courante du jour du mois
  89.  
  90. boolean LastEtatDipSwitchMuteGeneral = HIGH;                                                                                          // Dernier état de l'entrée du Dip Switch Mute Général
  91. boolean LastEtatDipSwitchMutePartiel = HIGH;                                                                                          // Dernier état de l'entrée du Dip Switch Mute Partiel
  92. boolean LastEtatDipSwitchVoix = HIGH;                                                                                                 // Dernier état de l'entrée du Dip Switch Voix
  93. boolean EtatDipSwitchMuteGeneral = HIGH;                                                                                              // Etat de l'entrée du Dip Switch Mute Général
  94. boolean EtatDipSwitchMutePartiel = HIGH;                                                                                              // Etat de l'entrée du Dip Switch Mute Partiel
  95. boolean EtatDipSwitchVoix = HIGH;                                                                                                     // Etat de l'entrée du Dip Switch Mute Voix
  96.  
  97. boolean LastetatBPOK = HIGH;                                                                                                          // Dernier état courant de l'entrée du bouton poussoir BPOK
  98. boolean etatBPOK = HIGH;                                                                                                              // Etat courant de l'entrée du bouton poussoir BPOK
  99. boolean etatBPDroite = HIGH;                                                                                                          // Etat courant de l'entrée du bouton poussoir BPDroite
  100. boolean etatBPGauche = HIGH;                                                                                                          // Etat courant de l'entrée du bouton poussoir BPGauche
  101.  
  102. boolean MuteGeneral = false;                                                                                                          // Indicateur du Mode Mute Général (0 ou 1)
  103. boolean MutePartiel = false;                                                                                                          // Indicateur du Mode Mute Partiel (0 ou 1)
  104. boolean Voix = false;                                                                                                                 // Indicateur de la voix sélectionnée (1 ou 2)
  105. const byte HrsDebutMutePartiel PROGMEM = 23;                                                                                          // Heure du Début du Mute Partiel
  106. const byte HrsFinMutePartiel PROGMEM = 6;                                                                                             // Heure de Fin du Mute Partiel
  107.  
  108. int valeurPotentiometreVolume = 0;                                                                                                    // Valeur courante lue sur la broche du potentiomètre du volume du Dfplayer
  109. int LastvaleurPotentiometreVolume = -1;                                                                                               // Dernière valeur courante lue sur la broche du potentiomètre du volume du Dfplayer
  110. byte VolumeDfplayer = 30;                                                                                                             // Volume par défaut du Dfplayer
  111.  
  112. int nbCycleAnimationCompteAReboursBarrettesLeds = 0;                                                                                  // Nombre de cycles de l'animation du compte à rebours de la nouvelle année
  113.  
  114. byte brightnessBarrettes = 0;                                                                                                         // Variable contenant la valeur courante de la luminosité des barrettes de leds adressables
  115.  
  116. boolean ModeMenu = false;                                                                                                             // Indicateur activation / désactivation du mode menu
  117. boolean ModeReglages = false;                                                                                                         // Indicateur activation / désactivation du mode réglages
  118. const byte PageMenuMin PROGMEM = 10;                                                                                                  // Page menu minimum
  119. const byte PageMenuMax PROGMEM = 20;                                                                                                  // Page menu maximum
  120. unsigned long t1TempoSortieModeMenu = 0;                                                                                              // Début de la temporisation de sortie automatique du mode menu
  121. const unsigned long TempoSortieModeMenu PROGMEM = 15000;                                                                              // Durée de la temporisation de sortie automatique du mode menu
  122.  
  123. const byte HrsCompteRebours PROGMEM = 23;                                                                                             // Heures, minutes et date auxquelles se déclenche le compte à rebours de la nouvelle année
  124. const byte MinsCompteRebours PROGMEM = 50;
  125. const byte JourCompteRebours PROGMEM = 31;
  126. const byte MoisCompteRebours PROGMEM = 12;
  127.  
  128. byte Hrstemp = 0;                                                                                                                     // Heures temporaires de réglages
  129. byte Minstemp = 0;                                                                                                                    // Minutes temporaires de réglages
  130. byte Jourtemp = 0;                                                                                                                    // Date temporaire de réglages
  131. byte Moistemp = 0;
  132. byte Anneetemp = 0;
  133.  
  134. const char messageOLED00[] PROGMEM = "0";                                                                                             // Messages OLED stockés en mémoire programme (Mémoire flash)
  135. const char messageOLED01[] PROGMEM = ":";
  136. const char messageOLED02[] PROGMEM = "/";
  137. const char messageOLED03[] PROGMEM = "%";
  138. const char messageOLED04[] PROGMEM = "MUTE";
  139. const char messageOLED05[] PROGMEM = "GENERAL";
  140. const char messageOLED06[] PROGMEM = "PARTIEL";
  141. const char messageOLED07[] PROGMEM = "ACTIVE";
  142. const char messageOLED08[] PROGMEM = "DESACTIVE";
  143. const char messageOLED09[] PROGMEM = "SELECTION";
  144. const char messageOLED10[] PROGMEM = "VOIX";
  145. const char messageOLED11[] PROGMEM = "1";
  146. const char messageOLED12[] PROGMEM = "2";
  147. const char messageOLED13[] PROGMEM = "VOLUME";
  148. const char messageOLED14[] PROGMEM = "VITESSE";
  149. const char messageOLED15[] PROGMEM = "VARIATION";
  150. const char messageOLED16[] PROGMEM = "TEMP";
  151. const char messageOLED17[] PROGMEM = "HUMIDITE";
  152. const char messageOLED18[] PROGMEM = " ";
  153. const char messageOLED19[] PROGMEM = "BONNE";
  154. const char messageOLED20[] PROGMEM = "ANNEE";
  155. const char messageOLED21[] PROGMEM = "20";
  156. const char messageOLED22[] PROGMEM = "REGLAGE";
  157. const char messageOLED23[] PROGMEM = "<TAPEZ OK>";
  158. const char messageOLED24[] PROGMEM = "REGLEZ";
  159. const char messageOLED25[] PROGMEM = "HEURE";
  160. const char messageOLED26[] PROGMEM = "DATE";
  161. const char messageOLED27[] PROGMEM = "LE JOUR";
  162. const char messageOLED28[] PROGMEM = "LE MOIS";
  163. const char messageOLED29[] PROGMEM = "L'ANNEE";
  164.  
  165. Adafruit_NeoPixel colonneLed(nombreLedsColonne, BrocheBarrettesTemperature, NEO_GRB + NEO_KHZ800);                                    // Crée l'objet "colonneLed"
  166.  
  167. DHT dht(BrocheCapteurDHT22, DHTTYPE);                                                                                                 // Crée l'objet "dht"
  168.  
  169. DFRobotDFPlayerMini myDFPlayer;                                                                                                       // Crée l'objet "myDFPlayer"
  170.  
  171. void setup()
  172. {
  173.   Serial.begin(9600);                                                                                                                 // Démarre la voie série pour la communication avec le Dfplayer
  174.  
  175.   pinMode(BrocheBuzzer, OUTPUT);                                                                                                      // Configure la broche en sortie
  176.  
  177.   pinMode(BrocheDipSwitchMuteGeneral, INPUT_PULLUP);                                                                                  // Configure les broches en entrées
  178.   pinMode(BrocheDipSwitchMutePartiel, INPUT_PULLUP);
  179.   pinMode(BrocheDipSwitchVoix, INPUT_PULLUP);
  180.   pinMode(BrocheBPDroite, INPUT_PULLUP);
  181.   pinMode(BrocheBPOK, INPUT_PULLUP);
  182.   pinMode(BrocheBPGauche, INPUT_PULLUP);
  183.  
  184.   display.begin(SSD1306_SWITCHCAPVCC, 0x3D);                                                                                          // Initialise l'adresse de l'afficheur OLED avec la valeur 0x3D
  185.   display.clearDisplay();                                                                                                             // Efface l'afficheur OLED
  186.   display.setTextColor(WHITE, BLACK);                                                                                                 // Définit la couleur des caractères et la couleur du fond
  187.  
  188.   dht.begin();                                                                                                                        // Démarre la librairie du capteur DHT22
  189.  
  190.   colonneLed.begin();                                                                                                                 // Démarre la librairie Neopixels pour la gestion des barrettes de leds adressables
  191.   colonneLed.setBrightness(brightnessBarrettes);                                                                                      // Définit la luminosité des barrettes de leds adressables
  192.   FonctionEffaceBarrettesLeds();                                                                                                      // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  193.  
  194.   LectureDipSwitch();                                                                                                                 // Appelle la fonction de lecture des Dip Switch pour initialiser leurs états
  195.   if (!EtatDipSwitchMuteGeneral) {LastEtatDipSwitchMuteGeneral = LOW; MuteGeneral = true;}                                            // Mute général activé
  196.   if (!EtatDipSwitchMutePartiel) {EtatDipSwitchMutePartiel = LOW; MutePartiel = true;}                                                // Mute partiel activé
  197.   if (!EtatDipSwitchVoix)        {LastEtatDipSwitchVoix = LOW; Voix = true;}                                                          // 2ème voix activée
  198.  
  199.   rtc.begin(BrocheDS3234);                                                                                                            // Initialisation de la librairie du module horloge DS3234
  200. rtc.setTime(0, 55, 23, 2, 31, 12, 19);                                                                                               // Réglage Heure / Date (Secs, Minutes, Heures, Jour de la semaine, Jour du mois, Mois, Année)
  201.  
  202.   myDFPlayer.begin(Serial);                                                                                                           // Initialisation de la librairie du Dfplayer
  203.   myDFPlayer.volume(VolumeDfplayer);                                                                                                  // Définit le volume du Dfplayer par défaut
  204.  
  205.   Timer1.initialize(500000);                                                                                                          // Interruption toutes les demi-secondes (1000000µs = 1s)
  206.   Timer1.attachInterrupt(Oscillations2Points);                                                                                        // Fonction Oscillations2Points exécutée toutes les demi-secondes
  207.  
  208.   randomSeed(analogRead(7));                                                                                                          // Initialise la fonction ramdom()
  209.  
  210.   Buzzer(20, 0, 1);                                                                                                                   // Active le buzzer 20ms
  211.  
  212. //**************************************************************************************************************************************************************************
  213. }
  214.  
  215. void loop()
  216. {
  217. //**************************************************************************************************************************************************************************
  218. //*********************************************************************************************************************************** // GESTION DE LA LECTURE DE L'HEURE **
  219.   FonctionLectureDS3234(); // ******************************************************************************************************* // Appelle la fonction de la gestion du module RTC DS3234
  220.  
  221. //**************************************************************************************************************************************************************************
  222. //*********************************************************************************************************************************** // GESTION DU COMPTE A REBOURS *******
  223.   if (Jour == pgm_read_byte(&JourCompteRebours) && Mois == pgm_read_byte(&MoisCompteRebours) // ************************************* // Si la date et l'heure de départ du compte à rebours de la nouvelle année sont atteintes
  224.    && Hrs == pgm_read_byte(&HrsCompteRebours) && Mins == pgm_read_byte(&MinsCompteRebours) && Secs == 50)
  225.   {
  226.     int compteReboursSecs = 0;                                                                                                        // Déclare la variable pour le calcul du compte à rebours de la nouvelle année des secondes et pour l'afficher à partir de 10
  227.     byte numerodeLedDepartCompteARebours = 0;                                                                                         // Déclare les variables de l'affichage du compte à rebours de la nouvelle année sur les barrettes de leds adressables
  228.     byte nbledsCompteARebours = 0;
  229.    
  230.     FonctionEffaceBarrettesLeds();                                                                                                    // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  231.    
  232.     myDFPlayer.play(49);                                                                                                              // Lit le fichier compte à rebours de la nouvelle année
  233.    
  234.     while(1) // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Tant que le compte à rebours des secondes n'est pas fini
  235.     {
  236.       FonctionLectureDS3234();                                                                                                        // Appelle la fonction de la gestion du module RTC DS3234
  237.      
  238.       FonctionCadre(1);                                                                                                               // Efface l'afficheur OLED et Affiche le cadre (Taille police)
  239.      
  240.       compteReboursSecs = abs(Secs - 60);                                                                                             // Calcule la valeur du compte à rebours des secondes pour l'afficher à partir de 10
  241.      
  242.       display.setTextSize(5);                                                                                                         // Définit la taille du texte
  243.       display.setCursor(37, 12);                                                                                                      // Positionne l'affichage du compte à rebours des secondes
  244.      
  245.       if (compteReboursSecs == 60) // ----------------------------------------------------------------------------------------------- // Si le compte à rebours des secondes est fini
  246.       {
  247.         colonneLed.setBrightness(150);                                                                                                // Définit la luminosité des barrettes de leds adressables
  248.         display.setTextSize(3);                                                                                                       // Définit la taille du texte
  249.        
  250.         unsigned long timeout = millis();                                                                                             // Déclare et Démarre la temporisation d'affichage clignotante du message "BONNE ANNEE"
  251.         while (millis() - timeout <= 5000) // ....................................................................................... // Affiche le message "BONNE ANNEE" clignotant
  252.         {
  253.           FonctionEffaceBarrettesLeds();                                                                                              // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  254.           FonctionCadre(0);                                                                                                           // Efface l'afficheur OLED et Affiche le cadre (Aucune taille police)
  255.           display.setCursor(20, 7); LectureMemoireFlash(messageOLED19);                                                               // Affiche le message "BONNE"
  256.           display.setCursor(20, 35); LectureMemoireFlash(messageOLED20);                                                              // Affiche le message "ANNEE"
  257.           display.display();                                                                                                          // Rafraîchit l'affichage de l'écran OLED
  258.          
  259.           unsigned long timeout1 = millis();                                                                                          // Démarre la temporisation lors de laquelle le message est affiché
  260.           while (millis() - timeout1 <= 700) // ===================================================================================== // Tant que la temporisation lors de laquelle le message est affiché n'est pas écoulée
  261.           {
  262.             unsigned long timeout2 = millis();                                                                                        // Démarre la temporisation corespondant à la fréquence d'effacement des barrettes de leds adressables
  263.             while (millis() - timeout2 <= 150) // ___________________________________________________________________________________ // Tant que la temporisation corespondant à la fréquence d'effacement des barrettes de leds adressables n'est pas écoulée
  264.             {
  265.               AnimationCompteAReboursBarrettesLeds();                                                                                 // Appelle la fonction d'animation du compte à rebours de la nouvelle année sur les barrettes de leds adressables
  266.             }
  267.             while (millis() - timeout2 <= 200) // ___________________________________________________________________________________ // Tant que la temporisation corespondant à la durée d'effacement des barrettes de leds adressables n'est pas écoulée
  268.             {
  269.               FonctionEffaceBarrettesLeds();                                                                                          // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  270.             }
  271.           }
  272.          
  273.           FonctionEffaceBarrettesLeds();                                                                                              // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  274.           FonctionCadre(0);                                                                                                           // Efface l'afficheur OLED et Affiche le cadre (Aucune taille police)
  275.           display.display();                                                                                                          // Rafraîchit l'affichage de l'écran OLED
  276.          
  277.           timeout1 = millis();                                                                                                        // Démarre la temporisation lors de laquelle le message n'est pas affiché
  278.           while (millis() - timeout1 <= 300) // ===================================================================================== // Tant que la temporisation lors de laquelle le message n'est pas affiché n'est pas écoulée
  279.           {
  280.             unsigned long timeout2 = millis();                                                                                        // Démarre la temporisation corespondant à la fréquence d'effacement des barrettes de leds adressables
  281.             while (millis() - timeout2 <= 150) // ___________________________________________________________________________________ // Tant que la temporisation corespondant à la fréquence d'effacement des barrettes de leds adressables n'est pas écoulée
  282.             {
  283.               AnimationCompteAReboursBarrettesLeds();                                                                                 // Appelle la fonction d'animation du compte à rebours de la nouvelle année sur les barrettes de leds adressables
  284.             }
  285.             while (millis() - timeout2 <= 200) // ___________________________________________________________________________________ // Tant que la temporisation corespondant à la durée d'effacement des barrettes de leds adressables n'est pas écoulée
  286.             {
  287.               FonctionEffaceBarrettesLeds();                                                                                          // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  288.             }
  289.           }
  290.         }
  291.        
  292.         display.setTextSize(4);                                                                                                       // Définit la taille du texte
  293.        
  294.         timeout = millis();                                                                                                           // Redémarre la temporisation d'affichage fixe de la variable "Année"
  295.         while (millis() - timeout <= 5000) // ....................................................................................... // Affiche la variable "Année" fixe
  296.         {
  297.           FonctionEffaceBarrettesLeds();                                                                                              // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  298.           FonctionCadre(0);                                                                                                           // Efface l'afficheur OLED et Affiche le cadre (Aucune taille police)
  299.           display.setCursor(18, 17); LectureMemoireFlash(messageOLED21); display.print(Annee);                                        // Affiche "20" et Affiche la variable "Année"
  300.           display.display();                                                                                                          // Rafraîchit l'affichage de l'écran OLED
  301.           unsigned long timeout1 = millis();                                                                                          // Démarre la temporisation corespondant à la fréquence d'effacement des barrettes de leds adressables n'est pas écoulée
  302.           while (millis() - timeout1 <= 150) // ===================================================================================== // Tant que la temporisation corespondant à la fréquence d'effacement des barrettes de leds adressables n'est pas écoulée
  303.           {
  304.             AnimationCompteAReboursBarrettesLeds();                                                                                   // Appelle la fonction d'animation du compte à rebours de la nouvelle année sur les barrettes de leds adressables
  305.           }
  306.         }
  307.        
  308.         FonctionEffaceBarrettesLeds();                                                                                                // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  309.         colonneLed.setBrightness(brightnessBarrettes);                                                                                // Restaure la luminosité des barrettes de leds adressables
  310.         FonctionCadre(1);                                                                                                             // Efface l'afficheur OLED et Affiche le cadre (Taille police)
  311.         display.display();                                                                                                            // Rafraîchit l'affichage de l'écran OLED
  312.         delay(300);                                                                                                                   // Temporise 300ms
  313.        
  314.         numerodeLedDepartCompteARebours = 0;                                                                                          // Réinitialise les variables de l'affichage du compte à rebours de la nouvelle année sur les barrettes de leds adressables
  315.         nbledsCompteARebours = 0;
  316.         nbCycleAnimationCompteAReboursBarrettesLeds = 0;
  317.         LastvaleurLuminositeAmbiante = -1;                                                                                            // Force le calcul de la luminosité des barrettes de leds adressables
  318.         LastMins = -1;                                                                                                                // Force l'affichage de l'heure courante
  319.         LastJour = -1;                                                                                                                // Force l'affichage de la date courante
  320.         LasttauxHumiditeCourant = -1;                                                                                                 // Force l'affichage du taux d'humidité courant
  321.         t1TempoReleveVariations = 0;                                                                                                  // Réinitialise la temporisation pour le calcul et l'affichage des vitesses de variations de la température et du taux d'humidité
  322.         MajAffichageVariations = false;                                                                                               // Désactive l'indicateur de mise à jour des vitesses de variations de la température et du taux d'humidité
  323.         MajAffichageTemperatureCourante = true;                                                                                       // Active l'indicateur de mise à jour de l'affichage des barrettes de leds adressables
  324.         LasttemperatureCourante = -1;                                                                                                 // Force l'affichage de la température courante
  325.         PageOled = 0;                                                                                                                 // Sélectionne la Page 0 de l'écran OLED
  326.         break;                                                                                                                        // Sort de la boucle while()
  327.       }
  328.       else if (compteReboursSecs < 10) {LectureMemoireFlash(messageOLED00);} // ----------------------------------------------------- // Si le compte à rebours est inférieur à 10 on affiche "0"
  329.      
  330.       display.print(compteReboursSecs);                                                                                               // Affiche le compte à rebours des secondes sur l'écran OLED
  331.       display.display();                                                                                                              // Rafraîchit l'affichage de l'écran OLED
  332.      
  333.       byte coul1 = random(1, 255);                                                                                                    // Premier paramètre des couleurs (rouge)
  334.       byte coul2 = random(2, 255);                                                                                                    // Deuxième paramètre des couleurs (vert)
  335.       byte coul3 = random(3, 255);                                                                                                    // Troisième paramètre des couleurs (bleu)
  336.      
  337.            if (compteReboursSecs == 10) {numerodeLedDepartCompteARebours = 0; nbledsCompteARebours = 4;} // ------------------------- // Positionne l'affichage sur les barrettes de leds adressables
  338.       else if (compteReboursSecs == 9)  {numerodeLedDepartCompteARebours = 5;}
  339.       else if (compteReboursSecs == 8)  {numerodeLedDepartCompteARebours = 10;}
  340.       else if (compteReboursSecs == 7)  {numerodeLedDepartCompteARebours = 15;}
  341.       else if (compteReboursSecs == 6)  {numerodeLedDepartCompteARebours = 20;}
  342.       else if (compteReboursSecs == 5)  {numerodeLedDepartCompteARebours = 25; nbledsCompteARebours = 5;}
  343.       else if (compteReboursSecs == 4)  {numerodeLedDepartCompteARebours = 31;}
  344.       else if (compteReboursSecs == 3)  {numerodeLedDepartCompteARebours = 37;}
  345.       else if (compteReboursSecs == 2)  {numerodeLedDepartCompteARebours = 43;}
  346.       else if (compteReboursSecs == 1)  {numerodeLedDepartCompteARebours = 49; nbledsCompteARebours = 6;}
  347.      
  348.       for (int i = numerodeLedDepartCompteARebours; i <= numerodeLedDepartCompteARebours+nbledsCompteARebours; i++) // -------------- // Affiche le compte à rebours de la nouvelle année sur les barrettes de leds adressables
  349.       {
  350.         colonneLed.setPixelColor(i, colonneLed.Color(coul1, coul2, coul3));                                                           // Affiche la led de rang i sur les barrettes de leds adressables
  351.         colonneLed.show();                                                                                                            // Rafraîchit l'affichage des barrettes de leds adressables
  352.       }
  353.     }
  354.   }
  355.  
  356. //**************************************************************************************************************************************************************************
  357. //*********************************************************************************************************************************** // GESTION DES DIP SWITCH ************
  358.   if (!ModeMenu) // ***************************************************************************************************************** // Si le mode menu est désactivé *****
  359.   {
  360.     LectureDipSwitch();                                                                                                               // Appelle la fonction de lecture des Dip Switch
  361.    
  362.     if (LastEtatDipSwitchMuteGeneral != EtatDipSwitchMuteGeneral) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si l'état du Dip Switch Mute Général a changé
  363.     {
  364.       Buzzer(3, 0, 1);
  365.            if (!EtatDipSwitchMuteGeneral) {MuteGeneral = true;} // ------------------------------------------------------------------ // Active le Mute Général si le Dip Switch Mute Général est à 0
  366.       else if (EtatDipSwitchMuteGeneral)  {MuteGeneral = false;} // ----------------------------------------------------------------- // Désactive le Mute Général si le Dip Switch Mute Général est à 1 (repos)
  367.      
  368.       t1TempoAffichageMessageOled = millis();                                                                                         // Démarre la temporisation de la durée d'affichages des messages sur l'écran OLED
  369.       PageOled = 1;                                                                                                                   // Sélectionne la Page 1 de l'écran OLED
  370.       LastEtatDipSwitchMuteGeneral = EtatDipSwitchMuteGeneral;                                                                        // Mémorise le dernier état du Dip Switch Mute Général
  371.     }
  372.    
  373.     if (LastEtatDipSwitchMutePartiel != EtatDipSwitchMutePartiel) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si l'état du Dip Switch Mute Général a changé
  374.     {
  375.       Buzzer(3, 0, 1);
  376.            if (!EtatDipSwitchMutePartiel) {MutePartiel = true;} // ------------------------------------------------------------------ // Active le Mute Partiel si le Dip Switch Mute Partiel est à 0
  377.       else if (EtatDipSwitchMutePartiel)  {MutePartiel = false;} // ----------------------------------------------------------------- // Désactive le Mute Partiel si le Dip Switch Mute Partiel est à 1 (repos)
  378.      
  379.       t1TempoAffichageMessageOled = millis();                                                                                         // Démarre la temporisation de la durée d'affichages des messages sur l'écran OLED
  380.       PageOled = 2;                                                                                                                   // Sélectionne la Page 2 de l'écran OLED
  381.       LastEtatDipSwitchMutePartiel = EtatDipSwitchMutePartiel;                                                                        // Mémorise le dernier état du Dip Switch Mute Partiel
  382.     }
  383.    
  384.     if (LastEtatDipSwitchVoix != EtatDipSwitchVoix) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si l'état du Dip Switch Voix a changé
  385.     {
  386.       Buzzer(3, 0, 1);
  387.            if (!EtatDipSwitchVoix) {Voix = true;} // -------------------------------------------------------------------------------- // Active Voix 2 si le Dip Switch Voix est à 0
  388.       else if (EtatDipSwitchVoix)  {Voix = false;} // ------------------------------------------------------------------------------- // Active Voix 1 si le Dip Switch Voix est à 1 (repos)
  389.      
  390.       t1TempoAffichageMessageOled = millis();                                                                                         // Démarre la temporisation de la durée d'affichages des messages sur l'écran OLED
  391.       PageOled = 3;                                                                                                                   // Sélectionne la Page 3 de l'écran OLED
  392.       LastEtatDipSwitchVoix = EtatDipSwitchVoix;                                                                                      // Mémorise le dernier état du Dip Switch Voix
  393.     }
  394.   }
  395.  
  396. //**************************************************************************************************************************************************************************
  397. //*********************************************************************************************************************************** // GESTION DE BPOK *******************
  398.   /*etatBPOK = digitalRead(BrocheBPOK); // ******************************************************************************************** // Lit l'état de BPOK ****************
  399.   if (LastetatBPOK != etatBPOK) // ************************************************************************************************** // Si changement d'état du bouton poussoir BPOK
  400.   {
  401.     if (LastetatBPOK == HIGH && etatBPOK == LOW) // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si front descendant sur BPOK (Pression sur BP)
  402.     {
  403.       if (!ModeMenu && !ModeReglages) // -------------------------------------------------------------------------------------------- // Si le mode menu est désactivé et Si le mode réglage est désactivé
  404.       {
  405.         Buzzer(20, 0, 1);
  406.         ModeMenu = true;                                                                                                              // Active l'indicateur du mode menu
  407.         PageOled = pgm_read_byte(&PageMenuMin);                                                                                       // Sélectionne la Page Menu 10 de l'écran OLED
  408.         t1TempoSortieModeMenu = millis();                                                                                             // (Re)Démarre la temporisation de sortie automatique du mode menu
  409.         LastetatBPOK = etatBPOK;                                                                                                      // Mémorise le dernier état BPOK
  410.       }
  411.       else if (ModeMenu && !ModeReglages) // ---------------------------------------------------------------------------------------- // Si le mode menu est activé et Si le mode réglages est désactivé
  412.       {
  413.         Buzzer(3, 0, 1);
  414.         ModeReglages = true;                                                                                                          // Active le mode réglages
  415.        
  416.         if (PageOled == 10) // ...................................................................................................... // Si la Page Menu 10 est activée => Réglage de l'heure
  417.         {
  418.           Hrstemp = Hrs;                                                                                                              // Transfère les heures courantes dans la variable de réglage Hrstemp
  419.           Minstemp = Mins;                                                                                                            // Transfère les minutes courantes dans la variable de réglage Minstemp
  420.           PageOled = 11;                                                                                                              // Sélectionne la Page 11
  421.         }
  422.         else if (PageOled == 20) // ................................................................................................. // Si la Page Menu 20 est activée => Réglage de la date
  423.         {
  424.           Jourtemp = Jour;                                                                                                            // Transfère le jour courant dans la variable de réglage Jourtemp
  425.           Moistemp = Mois;                                                                                                            // Transfère le mois courant dans la variable de réglage Moistemp
  426.           Anneetemp = Annee;                                                                                                          // Transfère l'année courante dans la variable de réglage Anneetemp
  427.           PageOled = 21;                                                                                                              // Sélectionne la Page 21
  428.         }
  429.        
  430.         t1TempoSortieModeMenu = millis();                                                                                             // (Re)Démarre la temporisation de sortie automatique du mode menu
  431.         LastetatBPOK = etatBPOK;                                                                                                      // Mémorise le dernier état BPOK
  432.       }
  433.       else if (ModeMenu && ModeReglages) // ----------------------------------------------------------------------------------------- // Si le mode menu est activé et Si le mode réglages est activé
  434.       {
  435.         Buzzer (100, 0, 1);
  436.        
  437.         if (PageOled == 11) // ...................................................................................................... // Si la Page Menu 11 est activée => Valide le réglage de l'heure courante
  438.         {
  439.           Hrs = Hrstemp;                                                                                                              // Transfère les heures de réglage dans la variable courante Hrs
  440.           Mins = Minstemp;                                                                                                            // Transfère les minutes de réglage dans la variable courante Mins
  441.           Secs = 0;
  442.          
  443.           rtc.setTime(Secs, Mins, Hrs, 4, Jour, Mois, Annee);                                                                         // Réglage Heure / Date (Secs, Minutes, Heures, Jour de la semaine, Jour du mois, Mois, Année)
  444.         }
  445.         else if (PageOled == 21) // ................................................................................................. // Si la Page Menu 21 est activée => Réglage du Mois courant
  446.         {
  447.           PageOled = 22;                                                                                                              // Sélectionne la Page 22
  448.           LastetatBPOK = etatBPOK;                                                                                                    // Mémorise le dernier état BPOK
  449.           return;                                                                                                                     // Retour début loop()
  450.         }
  451.         else if (PageOled == 22) // ................................................................................................. // Si la Page Menu 22 est activée => Réglage de l'Année courante
  452.         {
  453.           PageOled = 23;                                                                                                              // Sélectionne la Page 23
  454.           LastetatBPOK = etatBPOK;                                                                                                    // Mémorise le dernier état BPOK
  455.           return;                                                                                                                     // Retour début loop()
  456.         }
  457.         else if (PageOled == 23) // ................................................................................................. // Si la Page Menu 23 est activée => Valide le réglage de la date courante
  458.         {
  459.           Jour = Jourtemp;                                                                                                            // Transfère le jour de réglage dans la variable courante Jour
  460.           Mois = Moistemp;                                                                                                            // Transfère le mois de réglage dans la variable courante Mois
  461.           Annee = Anneetemp;                                                                                                          // Transfère l'année de réglage dans la variable courante Annee
  462.          
  463.           rtc.setTime(Secs, Mins, Hrs, 4, Jour, Mois, Annee);                                                                         // Mémorise l'heure et la date (Secs, Minutes, Heures, Jour de la semaine, Jour du mois, Mois, Année)
  464.         }
  465.        
  466.         display.clearDisplay();                                                                                                       // Efface l'afficheur OLED
  467.         ModeMenu = false;                                                                                                             // Désactive l'indicateur du mode menu
  468.         ModeReglages = false;                                                                                                         // Désactive le mode réglages
  469.         LastMins = -1;                                                                                                                // Force l'affichage de l'heure courante
  470.         LastJour = -1;                                                                                                                // Force l'affichage de la date courante
  471.         LasttauxHumiditeCourant = -1;                                                                                                 // Force l'affichage du taux d'humidité courant
  472.         t1TempoSortieModeMenu = 0;                                                                                                    // Réinitialise la temporisation de sortie automatique du mode menu
  473.         t1TempoReleveVariations = 0;                                                                                                  // Réinitialise la temporisation pour le calcul et l'affichage des vitesses de variations de la température et du taux d'humidité
  474.         MajAffichageVariations = false;                                                                                               // Désactive l'indicateur de mise à jour des vitesses de variations de la température et du taux d'humidité
  475.         MajAffichageTemperatureCourante = true;                                                                                       // Active l'indicateur de mise à jour de l'affichage des barrettes de leds adressables
  476.         LasttemperatureCourante = -1;                                                                                                 // Force l'affichage de la température courante
  477.         PageOled = 0;                                                                                                                 // Sélectionne la Page 0 de l'écran OLED
  478.         LastetatBPOK = etatBPOK;                                                                                                      // Mémorise le dernier état BPOK
  479.       }
  480.     }
  481.     else {LastetatBPOK = HIGH;} // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si front montant sur Bouton Poussoir BPOK (BP relâché)
  482.   }*/
  483.  
  484. //**************************************************************************************************************************************************************************
  485. //*********************************************************************************************************************************** // GESTION DE BPDroite ***************
  486.   if (digitalRead(BrocheBPDroite) == LOW) // **************************************************************************************** // Si niveau bas sur BPDroite (Pression sur BP)
  487.   {
  488.     Buzzer(1, 0, 1);
  489.    
  490.     if (!ModeMenu && !ModeReglages) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si le mode menu est désactivé et Si le mode réglage est désactivé
  491.     {
  492.         Buzzer(20, 0, 1);
  493.         ModeMenu = true;                                                                                                              // Active l'indicateur du mode menu
  494.         PageOled = pgm_read_byte(&PageMenuMin);                                                                                       // Sélectionne la Page Menu 10 de l'écran OLED
  495.         t1TempoSortieModeMenu = millis();                                                                                             // (Re)Démarre la temporisation de sortie automatique du mode menu
  496.         LastetatBPOK = etatBPOK;                                                                                                      // Mémorise le dernier état BPOK
  497.     }
  498.     else if (ModeMenu && !ModeReglages) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si le mode menu est activé et Si le mode réglages est désactivé
  499.     {
  500.       PageOled = PageOled + 10;                                                                                                       // Page suivante du menu
  501.       if (PageOled > pgm_read_byte(&PageMenuMax)) {PageOled = pgm_read_byte(&PageMenuMin);}                                           // Borne les Pages Menu
  502.       t1TempoSortieModeMenu = millis();                                                                                               // (Re)Démarre la temporisation de sortie automatique du mode menu
  503.     }
  504.     else if (ModeMenu && ModeReglages) // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si le mode menu est activé et Si le mode réglages est activé
  505.     {
  506.       if (PageOled == 11) // -------------------------------------------------------------------------------------------------------- // Si la Page Menu 11 est activée => Réglage des minutes courantes
  507.       {
  508.         Minstemp++;                                                                                                                   // Incrémente les minutes de réglage
  509.         if (Minstemp > 59) {Minstemp = 0;}                                                                                            // Borne les minutes de réglage
  510.       }
  511.       else if (PageOled == 21) // --------------------------------------------------------------------------------------------------- // Si la Page Menu 21 est activée => Réglage du jour courant
  512.       {
  513.         Jourtemp++;                                                                                                                   // Incrémente les jours de réglage
  514.         if (Jourtemp > 31) {Jourtemp = 1;}                                                                                            // Borne les jours de réglage
  515.       }
  516.       else if (PageOled == 22) // --------------------------------------------------------------------------------------------------- // Si la Page Menu 22 est activée => Réglage du mois courant
  517.       {
  518.         Moistemp++;                                                                                                                   // Incrémente les mois de réglage
  519.         if (Moistemp > 12) {Moistemp = 1;}                                                                                            // Borne les mois de réglage
  520.       }
  521.       else if (PageOled == 23) // --------------------------------------------------------------------------------------------------- // Si la Page Menu 23 est activée => Réglage de l'année courante
  522.       {
  523.         Anneetemp++;                                                                                                                  // Incrémente les années de réglage
  524.         if (Anneetemp > 99) {Anneetemp = 0;}                                                                                          // Borne les années de réglage
  525.       }
  526.      
  527.       t1TempoSortieModeMenu = millis();                                                                                               // (Re)Démarre la temporisation de sortie automatique du mode menu
  528.     }
  529.   }
  530.  
  531. //**************************************************************************************************************************************************************************
  532. //*********************************************************************************************************************************** // GESTION DE BPGauche ***************
  533.   if (digitalRead(BrocheBPGauche) == LOW) // **************************************************************************************** // Si niveau bas sur BPGauche (Pression sur BP)
  534.   {
  535.     Buzzer(1, 0, 1);
  536.    
  537.     if (!ModeMenu && !ModeReglages) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si le mode menu est désactivé et Si le mode réglage est désactivé
  538.     {
  539.         Buzzer(20, 0, 1);
  540.         ModeMenu = true;                                                                                                              // Active l'indicateur du mode menu
  541.         PageOled = pgm_read_byte(&PageMenuMax);                                                                                       // Sélectionne la Page Menu 20 de l'écran OLED
  542.         t1TempoSortieModeMenu = millis();                                                                                             // (Re)Démarre la temporisation de sortie automatique du mode menu
  543.         LastetatBPOK = etatBPOK;                                                                                                      // Mémorise le dernier état BPOK
  544.     }
  545.     else if (ModeMenu && !ModeReglages) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si le mode menu est activé et Si le mode réglages est désactivé
  546.     {
  547.       PageOled = PageOled - 10;                                                                                                       // Page précédente du menu
  548.       if (PageOled < pgm_read_byte(&PageMenuMin)) {PageOled = pgm_read_byte(&PageMenuMax);}                                           // Borne les Pages Menu
  549.       t1TempoSortieModeMenu = millis();                                                                                               // (Re)Démarre la temporisation de sortie automatique du mode menu
  550.     }
  551.     else if (ModeMenu && ModeReglages) // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si le mode menu est activé et Si le mode réglages est activé
  552.     {
  553.       if (PageOled == 11) // -------------------------------------------------------------------------------------------------------- // Si la Page Menu 11 est activée => Réglage des heures courantes
  554.       {
  555.         Hrstemp++;                                                                                                                    // Incrémente les heures de réglage
  556.         if (Hrstemp > 23) {Hrstemp = 0;}                                                                                              // Borne les heures de réglage
  557.       }
  558.       else if (PageOled == 21) // --------------------------------------------------------------------------------------------------- // Si la Page Menu 21 est activée => Réglage du jour courant
  559.       {
  560.         Jourtemp--;                                                                                                                   // Décrémente les jours de réglage
  561.         if (Jourtemp < 1) {Jourtemp = 31;}                                                                                            // Borne les jours de réglage
  562.       }
  563.       else if (PageOled == 22) // --------------------------------------------------------------------------------------------------- // Si la Page Menu 22 est activée => Réglage du mois courant
  564.       {
  565.         Moistemp--;                                                                                                                   // Décrémente les mois de réglage
  566.         if (Moistemp < 1) {Moistemp = 12;}                                                                                            // Borne les mois de réglage
  567.       }
  568.       else if (PageOled == 23) // --------------------------------------------------------------------------------------------------- // Si la Page Menu 23 est activée => Réglage de l'année courante
  569.       {
  570.         Anneetemp--;                                                                                                                  // Décrémente les années de réglage
  571.         if (Anneetemp < 0) {Anneetemp = 99;}                                                                                          // Borne les années de réglage
  572.       }
  573.      
  574.       t1TempoSortieModeMenu = millis();                                                                                               // (Re)Démarre la temporisation de sortie automatique du mode menu
  575.     }
  576.   }
  577.  
  578. //**************************************************************************************************************************************************************************
  579. //*********************************************************************************************************************************** // GESTION DU POTENTIOMETRE DU VOLUME
  580.   if (!ModeMenu) // ***************************************************************************************************************** // Si le mode menu est désactivé *****
  581.   {
  582.     FonctionLecturePotentiometreVolume();                                                                                             // Appelle la fonction de lecture du potentiomètre du volume du Dfplayer
  583.    
  584.     if (LastvaleurPotentiometreVolume != valeurPotentiometreVolume // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la valeur lue a changé
  585.      && abs(valeurPotentiometreVolume - LastvaleurPotentiometreVolume) > 30)                                                          // et Si l'écart entre la valeur actuelle et la dernière valeur est > 60
  586.     {
  587.       VolumeDfplayer = map(valeurPotentiometreVolume, 1023, 0, 30, 0);                                                                // Réétalonne la valeur du potentiomètre du volume du Dfplayer
  588.       myDFPlayer.volume(VolumeDfplayer);                                                                                              // Définit le volume du Dfplayer
  589.      
  590.       t1TempoAffichageMessageOled = millis();                                                                                         // Démarre la temporisation de la durée d'affichages des messages sur l'écran OLED
  591.       PageOled = 4;                                                                                                                   // Sélectionne la Page 4 de l'écran OLED
  592.       LastvaleurPotentiometreVolume = valeurPotentiometreVolume;                                                                      // Mémorise la dernière valeur courante du potentiomètre du volume du Dfplayer
  593.     }
  594.   }
  595.  
  596. //**************************************************************************************************************************************************************************
  597. //*********************************************************************************************************************************** // GESTION DE L'EFFACEMENT DES MESSAGES SUR L'ECRAN OLED
  598.   if (millis() - t1TempoAffichageMessageOled >= pgm_read_dword(&TempoAffichageMessageOled) && t1TempoAffichageMessageOled != 0) // ** // Si la temporisation d'affichage des messages sur l'écran OLED est écoulées
  599.   {
  600.     display.clearDisplay();                                                                                                           // Efface l'afficheur OLED
  601.     LastMins = -1;                                                                                                                    // Force l'affichage de l'heure courante
  602.     LastJour = -1;                                                                                                                    // Force l'affichage de la date courante
  603.     LasttauxHumiditeCourant = -1;                                                                                                     // Force l'affichage du taux d'humidité courant
  604.     t1TempoAffichageMessageOled = 0;                                                                                                  // Réinitialise la temporisation de la durée d'affichages des messages sur l'écran OLED
  605.     MajAffichageTemperatureCourante = true;                                                                                           // Active l'indicateur de mise à jour de l'affichage des barrettes de leds adressables
  606.     LasttemperatureCourante = -1;                                                                                                     // Force l'affichage de la température courante
  607.     PageOled = 0;                                                                                                                     // Sélectionne la Page 0 de l'écran OLED
  608.   }
  609.  
  610. //**************************************************************************************************************************************************************************
  611. //*********************************************************************************************************************************** // GESTION DE LA SORTIE AUTOMATIQUE DU MODE MENU
  612.   if (millis() - t1TempoSortieModeMenu >= pgm_read_dword(&TempoSortieModeMenu) && t1TempoSortieModeMenu != 0) // ******************** // Si la temporisation de la sortie automatique du mode menu est écoulée
  613.   {
  614.     display.clearDisplay();                                                                                                           // Efface l'afficheur OLED
  615.     ModeMenu = false;                                                                                                                 // Désactive l'indicateur du mode menu
  616.     ModeReglages = false;                                                                                                             // Désactive le mode réglages
  617.     LastMins = -1;                                                                                                                    // Force l'affichage de l'heure courante
  618.     LastJour = -1;                                                                                                                    // Force l'affichage de la date courante
  619.     LasttauxHumiditeCourant = -1;                                                                                                     // Force l'affichage du taux d'humidité courant
  620.     t1TempoSortieModeMenu = 0;                                                                                                        // Réinitialise la temporisation de sortie automatique du mode menu
  621.     t1TempoReleveVariations = 0;                                                                                                      // Réinitialise la temporisation pour le calcul et l'affichage des vitesses de variations de la température et du taux d'humidité
  622.     MajAffichageVariations = false;                                                                                                   // Désactive l'indicateur de mise à jour des vitesses de variations de la température et du taux d'humidité
  623.     MajAffichageTemperatureCourante = true;                                                                                           // Active l'indicateur de mise à jour de l'affichage des barrettes de leds adressables
  624.     LasttemperatureCourante = -1;                                                                                                     // Force l'affichage de la température courante
  625.     PageOled = 0;                                                                                                                     // Sélectionne la Page 0 de l'écran OLED
  626.   }
  627.  
  628. //**************************************************************************************************************************************************************************
  629. //*********************************************************************************************************************************** // GESTION DE L'AFFICHAGE SUR L'ECRAN OLED
  630.   if (PageOled == 0) // ************************************************************************************************************* // Si la Page 0 est sélectionnée *****
  631.   {
  632.     display.drawRoundRect(0, 0, display.width(), display.height(), 8, WHITE);                                                         // Affiche le cadre
  633.    
  634.     FonctionLectureDS3234();                                                                                                          // Appelle la fonction de la gestion du module RTC DS3234
  635.    
  636.     if (Osc2Points) {display.setTextSize(3); display.setCursor(57, 3); LectureMemoireFlash(messageOLED01); display.display();}        // Affiche l'oscillation des 2 points de l'affichage de l'heure sur l'écran OLED
  637.     else {display.setTextSize(3); display.setCursor(57, 3); LectureMemoireFlash(messageOLED18); display.display();}
  638.    
  639.     if (LastMins != Mins) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la minute courante a changé
  640.     {
  641.       if (Hrs >= 0 && Hrs <= 23 && Mins >= 0 && Mins <= 59) // ---------------------------------------------------------------------- // Vérifie la validité des données lues => Affiche l'heure sur l'afficheur OLED
  642.       {
  643.         display.setTextSize(3);                                                                                                       // Définit la taille du texte
  644.         display.setCursor(21, 3);                                                                                                     // Positionne l'affichage de l'heure courante
  645.         if (Hrs < 10) {LectureMemoireFlash(messageOLED00);} display.print(Hrs);                                                       // Affiche "0" si la variable "Hrs" est inférieure à 10 et Affiche la variable "Hrs"
  646.         FonctionOsc2Points();                                                                                                         // Appelle la fonction de gestion des deux points de l'affichage de l'heure sur l'écran OLED
  647.         if (Mins < 10) {LectureMemoireFlash(messageOLED00);} display.print(Mins);                                                     // Affiche "0" si la variable "Mins" est inférieure à 10 et Affiche la variable "Mins"
  648.         display.display();                                                                                                            // Rafraîchit l'affichage de l'écran OLED
  649.        
  650.         if (Mins == 0 && Secs == 0) // .............................................................................................. // Si les minutes et les secondes sont égales à 0
  651.         {
  652.           FonctionAnnonceNouvelleHeure();                                                                                             // Appelle la fonction d'annonce audio de la nouvelle heure
  653.         }
  654.       }
  655.       else // ----------------------------------------------------------------------------------------------------------------------- // Si données lues erronées => Problème de lecture de l'heure courante
  656.       {
  657.         LastMins = -1;                                                                                                                // Force l'affichage de l'heure après relecture
  658.         return;                                                                                                                       // Retour début boucle loop()
  659.       }
  660.      
  661.       LastMins = Mins;                                                                                                                // Mémorise la dernière valeur des minutes
  662.     }
  663.    
  664.     if (LastJour != Jour) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si le jour du mois courant a changé
  665.     {
  666.       if (Jour >= 1 && Jour <= 31 && Mois >= 1 && Mois <= 12 && Annee >= 0 && Annee <= 99) // --------------------------------------- // Vérifie la validité des données lues => Affiche la date sur l'afficheur OLED
  667.       {
  668.         display.setTextSize(2);                                                                                                       // Définit la taille du texte
  669.         display.setCursor(17, 28);                                                                                                    // Positionne l'affichage de la date courante
  670.         if (Jour < 10) {LectureMemoireFlash(messageOLED00);} display.print(Jour);                                                     // Affiche "0" si la variable "Jour" est inférieure à 10 et Affiche la variable "Jour"
  671.         LectureMemoireFlash(messageOLED02);                                                                                           // Affiche "/"
  672.         if (Mois < 10) {LectureMemoireFlash(messageOLED00);} display.print(Mois);                                                     // Affiche "0" si la variable "Mois" est inférieure à 10 et Affiche la variable "Mois"
  673.         LectureMemoireFlash(messageOLED02);                                                                                           // Affiche "/"
  674.         display.print(Annee);                                                                                                         // Affiche la variable "Annee"
  675.         display.display();                                                                                                            // Rafraîchit l'affichage de l'écran OLED
  676.       }
  677.       else // ----------------------------------------------------------------------------------------------------------------------- // Si données lues erronées => Problème de lecture de la date courante
  678.       {
  679.         LastJour = -1;                                                                                                                // Force l'affichage de la date courante après relecture
  680.         return;                                                                                                                       // Retour début boucle loop()
  681.       }
  682.      
  683.       LastJour = Jour;                                                                                                                // Mémorise la dernière valeur du jour
  684.     }
  685.    
  686.     if (LasttauxHumiditeCourant != tauxHumiditeCourant && abs(LasttauxHumiditeCourant - tauxHumiditeCourant) > 0.25) // +++++++++++++ // Si le taux d'humidité courant a changé et si l'écart est de plus ou moins 0.26%
  687.     {
  688.       if (tauxHumiditeCourant >= 0.0 && tauxHumiditeCourant <= 100.0) // ------------------------------------------------------------ // Vérifie la validité de la donnée lue => Affiche le taux d'humidité sur l'afficheur OLED
  689.       {
  690.         display.setTextSize(2);                                                                                                       // Définit la taille du texte
  691.         display.setCursor(30, 47);                                                                                                    // Positionne l'affichage du taux d'humidité courant
  692.         if (tauxHumiditeCourant < 10) {LectureMemoireFlash(messageOLED00);} display.print(tauxHumiditeCourant);                       // Affiche "0" si la variable "tauxHumiditeCourant" est inférieure à 10 et Affiche la variable "tauxHumiditeCourant"
  693.         LectureMemoireFlash(messageOLED03);                                                                                           // Affiche "%"
  694.         display.display();                                                                                                            // Rafraîchit l'affichage de l'écran OLED
  695.       }
  696.       else // ----------------------------------------------------------------------------------------------------------------------- // Si données lues erronées => Problème de dépassement du taux d'humidité courant
  697.       {
  698.         LasttauxHumiditeCourant = -1;                                                                                                 // Force l'affichage du taux d'humidité courant après relecture
  699.       }
  700.      
  701.       LasttauxHumiditeCourant = tauxHumiditeCourant;                                                                                  // Mémorise la dernière valeur courante du taux d'humidité
  702.     }
  703.   }
  704.   else // *************************************************************************************************************************** // Si la Page sélectionnée est différente de 0
  705.   {
  706.     FonctionCadre(1);                                                                                                                 // Efface l'afficheur OLED et Affiche le cadre (Taille police)
  707.    
  708.     if (PageOled == 1) // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la Page 1 est sélectionnée
  709.     {
  710.       display.setCursor(41, 5);                                                                                                       // Positionne le message
  711.       LectureMemoireFlash(messageOLED04);                                                                                             // Affiche le message "MUTE" sur l'écran OLED
  712.       display.setCursor(24, 24);                                                                                                      // Positionne le message
  713.       LectureMemoireFlash(messageOLED05);                                                                                             // Affiche le message "GENERAL" sur l'écran OLED
  714.            if (MuteGeneral)  {display.setCursor(30, 44); LectureMemoireFlash(messageOLED07);}                                         // Si le Mute Général est activé
  715.       else if (!MuteGeneral) {display.setCursor(12, 44); LectureMemoireFlash(messageOLED08);}                                         // Si le Mute Général est désactivé (repos)
  716.     }
  717.     else if (PageOled == 2) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la Page 2 est sélectionnée
  718.     {
  719.       display.setCursor(41, 5);                                                                                                       // Positionne le message
  720.       LectureMemoireFlash(messageOLED04);                                                                                             // Affiche le message "MUTE" sur l'écran OLED
  721.       display.setCursor(24, 24);                                                                                                      // Positionne le message
  722.       LectureMemoireFlash(messageOLED06);                                                                                             // Affiche le message "PARTIEL" sur l'écran OLED
  723.            if (MutePartiel)  {display.setCursor(30, 44); LectureMemoireFlash(messageOLED07);}                                         // Si le Mute Partiel est activé
  724.       else if (!MutePartiel) {display.setCursor(12, 44); LectureMemoireFlash(messageOLED08);}                                         // Si le Mute Partiel est désactivé (repos)
  725.     }
  726.     else if (PageOled == 3) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la Page 3 est sélectionnée
  727.     {
  728.       display.setCursor(12, 5);                                                                                                       // Positionne le message
  729.       LectureMemoireFlash(messageOLED09);                                                                                             // Affiche le message "SELECTION" sur l'écran OLED
  730.       display.setCursor(41, 24);                                                                                                      // Positionne le message
  731.       LectureMemoireFlash(messageOLED10);                                                                                             // Affiche le message "VOIX" sur l'écran OLED
  732.            if (Voix)  {display.setCursor(61, 44); LectureMemoireFlash(messageOLED12);}                                                // Si Voix 2 est activée
  733.       else if (!Voix) {display.setCursor(61, 44); LectureMemoireFlash(messageOLED11);}                                                // Si Voix 1 est activée (repos)
  734.     }
  735.     else if (PageOled == 4) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la Page 4 est sélectionnée
  736.     {
  737.       display.setCursor(30, 8);                                                                                                       // Positionne le message
  738.       LectureMemoireFlash(messageOLED13);                                                                                             // Affiche le message "VOLUME" sur l'écran OLED
  739.       display.setTextSize(3);                                                                                                         // Définit la taille du texte
  740.       display.setCursor(48, 32);                                                                                                      // Positionne le message
  741.       if (VolumeDfplayer < 10) {display.setCursor(56, 32);}                                                                           // Centre l'affichage de la variable "VolumeDfplayer" si elle est inférieure à 10
  742.       display.print(VolumeDfplayer);                                                                                                  // Affiche le volume du Dfplayer sur l'écran OLED
  743.     }
  744.     else if (PageOled == 10) // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la Page 10 est sélectionnée => Menu réglage heure courante
  745.     {
  746.       display.setCursor(24, 5);                                                                                                       // Positionne le message
  747.       LectureMemoireFlash(messageOLED22);                                                                                             // Affiche le message "REGLAGE" sur l'écran OLED
  748.       display.setCursor(34, 24);                                                                                                      // Positionne le message
  749.       LectureMemoireFlash(messageOLED25);                                                                                             // Affiche le message "HEURE" sur l'écran OLED
  750.       display.setCursor(4, 44);                                                                                                       // Positionne le message
  751.       LectureMemoireFlash(messageOLED23);                                                                                             // Affiche le message "<TAPEZ OK>" sur l'écran OLED
  752.     }
  753.     else if (PageOled == 20) // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la Page 20 est sélectionnée => Menu réglage date
  754.     {
  755.       display.setCursor(24, 5);                                                                                                       // Positionne le message
  756.       LectureMemoireFlash(messageOLED22);                                                                                             // Affiche le message "REGLAGE" sur l'écran OLED
  757.       display.setCursor(41, 24);                                                                                                      // Positionne le message
  758.       LectureMemoireFlash(messageOLED26);                                                                                             // Affiche le message "DATE" sur l'écran OLED
  759.       display.setCursor(4, 44);                                                                                                       // Positionne le message
  760.       LectureMemoireFlash(messageOLED23);                                                                                             // Affiche le message "<TAPEZ OK>" sur l'écran OLED
  761.     }
  762.     else if (PageOled == 11) // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la Page 11 est sélectionnée => Menu réglage heure courante
  763.     {
  764.       display.setCursor(30, 5);                                                                                                       // Positionne le message
  765.       LectureMemoireFlash(messageOLED24);                                                                                             // Affiche le message "REGLEZ" sur l'écran OLED
  766.       display.setCursor(34, 24);                                                                                                      // Positionne le message
  767.       LectureMemoireFlash(messageOLED25);                                                                                             // Affiche le message "HEURE" sur l'écran OLED
  768.       display.setCursor(34, 44);                                                                                                      // Positionne le message
  769.       if (Hrstemp < 10) {LectureMemoireFlash(messageOLED00);} display.print(Hrstemp);                                                 // Affiche l'heure de réglage sur l'afficheur OLED
  770.       LectureMemoireFlash(messageOLED01);                                                                                             // Affiche le message ":"
  771.       if (Minstemp < 10) {LectureMemoireFlash(messageOLED00);}display.print(Minstemp);
  772.     }
  773.     else if (PageOled == 21 || PageOled == 22 || PageOled == 23) // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la Page 21 ou 22 ou 23 est sélectionnée => Menu réglage date courante
  774.     {
  775.       display.setCursor(30, 5);                                                                                                       // Positionne le message
  776.       LectureMemoireFlash(messageOLED24);                                                                                             // Affiche le message "REGLEZ" sur l'écran OLED
  777.       display.setCursor(24, 24);                                                                                                      // Positionne le message
  778.            if (PageOled == 21) {LectureMemoireFlash(messageOLED27);}                                                                  // Affiche le message "LE JOUR" sur l'écran en fonction de la page menu activée
  779.       else if (PageOled == 22) {LectureMemoireFlash(messageOLED28);}                                                                  // Affiche le message "LE MOIS" sur l'écran en fonction de la page menu activée
  780.       else if (PageOled == 23) {LectureMemoireFlash(messageOLED29);}                                                                  // Affiche le message "L'ANNEE" sur l'écran en fonction de la page menu activée
  781.      
  782.       display.setCursor(17, 44);                                                                                                      // Positionne l'affichage de la date courante
  783.       if (PageOled == 21) {display.setTextColor(BLACK, WHITE);}                                                                       // Définit la couleur des caractères et la couleur du fond
  784.       if (Jourtemp < 10) {LectureMemoireFlash(messageOLED00);} display.print(Jourtemp);                                               // Affiche "0" si la variable "Jour" est inférieure à 10 et Affiche la variable "Jour"
  785.       display.setTextColor(WHITE, BLACK);                                                                                             // Définit la couleur des caractères et la couleur du fond
  786.       LectureMemoireFlash(messageOLED02);                                                                                             // Affiche "/"
  787.       if (PageOled == 22) {display.setTextColor(BLACK, WHITE);}                                                                       // Définit la couleur des caractères et la couleur du fond
  788.       if (Moistemp < 10) {LectureMemoireFlash(messageOLED00);} display.print(Moistemp);                                               // Affiche "0" si la variable "Mois" est inférieure à 10 et Affiche la variable "Mois"
  789.       display.setTextColor(WHITE, BLACK);                                                                                             // Définit la couleur des caractères et la couleur du fond
  790.       LectureMemoireFlash(messageOLED02);                                                                                             // Affiche "/"
  791.       if (PageOled == 23) {display.setTextColor(BLACK, WHITE);}                                                                       // Définit la couleur des caractères et la couleur du fond
  792.       display.print(Anneetemp);                                                                                                       // Affiche la variable "Annee"
  793.       display.setTextColor(WHITE, BLACK);                                                                                             // Définit la couleur des caractères et la couleur du fond
  794.     }
  795.    
  796.     display.display();                                                                                                                // Rafraîchit l'affichage de l'écran OLED
  797.   }
  798.  
  799. //**************************************************************************************************************************************************************************
  800. //*********************************************************************************************************************************** // GESTION DE LA LECTURE ET DU CALCUL DE LA TEMPERATURE COURANTE
  801.   temperatureCourante = dht.readTemperature(); // *********************************************************************************** // Relève la température courante ****
  802.   //Serial.println(temperatureCourante);                                                                                                // Débug (Désactiver le Dfplayer pour libérer le port série)
  803.   if (isnan(temperatureCourante)) {return;}                                                                                           // Vérifie si la lecture de la température courante a échoué
  804.  
  805.   static int CompteurRelevesTemperature = 0;                                                                                          // Déclare et Initialise les variables pour le calcul de la moyenne de la température
  806.   static float SommeRelevesTemperature = 0.0;
  807.  
  808.   CompteurRelevesTemperature++;                                                                                                       // Incrémente le compteur des relevés de température
  809.   SommeRelevesTemperature = SommeRelevesTemperature + temperatureCourante;                                                            // Calcule la somme des 50 relevés
  810.  
  811.   if (CompteurRelevesTemperature >= 50) // ****************************************************************************************** // Si 50 relevés ont été effectués
  812.   {
  813.     temperatureCourante = SommeRelevesTemperature / 50.0;                                                                             // Calcule la moyenne des 50 relevés
  814.     //Serial.println(temperatureCourante, 2);                                                                                         // Débug (Désactiver le Dfplayer pour libérer le port série)
  815.     CompteurRelevesTemperature = 0; SommeRelevesTemperature = 0.0;                                                                    // Réinitialisation des variables de calcul de la moyenne de la température
  816.     MajAffichageTemperatureCourante = true;                                                                                           // Active l'indicateur de mise à jour de l'affichage des barrettes de leds adressables
  817.    
  818.     if (t1TempoReleveVariations == 0) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la temporisation pour le calcul et d'affichage des vitesses de variations de la température et du taux d'humidité n'a pas démarré
  819.     {
  820.       T1 = temperatureCourante;                                                                                                       // Mémorise la première température pour le calcul de la vitesse de la variation de la température
  821.       H1 = tauxHumiditeCourant;                                                                                                       // Mémorise le premier taux d'humidité pour le calcul de la vitesse de la variation du taux d'humidité
  822.       t1TempoReleveVariations = millis();                                                                                             // Démarre la temporisation pour le calcul et l'affichage des vitesses de variations de la température et du taux d'humidité
  823.     }
  824.     else if (millis() - t1TempoReleveVariations >= pgm_read_dword(&FrequenceReleveVariations) && t1TempoReleveVariations != 0) // +++ // Si la temporisation d'affichage des vitesses de variations de la température et du taux d'humidité est écoulée
  825.     {
  826.       T2 = temperatureCourante;                                                                                                       // Mémorise la deuxième température pour le calcul de la vitesse de la variation de la température
  827.       H2 = tauxHumiditeCourant;                                                                                                       // Mémorise le deuxième taux d'humidité pour le calcul de la vitesse de la variation du taux d'humidité
  828.       MajAffichageVariations = true;                                                                                                  // Active l'indicateur de mise à jour de l'affichage des vitesses de variations de la température et du taux d'humidité
  829.     }
  830.   }
  831.  
  832. //**************************************************************************************************************************************************************************
  833. //*********************************************************************************************************************************** // GESTION DE LA LECTURE ET DU CALCUL DU TAUX D'HUMIDITE COURANT
  834.   tauxHumiditeCourant = dht.readHumidity(); // ************************************************************************************** // Relève le taux d'humidité courant *
  835.   //Serial.println(tauxHumiditeCourant);                                                                                                // Débug (Désactiver le Dfplayer pour libérer le port série)
  836.   if (isnan(tauxHumiditeCourant)) {return;}                                                                                           // Vérifie si la lecture du taux d'humidité courant a échoué
  837.  
  838.   static int CompteurRelevesTauxHumidite = 0;                                                                                         // Déclare et Initialise les variables pour le calcul de la moyenne du taux d'humidité
  839.   static float SommeRelevesTauxHumidite = 0.0;
  840.  
  841.   CompteurRelevesTauxHumidite++;                                                                                                      // Incrémente le compteur des relevés du taux d'humidité
  842.   SommeRelevesTauxHumidite = SommeRelevesTauxHumidite + tauxHumiditeCourant;                                                          // Calcule la somme des 50 relevés
  843.  
  844.   if (CompteurRelevesTauxHumidite >= 50) // ***************************************************************************************** // Si 50 relevés ont été effectués
  845.   {
  846.     tauxHumiditeCourant = SommeRelevesTauxHumidite / 50.0;                                                                            // Calcule la moyenne des 50 relevés
  847.     //Serial.println(tauxHumiditeCourant);                                                                                              // Débug (Désactiver le Dfplayer pour libérer le port série)
  848.     CompteurRelevesTauxHumidite = 0; SommeRelevesTauxHumidite = 0.0;                                                                  // Réinitialisation des variables de calcul de la moyenne du taux d'humidité
  849.     MajTauxHumiditeCourant = true;                                                                                                    // Active l'indicateur de mise à jour de l'affichage sur l'Oled
  850.   }
  851.  
  852. //**************************************************************************************************************************************************************************
  853. //*********************************************************************************************************************************** // GESTION DE LA LUMINOSITE AMBIANTE *
  854.   if (!ModeMenu) // ***************************************************************************************************************** // Si le mode menu est désactivé *****
  855.   {
  856.     int valeurLuminositeAmbiante = analogRead(BrocheLDR);                                                                             // Déclare et Lit la valeur analogique sur la broche de la cellule photoélectrique LDR (valeur entre 0 et 1023)
  857.    
  858.     static int CompteurRelevesLuminositeAmbiante = 0;                                                                                 // Déclare et Initialise les variables pour le calcul de la moyenne de la luminosité ambiante
  859.     static unsigned int SommeRelevesLuminositeAmbiante = 0;
  860.    
  861.     CompteurRelevesLuminositeAmbiante++;                                                                                              // Incrémente le compteur des relevés de la luminosité ambiante
  862.     SommeRelevesLuminositeAmbiante = SommeRelevesLuminositeAmbiante + valeurLuminositeAmbiante;                                       // Calcule la somme des 50 relevés
  863.    
  864.     if (CompteurRelevesLuminositeAmbiante >= 50) // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si 50 relevés ont été effectués
  865.     {
  866.       valeurLuminositeAmbiante = int(SommeRelevesLuminositeAmbiante / 50.0);                                                          // Calcule la moyenne des 50 relevés
  867.       //Serial.println(valeurLuminositeAmbiante);                                                                                       // Débug (Désactiver le Dfplayer pour libérer le port série)
  868.       CompteurRelevesLuminositeAmbiante = 0; SommeRelevesLuminositeAmbiante = 0;                                                      // Réinitialisation des variables de calcul de la moyenne de la luminosité ambiante
  869.      
  870.       if ((LastvaleurLuminositeAmbiante != valeurLuminositeAmbiante // -------------------------------------------------------------- // Si la valeur lue a changé
  871.         && abs(valeurLuminositeAmbiante - LastvaleurLuminositeAmbiante) > 30)                                                         // et Si le changement est supérieur à 60
  872.         || LastvaleurLuminositeAmbiante == -1)                                                                                        // ou Si début du programme
  873.       {
  874.         brightnessBarrettes = map(valeurLuminositeAmbiante, 0, 1023, 5, 50);                                                          // Réétalonne la valeur de la lumière ambiante en luminosité pour les leds adressables
  875.         //Serial.println(brightnessBarrettes);                                                                                        // Débug (Désactiver le Dfplayer pour libérer le port série)
  876.        
  877.         colonneLed.setBrightness(brightnessBarrettes);                                                                                // Définit la luminosité des barrettes de leds adressables
  878.         MajAffichageTemperatureCourante = true;                                                                                       // Active l'indicateur de mise à jour de l'affichage des barrettes de leds adressables
  879.         LasttemperatureCourante = -1;                                                                                                 // Force l'affichage de la température courante
  880.         LastvaleurLuminositeAmbiante = valeurLuminositeAmbiante;                                                                      // Mémorise le dernier état de la lumière ambiante
  881.       }
  882.     }
  883.   }
  884.  
  885. //**************************************************************************************************************************************************************************
  886. //*********************************************************************************************************************************** // GESTION DE L'AFFICHAGE DE LA TEMPERATURE COURANTE SUR LES BARRETTES DE LEDS ADRESSABLES
  887.   if (MajAffichageTemperatureCourante && !ModeMenu) // ****************************************************************************** // Si la mise à jour de l'affichage de la température sur les barrettes de leds adressables est activée et Si le mode menu est désactivé
  888.   {
  889.     if (LasttemperatureCourante != temperatureCourante && abs(LasttemperatureCourante - temperatureCourante) >= 0.49) // ++++++++++++ // Si la température courante a changé et si l'écart est de plus ou moins 0.49°
  890.     {
  891.       if (temperatureCourante >= 9.75 && temperatureCourante <= 46.5) // ------------------------------------------------------------ // Vérifie la validité des données lues
  892.       {
  893.         FonctionEffaceBarrettesLeds();                                                                                                // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  894.        
  895.         if (temperatureCourante < 36.75) // ......................................................................................... // Si échelle de température 1
  896.         {
  897.           colonneLed.setPixelColor(pgm_read_byte(&numLedRougeEchelleTemp1), colonneLed.Color(150, 0, 0));                             // Active le témoin de l'échelle de température 1 ou 2
  898.           colonneLed.setPixelColor(pgm_read_byte(&numLedRougeEchelleTemp2), colonneLed.Color(0, 0, 0));                               // Désactive le témoin de l'échelle de température 2
  899.  
  900.           for (int i = 0; i <= pgm_read_byte(&nombreLedsColonne) - 3; i++) // ======================================================= // Gestion de l'affichage des barrettes de leds adressables vers le haut
  901.           {
  902.             if (temperatureCourante >= i/2 + 9.75) {colonneLed.setPixelColor(i, colonneLed.Color(255, 0, 0));}                          // Calcule et Affiche l'état de la led degrés de rang i en rouge
  903.             else {colonneLed.setPixelColor(i, colonneLed.Color(0, 50, 0));}                                                          // Affiche les autres leds en vert
  904.  
  905.             if (testEvenements()) // ________________________________________________________________________________________________ // Si la fonction retourne "Vrai" => On sort pour traiter l'évènement
  906.             {
  907.               FonctionEffaceBarrettesLeds();                                                                                          // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  908.               return;                                                                                                                 // Retourne au début de la loop()
  909.             }
  910.            
  911.                  if (PageOled != 0) {delay(35);}                                                                                      // Si la Page 0 n'est pas sélectionnée => On temporise pendant 35ms
  912.             else if (PageOled == 0)                                                                                                   // Si la Page 0 est sélectionnée => On continue d'afficher l'oscillation des deux points pour l'affichage de l'heure
  913.             {
  914.               FonctionOsc2Points();                                                                                                   // Appelle la fonction de gestion des deux points de l'affichage de l'heure sur l'écran OLED
  915.             }
  916.            
  917.             colonneLed.show();                                                                                                        // Rafraîchit l'affichage des barrettes de leds adressables
  918.           }
  919.           /*for (int i = 0, j = 1; i <= pgm_read_byte(&nombreLedsColonne) - 3, // ===================================================== // Gestion de l'affichage des barrettes de leds adressables vers le haut
  920.                j <= pgm_read_byte(&nombreLedsColonne) - 3; i = i + 2, j = j + 2)
  921.           {
  922.             if (temperatureCourante >= i/2 + 9.75) {colonneLed.setPixelColor(i, colonneLed.Color(255, 0, 0));}                        // Calcule et Affiche l'état de la led degrés de rang i en rouge
  923.             else {colonneLed.setPixelColor(i, colonneLed.Color(0, 50, 0));}                                                           // Affiche les autres leds en vert
  924.            
  925.             if (temperatureCourante >= j/2 + 10.25) {colonneLed.setPixelColor(j, colonneLed.Color(50, 0, 0));}                        // Calcule et Affiche l'état de la led demi-degrés de rang j en rouge
  926.             else {colonneLed.setPixelColor(j, colonneLed.Color(0, 50, 0));}                                                           // Affiche les autres leds en vert
  927.            
  928.             if (testEvenements()) // ________________________________________________________________________________________________ // Si la fonction retourne "Vrai" => On sort pour traiter l'évènement
  929.             {
  930.               FonctionEffaceBarrettesLeds();                                                                                          // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  931.               return;                                                                                                                 // Retourne au début de la loop()
  932.             }
  933.            
  934.                  if (PageOled != 0) {delay(35);}                                                                                      // Si la Page 0 n'est pas sélectionnée => On temporise pendant 35ms
  935.             else if (PageOled == 0)                                                                                                   // Si la Page 0 est sélectionnée => On continue d'afficher l'oscillation des deux points pour l'affichage de l'heure
  936.             {
  937.               FonctionOsc2Points();                                                                                                   // Appelle la fonction de gestion des deux points de l'affichage de l'heure sur l'écran OLED
  938.             }
  939.            
  940.             colonneLed.show();                                                                                                        // Rafraîchit l'affichage des barrettes de leds adressables
  941.           }*/
  942.         }
  943.         else // ..................................................................................................................... // Si échelle de température 2
  944.         {
  945.           colonneLed.setPixelColor(pgm_read_byte(&numLedRougeEchelleTemp1), colonneLed.Color(150, 0, 0));                             // Active le témoin de l'échelle de température 1 ou 2
  946.           colonneLed.setPixelColor(pgm_read_byte(&numLedRougeEchelleTemp2), colonneLed.Color(150, 0, 0));                             // Active le témoin de l'échelle de température 2
  947.          
  948.           for (int i = 0; i <= pgm_read_byte(&nombreLedsColonne) - 3; i++) // ======================================================= // Gestion de l'affichage des barrettes de leds adressables vers le haut
  949.           {
  950.             if (temperatureCourante >= i/2 + 19.75) {colonneLed.setPixelColor(i, colonneLed.Color(255, 0, 0));}                       // Calcule et Affiche l'état de la led degrés de rang i en rouge
  951.             else {colonneLed.setPixelColor(i, colonneLed.Color(0, 50, 0));}                                                           // Affiche les autres leds en vert
  952.  
  953.             if (testEvenements()) // ________________________________________________________________________________________________ // Si la fonction retourne "Vrai" => On sort pour traiter l'évènement
  954.             {
  955.               FonctionEffaceBarrettesLeds();                                                                                          // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  956.               return;                                                                                                                 // Retourne au début de la loop()
  957.             }
  958.            
  959.             if (PageOled != 0) {delay(35);}                                                                                           // Si la Page 0 n'est pas sélectionnée => On temporise pendant 35ms
  960.             else if (PageOled == 0)                                                                                                   // Si la Page 0 est sélectionnée => On continue d'afficher l'oscillation des deux points pour l'affichage de l'heure
  961.             {
  962.               FonctionOsc2Points();                                                                                                   // Appelle la fonction de gestion des deux points de l'affichage de l'heure sur l'écran OLED
  963.             }
  964.            
  965.             colonneLed.show();                                                                                                        // Rafraîchit l'affichage des barrettes de leds adressables
  966.           }
  967.          
  968.           /*for (int i = 0, j = 1; i <= pgm_read_byte(&nombreLedsColonne) - 3, // ===================================================== // Gestion de l'affichage des barrettes de leds adressables vers le haut
  969.                j <= pgm_read_byte(&nombreLedsColonne) - 3; i = i + 2, j = j + 2)
  970.           {
  971.             if (temperatureCourante >= i/2 + 19.75) {colonneLed.setPixelColor(i, colonneLed.Color(255, 0, 0));}                       // Calcule et Affiche l'état de la led degrés de rang i en rouge
  972.             else {colonneLed.setPixelColor(i, colonneLed.Color(0, 50, 0));}                                                           // Affiche les autres leds en vert
  973.            
  974.             if (temperatureCourante >= j/2 + 20.25) {colonneLed.setPixelColor(j, colonneLed.Color(50, 0, 0));}                        // Calcule et Affiche l'état de la led demi-degrés de rang j en rouge
  975.             else {colonneLed.setPixelColor(j, colonneLed.Color(0, 50, 0));}                                                           // Affiche les autres leds en vert
  976.            
  977.             if (testEvenements()) // ________________________________________________________________________________________________ // Si la fonction retourne "Vrai" => On sort pour traiter l'évènement
  978.             {
  979.               FonctionEffaceBarrettesLeds();                                                                                          // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  980.               return;                                                                                                                 // Retourne au début de la loop()
  981.             }
  982.            
  983.             if (PageOled != 0) {delay(35);}                                                                                           // Si la Page 0 n'est pas sélectionnée => On temporise pendant 35ms
  984.             else if (PageOled == 0)                                                                                                   // Si la Page 0 est sélectionnée => On continue d'afficher l'oscillation des deux points pour l'affichage de l'heure
  985.             {
  986.               FonctionOsc2Points();                                                                                                   // Appelle la fonction de gestion des deux points de l'affichage de l'heure sur l'écran OLED
  987.             }
  988.            
  989.             colonneLed.show();                                                                                                        // Rafraîchit l'affichage des barrettes de leds adressables
  990.           }*/
  991.         }
  992.       }
  993.       else // ----------------------------------------------------------------------------------------------------------------------- // Si dépassement de la température
  994.       {
  995.         FonctionEffaceBarrettesLeds();                                                                                                // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  996.        
  997.         if (temperatureCourante > 46.5) // .......................................................................................... // Si dépassement par le haut
  998.         {
  999.           for (int i = 0; i <= pgm_read_byte(&nombreLedsColonne) - 1; i++) // ======================================================= // Gestion de l'affichage des barrettes de leds adressables vers le haut
  1000.           {
  1001.             colonneLed.setPixelColor(i, colonneLed.Color(150, 0, 0));                                                                 // Affiche la led de rang i en rouge
  1002.             colonneLed.show();                                                                                                        // Rafraîchit l'affichage des barrettes de leds adressables
  1003.             delay(5);                                                                                                                 // Temporise 5ms
  1004.           }
  1005.         }
  1006.         else if (temperatureCourante < 9.75) // ..................................................................................... // Si dépassement par le bas
  1007.         {
  1008.           for (int i = pgm_read_byte(&nombreLedsColonne) - 1; i >= 0; i--) // ======================================================= // Gestion de l'affichage des barrettes de leds adressables vers le bas
  1009.           {
  1010.             colonneLed.setPixelColor(i, colonneLed.Color(0, 0, 150));                                                                 // Affiche la led de rang i en bleu
  1011.             colonneLed.show();                                                                                                        // Rafraîchit l'affichage des barrettes de leds adressables
  1012.             delay(5);                                                                                                                 // Temporise 5ms
  1013.           }
  1014.         }
  1015.        
  1016.         LasttemperatureCourante = -1;                                                                                                 // Force l'affichage de la température courante après relecture
  1017.         return;                                                                                                                       // Retour début boucle loop()
  1018.       }
  1019.       LasttemperatureCourante = temperatureCourante;                                                                                  // Mémorise la dernière valeur courante de la température
  1020.     }
  1021.    
  1022.     MajAffichageTemperatureCourante = false;                                                                                          // Désactive l'indicateur de mise à jour de l'affichage des barrettes de leds adressables
  1023.   }
  1024.  
  1025. //**************************************************************************************************************************************************************************
  1026. //*********************************************************************************************************************************** // GESTION DE L'AFFICHAGE DE LA VITESSE DES VARIATIONS DE LA TEMPERATURE ET DE L'HUMIDITE SUR LES BARRETTES DE LEDS ADRESSABLES
  1027.   if (MajAffichageVariations && !ModeMenu) // *************************************************************************************** // Si la mise à jour de l'affichage des vitesses de variations de la température et du taux d'humidité sur les barrettes de leds adressables est activée et Si le mode menu est désactivé
  1028.   {
  1029.     FonctionEffaceBarrettesLeds();                                                                                                    // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  1030.    
  1031.     colonneLed.setPixelColor(pgm_read_byte(&numLedRougeEchelleTemp1), colonneLed.Color(0, 0, 0));                                     // Désactive le témoin de l'échelle de température 1 ou 2
  1032.     colonneLed.setPixelColor(pgm_read_byte(&numLedRougeEchelleTemp2), colonneLed.Color(0, 0, 0));                                     // Désactive le témoin de l'échelle de température 2
  1033.    
  1034.     float vitesseVariationTemperature = 0;                                                                                            // Déclare la variable contenant la vitesse de variation de la température
  1035.     float vitesseVariationHumidite = 0;                                                                                               // Déclare la variable contenant la vitesse de variation du taux d'humidité
  1036.     int coul1 = 0;                                                                                                                    // Premier paramètre des couleurs (rouge)
  1037.     int coul2 = 0;                                                                                                                    // Deuxième paramètre des couleurs (vert)
  1038.     int coul3 = 0;                                                                                                                    // Troisième paramètre des couleurs (bleu)
  1039.     unsigned long t1TempoAffichageVariations = 0;                                                                                     // Début de la temporisation d'affichage de la vitesse des variations
  1040.    
  1041.     vitesseVariationTemperature = (T2 - T1) * pgm_read_byte(&k);                                                                      // Calcule la vitesse de variation de la température
  1042.     vitesseVariationHumidite = (H2 - H1) * pgm_read_byte(&k);                                                                         // Calcule la vitesse de variation du taux d'humidité
  1043.     //Serial.println(vitesseVariationTemperature); Serial.println(vitesseVariationHumidite);                                            // Débug (Désactiver le Dfplayer pour libérer le port série)
  1044.    
  1045.     if (abs(vitesseVariationTemperature) > 56) {vitesseVariationTemperature = 56;} // *********************************************** // Borne la vitesse de variation de la température
  1046.     if (abs(vitesseVariationHumidite) > 56) {vitesseVariationHumidite = 56;} // ***************************************************** // Borne la vitesse de variation du taux d'humidité
  1047.    
  1048.     FonctionCadre(1);                                                                                                                 // Efface l'afficheur OLED et Affiche le cadre (Taille police)
  1049.     display.setCursor(24, 5); LectureMemoireFlash(messageOLED14);                                                                     // Affiche le message "VITESSE" sur l'écran OLED
  1050.     display.setCursor(12, 24); LectureMemoireFlash(messageOLED15);                                                                    // Affiche le message "VARIATION" sur l'écran OLED
  1051.     display.setCursor(41, 44); LectureMemoireFlash(messageOLED16);                                                                    // Affiche le message "TEMP" sur l'écran OLED
  1052.     display.display();                                                                                                                // Rafraîchit l'affichage de l'écran OLED
  1053.    
  1054.     t1TempoAffichageVariations = millis();                                                                                            // Démarre la temporisation d'affichage de la vitesse de variation de la température
  1055.     if (vitesseVariationTemperature == 0) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la vitesse de variation de la température est nulle
  1056.     {
  1057.       while (millis() - t1TempoAffichageVariations < pgm_read_dword(&TempoAffichageVariations)) // ---------------------------------- // Affiche la vitesse de variation de la température pendant 5 secondes
  1058.       {
  1059.         for (int i = 26, j = 28; i >= 0, j <= pgm_read_byte(&nombreLedsColonne) - 2; i--, j++) // ................................... // Gestion de l'affichage des barrettes de leds adressables vers le haut et vers le bas
  1060.         {
  1061.           colonneLed.setPixelColor(27, colonneLed.Color(255, 255, 0));                                                                // Affiche la led centrale en jaune
  1062.           colonneLed.setPixelColor(i, colonneLed.Color(0, 0, 150));                                                                   // Affiche les leds en bleu du centre vers le bas
  1063.           colonneLed.setPixelColor(j, colonneLed.Color(150, 0, 0));                                                                   // Affiche les leds en rouge du centre vers le haut
  1064.           colonneLed.show();                                                                                                          // Rafraîchit l'affichage des barrettes de leds adressables
  1065.           if (testEvenements()) {break;} // ========================================================================================= // Si la fonction retourne "Vrai" => Sort de la boucle for()
  1066.           delay(25);                                                                                                                  // Temporise 25ms
  1067.         }
  1068.        
  1069.         if (testEvenements()) {break;} // ........................................................................................... // Si la fonction retourne "Vrai" => Sort de la boucle for()
  1070.         FonctionEffaceBarrettesLeds();                                                                                                // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  1071.       }
  1072.     }
  1073.     else if (vitesseVariationTemperature > 0) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la vitesse de variation de la température est positive
  1074.     {
  1075.       coul1 = 150; coul2 = 0; coul3 = 0;                                                                                              // Prépare l'affichage des leds en rouge
  1076.      
  1077.       while (millis() - t1TempoAffichageVariations < pgm_read_dword(&TempoAffichageVariations)) // ---------------------------------- // Affiche la variation de la vitesse de la température pendant 5 secondes
  1078.       {
  1079.         for (int i = 0; i < vitesseVariationTemperature; i++) // .................................................................... // Gestion de l'affichage des barrettes de leds adressables vers le haut
  1080.         {
  1081.           colonneLed.setPixelColor(i, colonneLed.Color(coul1, coul2, coul3));                                                         // Affiche la led de rang i en rouge vers le haut
  1082.           colonneLed.show();                                                                                                          // Rafraîchit l'affichage des barrettes de leds adressables
  1083.           if (testEvenements()) {break;} // ========================================================================================= // Si la fonction retourne "Vrai" => Sort de la boucle for()
  1084.           delay(25);                                                                                                                  // Temporise 25ms
  1085.         }
  1086.        
  1087.         if (testEvenements()) {break;} // ........................................................................................... // Si la fonction retourne "Vrai" => Sort de la boucle for()
  1088.         FonctionEffaceBarrettesLeds();                                                                                                // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  1089.       }
  1090.     }
  1091.     else if (vitesseVariationTemperature < 0) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la vitesse de variation de la température est négative
  1092.     {
  1093.       coul1 = 0; coul2 = 0; coul3 = 150;                                                                                              // Prépare l'affichage des leds en bleu
  1094.      
  1095.       while (millis() - t1TempoAffichageVariations < pgm_read_dword(&TempoAffichageVariations)) // ---------------------------------- // Affiche la vitesse de variation de la température pendant 5 secondes
  1096.       { // .......................................................................................................................... // Gestion de l'affichage des barrettes de leds adressables vers le bas
  1097.         for (int i = pgm_read_byte(&nombreLedsColonne) - 3; i > pgm_read_byte(&nombreLedsColonne) - 3 - abs(vitesseVariationTemperature); i--)
  1098.         {
  1099.           colonneLed.setPixelColor(i, colonneLed.Color(coul1, coul2, coul3));                                                         // Affiche la led de rang i en bleu
  1100.           colonneLed.show();                                                                                                          // Rafraîchit l'affichage des barrettes de leds adressables
  1101.           if (testEvenements()) {break;} // ========================================================================================= // Si la fonction retourne "Vrai" => Sort de la boucle for()
  1102.           delay(25);                                                                                                                  // Temporise 25ms
  1103.         }
  1104.        
  1105.         if (testEvenements()) {break;} // ........................................................................................... // Si la fonction retourne "Vrai" => Sort de la boucle for()
  1106.         FonctionEffaceBarrettesLeds();                                                                                                // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  1107.       }
  1108.     }
  1109.    
  1110.     if (!testEvenements()) // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Si la fonction a retourné "Faux" on continue avec l'affichage de la vitesse des variations du taux d'humidité
  1111.     {
  1112.       FonctionCadre(1);                                                                                                               // Efface l'afficheur OLED et Affiche le cadre (Taille police)
  1113.       display.setCursor(24, 5); LectureMemoireFlash(messageOLED14);                                                                   // Affiche le message "VITESSE" sur l'écran OLED
  1114.       display.setCursor(12, 24); LectureMemoireFlash(messageOLED15);                                                                  // Affiche le message "VARIATION" sur l'écran OLED
  1115.       display.setCursor(18, 44); LectureMemoireFlash(messageOLED17);                                                                  // Affiche le message "HUMIDITE" sur l'écran OLED
  1116.       display.display();                                                                                                              // Rafraîchit l'affichage de l'écran OLED
  1117.      
  1118.       t1TempoAffichageVariations = millis();                                                                                          // Démarre la temporisation d'affichage de la vitesse de variation du taux d'humidité
  1119.       if (vitesseVariationHumidite == 0) // ----------------------------------------------------------------------------------------- // Si la vitesse de variation du taux d'humidité est nulle
  1120.       {
  1121.         while (millis() - t1TempoAffichageVariations < pgm_read_dword(&TempoAffichageVariations)) // ................................ // Affiche la vitesse de variation du taux d'humidité pendant 5 secondes
  1122.         {
  1123.           for (int i = 28, j = 26; i >= 0, j <= pgm_read_byte(&nombreLedsColonne) - 2; i--, j++) // ================================= // Gestion de l'affichage des barrettes de leds adressables vers le haut et vers le bas
  1124.           {
  1125.             colonneLed.setPixelColor(27, colonneLed.Color(150, 0, 0));                                                                // Affiche la led centrale en rouge
  1126.             colonneLed.setPixelColor(i, colonneLed.Color(255, 255, 0));                                                               // Affiche les leds jaunes du centre vers le bas
  1127.             colonneLed.setPixelColor(j, colonneLed.Color(0, 150, 0));                                                                 // Affiche les leds vertes du centre vers le haut
  1128.             colonneLed.show();                                                                                                        // Rafraîchit l'affichage des barrettes de leds adressables
  1129.             if (testEvenements()) {break;} // _______________________________________________________________________________________ // Si la fonction retourne "Vrai" => Sort de la boucle for()
  1130.             delay(25);                                                                                                                // Temporise 25ms
  1131.           }
  1132.          
  1133.           if (testEvenements()) {break;} // ========================================================================================= // Si la fonction retourne "Vrai" => Sort de la boucle for()
  1134.           FonctionEffaceBarrettesLeds();                                                                                              // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  1135.         }
  1136.       }
  1137.       else if (vitesseVariationHumidite > 0) // ------------------------------------------------------------------------------------- // Si la vitesse de variation du taux d'humidité est positive
  1138.       {
  1139.         coul1 = 0; coul2 = 150; coul3 = 0;                                                                                            // Prépare l'affichage des leds en vert
  1140.        
  1141.         while (millis() - t1TempoAffichageVariations < pgm_read_dword(&TempoAffichageVariations)) // ................................ // Affiche la vitesse de variation du taux d'humidité pendant 5 secondes
  1142.         {
  1143.           for (int i = 0; i < vitesseVariationHumidite; i++) // ===================================================================== // Gestion de l'affichage des barrettes de leds adressables
  1144.           {
  1145.             colonneLed.setPixelColor(i, colonneLed.Color(coul1, coul2, coul3));                                                       // Affiche de la led de rang i en vert vert le haut
  1146.             colonneLed.show();                                                                                                        // Rafraîchit l'affichage des barrettes de leds adressables
  1147.             if (testEvenements()) {break;} // _______________________________________________________________________________________ // Si la fonction retourne "Vrai" => Sort de la boucle for()
  1148.             delay(25);                                                                                                                // Temporise 25ms
  1149.           }
  1150.          
  1151.           if (testEvenements()) {break;} // ========================================================================================= // Si la fonction retourne "Vrai" => Sort de la boucle for()
  1152.           FonctionEffaceBarrettesLeds();                                                                                              // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  1153.         }
  1154.       }
  1155.       else if (vitesseVariationHumidite < 0) // ------------------------------------------------------------------------------------- // Si la vitesse de variation du taux d'humidité est négative
  1156.       {
  1157.         coul1 = 255; coul2 = 255; coul3 = 0;                                                                                          // Prépare l'affichage des leds en jaune
  1158.        
  1159.         while (millis() - t1TempoAffichageVariations < pgm_read_dword(&TempoAffichageVariations)) // ................................ // Affiche la vitesse de variation du taux d'humidité pendant 5 secondes
  1160.         { // ======================================================================================================================== // Gestion de l'affichage des barrettes de leds adressables vers le bas
  1161.           for (int i = pgm_read_byte(&nombreLedsColonne) - 3; i > pgm_read_byte(&nombreLedsColonne) - 3 - abs(vitesseVariationHumidite); i--)
  1162.           {
  1163.             colonneLed.setPixelColor(i, colonneLed.Color(coul1, coul2, coul3));                                                       // Affiche la led de rang i en jaune vers le bas
  1164.             colonneLed.show();                                                                                                        // Rafraîchit l'affichage des barrettes de leds adressables
  1165.             if (testEvenements()) {break;} // _______________________________________________________________________________________ // Si la fonction retourne "Vrai" => Sort de la boucle for()
  1166.             delay(25);                                                                                                                // Temporise 25ms
  1167.           }
  1168.          
  1169.           if (testEvenements()) {break;} // ========================================================================================= // Si la fonction retourne "Vrai" => Sort de la boucle for()
  1170.           FonctionEffaceBarrettesLeds();                                                                                              // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  1171.         }
  1172.       }
  1173.     }
  1174.    
  1175.     FonctionEffaceBarrettesLeds();                                                                                                    // Appelle la fonction pour effacer toutes les barrettes de leds adressables
  1176.     display.clearDisplay();                                                                                                           // Efface l'afficheur OLED
  1177.     LastMins = -1;                                                                                                                    // Force l'affichage de l'heure courante
  1178.     LastJour = -1;                                                                                                                    // Force l'affichage de la date courante
  1179.     LasttauxHumiditeCourant = -1;                                                                                                     // Force l'affichage du taux d'humidité courant
  1180.     t1TempoAffichageMessageOled = 0;                                                                                                  // Réinitialise la temporisation de la durée d'affichages des messages sur l'écran OLED
  1181.     PageOled = 0;                                                                                                                     // Sélectionne la Page 0 de l'écran OLED
  1182.    
  1183.     T1 = 0; T2 = 0;                                                                                                                   // Réinitialise les valeurs de la température pour le calcul de la temporisation d'affichage de la vitesse de variation de la température
  1184.     H1 = 0; H2 = 0;                                                                                                                   // Réinitialise les valeurs du taux d'humidité pour le calcul de la temporisation d'affichage de la vitesse de variation du taux d'humidité
  1185.     t1TempoReleveVariations = 0;                                                                                                      // Réinitialise la temporisation pour le calcul et l'affichage des vitesses de variations de la température et du taux d'humidité
  1186.     MajAffichageVariations = false;                                                                                                   // Désactive l'indicateur de mise à jour des vitesses de variations de la température et du taux d'humidité
  1187.     MajAffichageTemperatureCourante = true;                                                                                           // Active l'indicateur de mise à jour de l'affichage des barrettes de leds adressables
  1188.     LasttemperatureCourante = -1;                                                                                                     // Force l'affichage de la température courante
  1189.   }
  1190.  
  1191. //**************************************************************************************************************************************************************************
  1192. }
  1193.  
  1194. //**************************************************************************************************************************************************************************
  1195. //*** Efface les barrettes de leds adressables *****************************************************************************************************************************
  1196. //**************************************************************************************************************************************************************************
  1197. void FonctionEffaceBarrettesLeds ()
  1198. {
  1199.   colonneLed.clear();                                                                                                                 // Efface les barrettes de leds adressables
  1200.   colonneLed.show();                                                                                                                  // Rafraîchit l'affichage des barrettes de leds adressables
  1201. }
  1202.  
  1203. //**************************************************************************************************************************************************************************
  1204. //*** Fonction test d'un évènement à prendre en compte pendant les boucles for() ou while() d'affichage sur les barrettes de leds adressables ******************************
  1205. //**************************************************************************************************************************************************************************
  1206. boolean testEvenements ()
  1207. {
  1208.   boolean evenementdetecte = false;                                                                                                   // Déclare l'indicateur d'un évènement à prendre en compte pendant les boucles for() ou while() d'affichage sur les barrettes de leds adressables
  1209.  
  1210.   FonctionLectureDS3234();                                                                                                            // Appelle la fonction de la gestion du module RTC DS3234
  1211.  
  1212.   if (Mins == 0 && Secs == 0) // **************************************************************************************************** // Si l'heure a changé et doit donc être annoncée
  1213.   {
  1214.     evenementdetecte = true;                                                                                                          // Active l'indicateur d'un évènement à prendre en compte pendant les boucles for() ou while() d'affichage sur les barrettes de leds adressables
  1215.     return evenementdetecte;                                                                                                          // Retourne la valeur "Vrai" de l'indicateur "evenementdetecte" dans "testEvenements()"
  1216.   }
  1217.   else if (Jour == pgm_read_byte(&JourCompteRebours) && Mois == pgm_read_byte(&MoisCompteRebours) // ******************************** // Si la date du compte à rebours de la  nouvelle année est atteinte
  1218.         && Hrs == pgm_read_byte(&HrsCompteRebours) && Mins == pgm_read_byte(&MinsCompteRebours) && Secs == 50)                        // et Si l'heure de départ du compte à rebours de la nouvelle année est atteinte
  1219.   {
  1220.     evenementdetecte = true;                                                                                                          // Active l'indicateur d'un évènement à prendre en compte pendant les boucles for() ou while() d'affichage sur les barrettes de leds adressables
  1221.     return evenementdetecte;                                                                                                          // Retourne la valeur "Vrai" de l'indicateur "evenementdetecte" dans "testEvenements()"
  1222.   }
  1223.   else if (digitalRead(BrocheBPOK) == LOW || digitalRead(BrocheBPDroite) == LOW || digitalRead(BrocheBPGauche) == LOW) // *********** // Si un des trois boutons poussoirs est activé
  1224.   {
  1225.     evenementdetecte = true;                                                                                                          // Active l'indicateur d'un évènement à prendre en compte pendant les boucles for() ou while() d'affichage sur les barrettes de leds adressables
  1226.     return evenementdetecte;                                                                                                          // Retourne la valeur "Vrai" de l'indicateur "evenementdetecte" dans "testEvenements()"
  1227.   }
  1228.   else {LectureDipSwitch();} // ***************************************************************************************************** // Appelle la fonction de lecture des Dip Switch
  1229.  
  1230.   if (LastEtatDipSwitchMuteGeneral != EtatDipSwitchMuteGeneral // ******************************************************************* // Si changement d'état du Dip Switch Mute Général
  1231.    || LastEtatDipSwitchMutePartiel != EtatDipSwitchMutePartiel                                                                        // ou Si changement d'état du Dip Switch Mute Partiel
  1232.    || LastEtatDipSwitchVoix != EtatDipSwitchVoix)                                                                                     // ou Si changement d'état du Dip Switch Voix
  1233.   {
  1234.     evenementdetecte = true;                                                                                                          // Active l'indicateur d'un évènement à prendre en compte pendant les boucles for() ou while() d'affichage sur les barrettes de leds adressables
  1235.     return evenementdetecte;                                                                                                          // Retourne la valeur "Vrai" de l'indicateur "evenementdetecte" dans "testEvenements()"
  1236.   }
  1237.   else {FonctionLecturePotentiometreVolume();} // *********************************************************************************** // Lit la valeur analogique sur la broche du curseur du potentiomètre (valeur entre 0 et 1023)
  1238.  
  1239.   if (LastvaleurPotentiometreVolume != valeurPotentiometreVolume // ***************************************************************** // Si la valeur lue a changé
  1240.    && abs(valeurPotentiometreVolume - LastvaleurPotentiometreVolume) > 30)                                                            // et Si l'écart entre la valeur actuelle et la dernière valeur est > 60
  1241.   {
  1242.     evenementdetecte = true;                                                                                                          // Active l'indicateur d'un évènement à prendre en compte pendant les boucles for() ou while() d'affichage sur les barrettes de leds adressables
  1243.   }
  1244.   else // *************************************************************************************************************************** // Sinon aucun évènement à prendre en compte pendant les boucles for() ou while() d'affichage sur les barrettes de leds adressables
  1245.   {
  1246.     evenementdetecte = false;                                                                                                         // Desactive l'indicateur d'un évènement à prendre en compte pendant les boucles for() ou while() d'affichage sur les barretes de leds adressables
  1247.   }
  1248.  
  1249.   return evenementdetecte;                                                                                                            // Retourne la valeur "Vrai" ou "Faux" de l'indicateur "evenementdetecte" dans "testEvenements()"
  1250. }
  1251.  
  1252. //**************************************************************************************************************************************************************************
  1253. //*** Fonction Gestion Buzzer **********************************************************************************************************************************************
  1254. //**************************************************************************************************************************************************************************
  1255. void Buzzer (int TempsH, int TempsL, int nb)                                                                                          // TempsH => délai buzzer ON, TempsL => délai buzzer OFF, nb => nombre de bips
  1256. {
  1257.   for (int x = 1; x <= nb; x++) // ************************************************************************************************** // Boucle le nombre de fois voulu passé par l'argument "int nb"
  1258.   {
  1259.     digitalWrite(BrocheBuzzer, HIGH);                                                                                                 // Active le buzzer
  1260.     delay (TempsH);                                                                                                                   // Temporisation à l'état haut du buzzer pendant la durée passée par l'argument "int TempsH"
  1261.     digitalWrite(BrocheBuzzer, LOW);                                                                                                  // Désactive le buzzer
  1262.     delay (TempsL);                                                                                                                   // Temporisation à l'état bas du buzzer pendant la durée passée par l'argument "int TempsL"
  1263.   }
  1264. }
  1265.  
  1266. //**************************************************************************************************************************************************************************
  1267. //*** Fonction Cadre sur écran Oled ****************************************************************************************************************************************
  1268. //**************************************************************************************************************************************************************************
  1269. void FonctionCadre (boolean taillePolice)
  1270. {
  1271.   display.clearDisplay();                                                                                                             // Efface l'afficheur OLED
  1272.   display.drawRoundRect(0, 0, display.width(), display.height(), 8, WHITE);                                                           // Affiche le cadre
  1273.   if (taillePolice) {display.setTextSize(2);}                                                                                         // Définit la taille du texte
  1274. }
  1275.  
  1276. //**************************************************************************************************************************************************************************
  1277. //*** Fonction Lecture des 3 Dip Switch ************************************************************************************************************************************
  1278. //**************************************************************************************************************************************************************************
  1279. void  LectureDipSwitch ()
  1280. {
  1281.   EtatDipSwitchMuteGeneral = digitalRead(BrocheDipSwitchMuteGeneral);                                                                 // Lecture des états des 3 Dip Switch
  1282.   EtatDipSwitchMutePartiel = digitalRead(BrocheDipSwitchMutePartiel);
  1283.   EtatDipSwitchVoix = digitalRead(BrocheDipSwitchVoix);
  1284. }
  1285.  
  1286. //**************************************************************************************************************************************************************************
  1287. //*** Fonction Lecture Mémoire Flash et Affichage les messages sur l'écran OLED ********************************************************************************************
  1288. //**************************************************************************************************************************************************************************
  1289. void LectureMemoireFlash (const char AdresseMessage[])
  1290. {
  1291.   char CaractereTemporaire = pgm_read_byte(AdresseMessage);                                                                           // Récupère le premier caractère
  1292.   char i = 0;                                                                                                                         // Compte le nombre de déplacements
  1293.  
  1294.   while (CaractereTemporaire != '\0') // ******************************************************************************************** // Tant que le caractère récupéré est différent du caractère de fin de chaîne de caractères
  1295.   {
  1296.     display.print(CaractereTemporaire);                                                                                               // Affichage du caractère lu
  1297.     i++;                                                                                                                              // Incrémente le pointeur d'adresse de la donnée à lire
  1298.     CaractereTemporaire = pgm_read_byte(AdresseMessage + i);                                                                          // Récupère le caractère suivant
  1299.   }
  1300. }
  1301.  
  1302. //**************************************************************************************************************************************************************************
  1303. //*** Fonction Gestion des deux points de l'affichage de l'heure sur l'écran OLED ******************************************************************************************
  1304. //**************************************************************************************************************************************************************************
  1305. void FonctionOsc2Points ()
  1306. {
  1307.   display.setTextSize(3);                                                                                                             // Définit la taille du texte
  1308.   display.setCursor(57, 3);                                                                                                           // Positionne l'affichage des deux points sur l'écran OLED
  1309.   if (Osc2Points) {LectureMemoireFlash(messageOLED01);} else {LectureMemoireFlash(messageOLED18);}                                    // Affiche l'oscillation des 2 points de l'affichage de l'heure sur l'écran OLED
  1310.   display.display();                                                                                                                  // Rafraîchit l'affichage de l'écran OLED
  1311. }
  1312.  
  1313. //**************************************************************************************************************************************************************************
  1314. //*** Fonction Interruption pour l'oscillation des 2 points de l'affichage de l'heure sur l'écran OLED *********************************************************************
  1315. //**************************************************************************************************************************************************************************
  1316. void Oscillations2Points ()
  1317. {
  1318.   Osc2Points = !Osc2Points;                                                                                                           // Inverse l'état de la variable pour l'oscillation des 2 points de l'affichage de l'heure sur l'écran OLED
  1319. }
  1320.  
  1321. //**************************************************************************************************************************************************************************
  1322. //*** Fonction Annonce audio de la nouvelle heure **************************************************************************************************************************
  1323. //**************************************************************************************************************************************************************************
  1324. void FonctionAnnonceNouvelleHeure ()
  1325. {
  1326.   int pisteAudioHeure = 0;                                                                                                            // Déclare la variable pisteAudioHeure
  1327.  
  1328.   Buzzer(8, 100, 2);
  1329.  
  1330.   if (!MuteGeneral && !MutePartiel) // ********************************************************************************************** // Le son du Dfplayer n'est jamais coupé
  1331.   {
  1332.     if (!Voix) // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Lecture des 24 premières pistes voix masculine (Voix 1)
  1333.     {
  1334.       pisteAudioHeure = Hrs;                                                                                                          // Calcule la piste du Dfplayer à lire
  1335.       if (Hrs == 0) {pisteAudioHeure = Hrs + 24;}                                                                                     // S'il est minuit lecture de la piste 24
  1336.     }
  1337.     else if (Voix) // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Lecture des 24 pistes suivante voix féminine (Voix 2)
  1338.     {
  1339.       pisteAudioHeure = Hrs + 24;                                                                                                     // Calcule la piste du Dfplayer à lire
  1340.       if (Hrs == 0) {pisteAudioHeure = Hrs + 48;}                                                                                     // S'il est minuit lecture de la piste 48
  1341.     }
  1342.   }
  1343.   else if (!MuteGeneral && MutePartiel) // ****************************************************************************************** // Le son du Dfplayer est coupé partiellement
  1344.   {
  1345.     if (Hrs <= pgm_read_byte(&HrsDebutMutePartiel) && Hrs >= pgm_read_byte(&HrsFinMutePartiel)) // ++++++++++++++++++++++++++++++++++ // Le son du Dfplayer est coupé dans ce créneaux horaire
  1346.     {
  1347.       if (!Voix) // ----------------------------------------------------------------------------------------------------------------- // Lecture des 24 premières pistes voix masculine (Voix 1)
  1348.       {
  1349.         pisteAudioHeure = Hrs;                                                                                                        // Calcule la piste du Dfplayer à lire
  1350.         if (Hrs == 0) {pisteAudioHeure = Hrs + 24;}                                                                                   // S'il est minuit lecture de la piste 24
  1351.       }
  1352.       else if (Voix) // ------------------------------------------------------------------------------------------------------------- // Lecture des 24 pistes suivante voix féminine (Voix 2)
  1353.       {
  1354.         pisteAudioHeure = Hrs + 24;                                                                                                   // Calcule la piste du Dfplayer à lire
  1355.         if (Hrs == 0) {pisteAudioHeure = Hrs + 48;}                                                                                   // S'il est minuit lecture de la piste 48
  1356.       }
  1357.     }
  1358.   }
  1359.  
  1360.   delay(100);                                                                                                                         // Temporise 100ms
  1361.   myDFPlayer.play(pisteAudioHeure);                                                                                                   // Lit la piste audio heure
  1362. }
  1363.  
  1364. //**************************************************************************************************************************************************************************
  1365. //*** Fonction de la Gestion du Module RTC DS3234 **************************************************************************************************************************
  1366. //**************************************************************************************************************************************************************************
  1367. void FonctionLectureDS3234 ()
  1368. {
  1369.   rtc.update();                                                                                                                       // Lit l'heure et la date dans le module RTC DS3234
  1370.   Hrs = rtc.hour(); Mins = rtc.minute(); Secs = rtc.second();                                                                         // Récupère les heures, les minutes et les secondes courantes
  1371.   Jour = rtc.date(); Mois = rtc.month(); Annee = rtc.year();                                                                          // Récupère la date courante
  1372. }
  1373.  
  1374. //**************************************************************************************************************************************************************************
  1375. //*** Fonction Animation Couleur du compte à rebours de la nouvelle année sur les barrettes de leds adressables ************************************************************
  1376. //**************************************************************************************************************************************************************************
  1377. int couleurColonne(byte positionColonne)
  1378. {
  1379.   positionColonne = 255 - positionColonne;
  1380.  
  1381.        if (positionColonne < 85)  {return colonneLed.Color(255 - positionColonne * 3, 0, positionColonne * 3);}
  1382.   else if (positionColonne < 170) {positionColonne -= 85; return colonneLed.Color(0, positionColonne * 3, 255 - positionColonne * 3);}
  1383.   else {positionColonne -= 170; return colonneLed.Color(positionColonne * 3, 255 - positionColonne * 3, 0);}
  1384. }
  1385.  
  1386. //**************************************************************************************************************************************************************************
  1387. //*** Fonction Animation du compte à rebours de la nouvelle année sur les barrettes de leds adressables ********************************************************************
  1388. //**************************************************************************************************************************************************************************
  1389. void AnimationCompteAReboursBarrettesLeds ()
  1390. {
  1391.   for (int i = 0; i < pgm_read_byte(&nombreLedsColonne); i++)
  1392.   {
  1393.     colonneLed.setPixelColor(i, couleurColonne(((i * 256 / pgm_read_byte(&nombreLedsColonne)) + nbCycleAnimationCompteAReboursBarrettesLeds) & 255));
  1394.   }
  1395.  
  1396.   colonneLed.show();                                                                                                                  // Rafraîchit l'affichage des barrettes de leds adressables
  1397.  
  1398.   nbCycleAnimationCompteAReboursBarrettesLeds++;
  1399.   if (nbCycleAnimationCompteAReboursBarrettesLeds == 256 * 5) {nbCycleAnimationCompteAReboursBarrettesLeds = 0;}
  1400. }
  1401.  
  1402. //**************************************************************************************************************************************************************************
  1403. //*** Fonction Lecture du potentiomètre du volume du Dfplayer **************************************************************************************************************
  1404. //**************************************************************************************************************************************************************************
  1405. void FonctionLecturePotentiometreVolume ()
  1406. {
  1407.   valeurPotentiometreVolume = analogRead(BrochePotentiometreVolume);                                                                  // Lit la valeur analogique sur la broche du curseur du potentiomètre (valeur entre 0 et 1023)
  1408. }
  1409.  
Add Comment
Please, Sign In to add comment