Descriptions des tâches pour l'optimiseur du chauffage central V2.5 24052011
----------------------------------------------------------------------------

Liste des tâches
----------------

Programme Principal
*******************
 Initialiser le micro-contrôleur AtMega16 ou AtMega32
 Initialiser le LCD (2 X 16)
 Initialiser le DS3231 en I2C (Real Time Clock à TCXO intégrée)
 Initialiser le chip EEPROM en I2C ( en option = mémoire supplémentaire)
   ce circuit devra être chargé à l'avance avec les différents tableaux
   puis initialisé avec les plages horaires.
 Initialiser et lire les températures des 4 DS18B20-PAR (1Wire)
 Créer et initialiser les variables (mettre des valeurs par défaut lors du
   premier démarrage du µ-Contrôleur, ensuite celles-ci seront sauvegardées
   dans l'EEprom de l'µC et pourront être14:28 24/05/2011 changées via la routine MENU)

 Début de la boucle infinie
   Aller à la routine LitEncodeur
   Aller à la routine LitHeure
   Aller à la routine LitPlageH
   Aller à la routine LitSondeT
   Aller à la routine Consommation
   Aller à la routine CourbeDeChau
   Aller à la routine ModeActif
   Aller à la routine Communication
   Aller à la routine Affichage
   Aller à la routine AffiLCD
 Fin de la boucle infinie


















*******************************************************************************
Liste des Sous-Routines
*******************************************************************************
-------------------------------------------------------------------------------
Routine LitEncodeur                          ' Encodeur rotatif avec poussoir
-------------------------------------------------------------------------------
 Si Molette en rotation
   Allumage du rétro-éclairage du LCD
   Si Mode = 2                               ' Mode Nuit
      TConsNuitOld = TConsNuit               ' <ANCIENNE: TT.T°C>      
      Boucle d'attente de "Appuis Bouton" ou dépassement du temps "Molette
      inactive > 3 secondes"      
         Ligne1 <ANCIENNE: TT.T°C>            ' TConsNuitOld
         Ligne2 <NOUVELLE: TT.T°C>            ' TConsNuit
         Aller à la routine AffiLCD
         Si Molette en rotation
            TT.T°C de ligne2 s'affiche en contraste inversé
            TT.T°C varie en + ou en - par 0.5°C suivant le sens de rotation
         Finsi
      Fin de la boucle d'attente de "Appuis Bouton" ou dépassement du temps
      "Molette inactive > 3 secondes"      
      Mise à jour de TConsNuit
   Finsi
   Si Mode = 3                                ' Mode Jour
      TConsJourOld = TConsJour                ' <ANCIENNE: TT.T°C>
      Boucle d'attente de "Appuis Bouton" ou dépassement du temps "Molette
      inactive > 3 secondes"
         Ligne1 <ANCIENNE: TT.T°C>            ' TConsJourOld
         Ligne2 <NOUVELLE: TT.T°C>            ' TConsJour
         Aller à la routine AffiLCD
         Si Molette en rotation
            TT.T°C de ligne2 s'affiche en contraste inversé
            TT.T°C varie en + ou en - par 0.5°C suivant le sens de rotation
         Finsi
      Fin de la boucle d'attente de "Appuis Bouton" ou dépassement du temps
      "Molette inactive > 3 secondes"
      Mise à jour de TConsJour
   Finsi
   Si Mode = 4                                ' Mode Horloge
      TConsJourOld = TConsJour                ' <ANCIENNE: TT.T°C>
      Boucle d'attente de "Appuis Bouton" ou dépassement du temps "Molette
      inactive > 3 secondes"
         Ligne1 <ANCIENNE: TT.T°C>            ' TConsJourOld
         Ligne2 <NOUVELLE: TT.T°C>            ' TConsJourTmp
         Aller à la routine AffiLCD
         Si Molette en rotation
            TT.T°C de ligne2 s'affiche en contraste inversé
            TT.T°C varie en + ou en - par 0.5°C suivant le sens de rotation
         Finsi
      Fin de la boucle d'attente de "Appuis Bouton" ou dépassement du temps
      "Molette inactive > 3 secondes"
      Mise à jour de TConsJour
   Finsi   
 Extinction du rétro-éclairage du LCD
 Sortie de la routine   
 Finsi
 Si Bouton poussé pour une durée inférieure à 0,5 seconde
   Allumage du rétro-éclairage du LCD
   Si Mode = 4                             ' Mode Horloge
      Inverse la valeur de DerogaBit       ' valeur 0 ou 1
      Si DerogaBit = 1
         Mode = 5                          ' Mode Dérogation
      Finsi
   Finsi
 Finsi
 Si Bouton poussé pour une durée supérieure à 1 seconde
   Aller à la routine Menu
 Finsi
 Si Bouton poussé brièvement suivi d'une rotation de la Molette
   Aller à la routine ChgtMode
 Finsi
 Extinction du rétro-éclairage du LCD
Fin de LitBouton

-------------------------------------------------------------------------------
Routine ChgtMode                  ' Changement de Mode
-------------------------------------------------------------------------------
 Affichage sur Ligne1 <Change le MODE>
 Affichage du mode en cours en contraste inversé sur Ligne2
 Si Mode = 5                      ' Si Mode Dérogation - Override
    Mode = 4                      ' On se trouve alors en Mode Horloge
 Finsi
 'exemple:  Mode1 = Veille ou OFF
            Mode2 = Nuit
            Mode3 = Jour
            Mode4 = Horloge
 Si Molette en rotation
   Défilement des 4 Modes en avant ou en arrière suivant le sens de rotation
   Si Bouton appuyé
      Mise à jour du Mode se trouvant en contraste inversé
   Finsi
 Si Molette inactive > 3 secondes
 Finsi
Fin de ChgtMode




-------------------------------------------------------------------------------
Routine ModeActif                 ' Exécute les actions suivant les modes
-------------------------------------------------------------------------------
 Si Mode = 1                      ' Mise du chauffage en SECURITE (Veille)
   LedA = <ON>                    ' Led jaune (Veille) allumée
   TCons = 5                      ' Protection antigel de l'immeuble
   If Te < 1,5
      Aller à la routine CourbeDeChau
      PompeChau = <ON> pour 10 minutes toutes les 6 heures
   If TE < -5
      PompeChau = <ON>            ' Relais pompe chauffage enclenché
   Finsi
 Si Mode = 2 ou Plage = 0         ' Mode = Nuit
   Si TConsNuitOld<>TConsNuit     ' La température de consigne a été changée
      TCons = TConsNuit           ' Mise à jour de la consigne
      TConsNuitOld = TConsNuit    ' Remise à jour de la consigne
      LedB = <ON>                 ' Led rouge (Nuit) allumée
   Finsi
 Si Mode = 3 ou Plage = 1         ' Mode = Jour
   Si TConsJourOld<>TConsJour     ' La température de consigne a été changée
      TCons = TConsJour           ' Mise à jour de la consigne
      TConsJourOld = TConsJour    ' Remise à jour de la consigne
      LedC = <ON>                 ' Led verte (Jour) allumée
   Finsi
 Si Mode = 4                      ' Mode = Horloge
   Si Plage = 1                   ' Egale à jour
      TCons = TConsJour
      LedD = <ON>                 ' Led bleue (Horloge) allumée
      LedC = <ON>                 ' Led verte (Jour) allumée
   Finsi
   Si Plage = 0                   ' Egale à nuit
      TCons = TConsNuit
      LedD = <ON>                 ' Led bleue (Horloge) allumée
      LedB = <ON>                 ' Led rouge (Nuit) allumée
   Finsi
 Si Mode = 5                      ' Mode = Dérogation ou Override
   Si DerogaBit = 1
      Si  Plage = 1               ' Egale à jour
         TConsNuit = TConsNuitOld ' Restitution de la température de consigne
         TCons = TConsJour
         LedD = <ON>              ' Led bleue (Horloge) allumée et Led verte
         LedC = <Clignote>        ' (Jour) clignote 5mS toutes les 2 secondes
      Si Plage = 0                ' Egale à nuit
         TConsJour = TConsJourOld ' Restitution de la température de consigne
         TCons = TConsNuit
         LedD = <ON>              ' Led bleue (Horloge) allumée et Led rouge
         LedB = <Clignote>        ' (Nuit) clignote 5mS toutes les 2 secondes
      Finsi
   Finsi
 Finsi
   Aller à la routine CommandeChau
Fin de ModeActif

-------------------------------------------------------------------------------
Routine CourbeDeChau            ' Calcul la  courbe de chauffe
-------------------------------------------------------------------------------
 Si CycleCourbe > 1             ' Après un cycle, on peut optimiser
    CycleCourbe = 0
 Finsi
   Teau = Pente X Te + Pivot    '(y = ax + b)
 Si TiMoy > TCons               ' Diminution de la Pente
   Pivot = Pivot                ' Pivot = 63,125°C
   Pente = (Teau1-(TiMoy-TCons)-Pivot)/Te1 ' Teau1 = 80°C , Te1 = -9°C
 Si TiMoy < TCons               ' Déplacement du point Pivot vers le haut
   Pente = Pente                ' Pente = -1,875
   Pivot = Pivot + (TCons-TiMoy)
   Teau = Pente X Te1 + Pivot
   If Teau => Teau1
      Pente = (Teau1 - Pivot) / Te1
   Finsi
 Finsi
Fin de CourbeDeChau


























-------------------------------------------------------------------------------
Routine CommandeChau              ' Optimise la température d'eau du chauffage
-------------------------------------------------------------------------------
 Si TECS < TECS - HysECS          ' Eau chaude sanitaire est PRIORITAIRE
   PompeCha = <OFF>               ' on force l'arrêt de la pompe du chauffage
   Led1 = <OFF>                   ' Extinction de la Led1 rouge   
   PompeECS = <ON>                ' on enclenche la pompe du ballon ECS
   Led2 = <ON>                    ' Allumage de la Led2 rouge    
 Finsi  
 Si TECS > TECS + HysECS
   PompeECS = <OFF>               ' on arrête la pompe du ballon ECS
   Si Ti < TCons                  ' Si la temp. int. est < la temp. de consigne
      PompeCha = <ON>             ' on enclenche la pompe du chauffage
      Led1 = <ON>                 ' Allumage de la Led1 rouge
   Finsi      
   Si Teau = Ti                   ' Si la température d'eau = la temp. intérieur
      PompeCha = <OFF>            ' on arrête la pompe du chauffage
      Led1 = <OFF>                ' Extinction de la Led1 rouge
   Finsi      
   Si Teau < Teau - HysEau & Bruleur = <OFF>
      CycleChau = cycleChau + 1
      Led3 = <ON>                 ' Allumage de la Led3 rouge
      Led4 = <OFF>                ' Extinction de la Led4 rouge       
      Si commande du Brûleur
         Brûleur = <ON>
      Finsi         
      Si commande d'une Vanne à 3 voies
         Vanne = <Ouverte>
      Finsi         
      Si commande d'une Vanne Analogique
         Vanne Ana = <Envoi d'une tension comprise entre 0 et 10 V>
      Finsi
   Finsi      
   Si Teau > Teau + HysEau & Bruleur = <ON>
      Led3 = <OFF>                ' Extinction de la Led3 rouge 
      Led4 = <ON>                 ' Allumage de la Led4 rouge   
      Si commande du Brûleur
         Bruleur = <OFF>
      Finsi         
      Si commande d'une Vanne à 3 voies
         Vanne3Voies = <Fermee>
      Finsi         
      si commande d'une Vanne Analogique
         VanneAnalo = <Contrôle fermeture>
      Finsi
   Finsi
   Si Heure = 0 & Minute = 0      ' Si Minuit juste
      Si CyclePompe = 0           ' Si la pompe du chauffage n'a pas
         CyclePompe = 1           ' du tout fonctionné durant 24H
         PompeChau = <ON>         ' Pompe <ON> pour 1 minute
         Led1 = <ON>              ' Allumage de la Led1 rouge
      Finsi         
   Sinon  
      Si Heure = 0 & Minute > 1
         PompeChau = <OFF>        ' Arrêt de la pompe du chauffage
         Led1 = <OFF>             ' Extinction de la Led1 rouge         
         CyclePompe = 0           ' Reset de CyclePompe      
      Finsi    
   Finsi
 Finsi
Fin de CommandeChau

-------------------------------------------------------------------------------
Routine LitHeure                ' Lecture dans le DS3231
-------------------------------------------------------------------------------
 Utilise le protocole I2C pour lire l'heure et la date dans DS3231
 Aller à la routine Affichage
Fin de LitHeure

-------------------------------------------------------------------------------
Routine LitSondeT               ' Lecture des sondes de températures
-------------------------------------------------------------------------------
 Lire la sonde Teau             ' Température eau du chauffage
 Lire la sonde Ti               ' Température intérieure
 Lire la sonde TECS             ' Température de l'eau sanitaire
 Si Minute = 00 ou 05           ' Toutes les 5 minutes, on lit La température
   Lire la sonde Te             ' extérieure, car elle ne varie pas rapidement
   Si Modulo 15 de Minute = 0   ' Tous les quarts d'heure
      TeMoy = TeMoy + Te        ' Additionne les températures extérieures
   Finsi
 Si Ti < TiMin                  ' Si température intérieure est < que Ti minimum
   TiMin = Ti                   ' Température intérieure minimum = Ti
 Si Ti > TiMax                  ' Si température intérieure est < que Ti maximum
   TiMax = Ti                   ' Température intérieure maximum = Ti
 Finsi
 TiMoy = (TiMin + TiMax)/2      ' Calcul de la température intérieure moyenne
Fin de LitSondeT











-------------------------------------------------------------------------------
Routine LitPlageH               ' Lecture des plages horaires programmées
-------------------------------------------------------------------------------
 Plage = 0
 Si Mode = 4
   QHeure = quel est le nombre de 1/4 d'heure?   ' 24 heures = 96 * 15 min.
   Jour = Quel est le jour de la semaine? (0 à 6 ou 1 à 7 = voir datasheet RTC)
   For i = 1 to 4
      If Plage (i,1) = Jour
         If Plage (i,2) < QHeure
            If Plage (i,3) > QHeure
               Plage = 1
            Endif
         Endif
      Endif
   Next
 Endif
Fin de LitPlageH

-------------------------------------------------------------------------------
Routine Consommation            '( consommation en % du temps sur 24 heures)
-------------------------------------------------------------------------------
 ConsoJour = ((minutes de fonctionnement brûleur depuis 00h00 - minutes de
 production ECS depuis 00h00) / minutes écoulées depuis 00h00)*100 = xx%
 Si Heure = 00 et Minute = 00     ' Si il est minuit
   TeMoy = TeMoy/96             ' Calcul de la température moyenne sur 1 jour
   Aller à la routine EcritEEprom
   TeMoy = Te                   ' Réinitialisation de TeMoy
 Finsi
  DureePompeCha = Minutes de fonctionnement journalier de la pompe chauffage
Fin de Consommation

-------------------------------------------------------------------------------
Routine EcritEEprom             ' Ecriture dans l'EEprom du µC
-------------------------------------------------------------------------------
   Ecrire dans l'EEprom dd/mm/aa, la TeMoy et la consoJour en %
Fin de EcritEEprom












-------------------------------------------------------------------------------
Routine Communication           ' Communication avec le PC via le port série
-------------------------------------------------------------------------------
 Test si Port RS232 connecté
   Si "demande info" venant du PC
      Aller à LectureEEprom
      Envoi des données sur le port série
   Finsi
REM. Pour le futur lorsque l'interface PC sera développée ou Hyperterminal
 Test si réception d'une commande
 Si <Commande>
   Traitement de la commande
 Finsi
Fin de Communication

-------------------------------------------------------------------------------
Routine LectureEEprom           ' Lecture dans l'EEprom du µC
-------------------------------------------------------------------------------
 Lecture dans l'EEprom de l'µC des consommations et paramètres.
Fin de LectureEEprom

-------------------------------------------------------------------------------
Routine Affichage               ' Formatage des lignes à afficher
-------------------------------------------------------------------------------
 Ligne1 = Jour (JJJ), la date (DD/MM), La température de la pièce (Ti)
 Ligne2 = % d'utilisation ConsoJour(00%), l'heure (hh:mm), la température
          extérieure (Te)
 Aller à la routine AffiLCD
Fin de Affichage

-------------------------------------------------------------------------------
Routine AffiLCD                 'Affichage sur l'écran LCD
-------------------------------------------------------------------------------
 Envoi de la Ligne1 sur le LCD
 Envoi de la Ligne2 sur le LCD
Fin de AffiLCD













-------------------------------------------------------------------------------
Routine Menu                    ' Menu pour les réglages et les choix
-------------------------------------------------------------------------------

Construction et explication du "Menu".
--------------------------------------
Le "MENU" est composé de "Codes Actions", de "Tableaux" et d'un fichier chargé
en EEprom.
- Les "Codes Action" vont de 128 à 144 ( Voir ci-dessous ).
- Les Tableaux sont:
  "Indice(18)", "LimitBas(18)", "LimitHaut(18)", " Divise(18)", "Form(16)".
- Le fichier comprend un nombre de variables équivalent au nombre de fenêtres à
  afficher sur le LCD, chaque variable comprend 37 octets.
Chaque variable ici appelée "Ligne du Menu" ou "fenêtre" comprend:
le texte à afficher sur les lignes du LCD ( Ligne1$ et Ligne2$ ), l'emplacement
du caractère à faire clignoter ( MnuPosCur ) ou la position du curseur.
Si la "Molette" de l'encodeur est tournée vers la droite ( Suite+ ) et que le
nombre indiqué dans la colonne du tableau est plus petit que 128, on se déplace
au numéro de ligne dans le "Menu" correspondant à ce nombre. Sinon, on exécute
l'action 128 ( incrémente la valeur se trouvant sous le curseur ), par contre
si la "Molette de l'encodeur est tournée vers la gauche ( Suite- ) et que le
nombre indiqué dans la colonne du tableau est plus petit que 128, on se déplace
au numéro de ligne dans le "Menu" correspondant à ce nombre. Sinon, on exécute
l'action 129, c'est-à-dire ( décrémente la valeur se trouvant sous le curseur ),
enfin si le "Bouton" est appuyé ( Return ) et que le nombre indiqué est plus
petit que 128, on se déplace au numéro de ligne dans le "Menu" correspondant à
ce nombre. Sinon, on exécute le "Code action" qui correspond au tableau de 18
éléments "Indice()", lequel est lié aux tableaux "LimitBas(18)", "LimitHaut(18)",
" Divise(18)" et "Form(16)".

Routine Principale:
-------------------
   TempoEnco = 0                        ' Temporisation de contrôle d'activité
   MnuNum = 1                           ' Première ligne du "Menu" (11a)
Début de BOUCLE infinie
   Incrémente TempoEnco à chaque seconde
   Lecture de la mémoire à partir de
   MnuAdres = BaseAdres + 37 * (MnuNum - 1)
   Affichage Ligne1 = MnuAdres
   Affichage Ligne2 = MnuAdres + 16
   MnuPosCur = MnuAdres + 32
   MnuActHorlo = MnuAdres + 33
   MnuActAntiH = MnuAdres + 34
   MnuActRet = MnuAdres + 35
   MnuIndiVar = MnuAdres + 36 
   Allumage du Rétro-éclairage
   Afficher les 2 lignes de 16 caractères sur le LCD


   Si MnuPosCur > 0
      Afficher et positionner le Curseur à MnuPosCur
   Sinon
      Faire clignoter le caractère à la position correspondante à MnuPosCur   
   FinSi   
   Si Molette +                           ' Sens horlogique
      TempoEnco = 0                       ' Réinitialisation du timer
      Si MnuActHorlo < 128                ' Si MnuActHorlo plus petit que 128
         MnuNum = MnuActHorlo             ' on va à la ligne du "Menu" = MnuNum
         Le caractère clignote à la position correspondante à MnuPosCur
      Sinon
         Le curseur est à la position correspondante à MnuPosCur
         Incrémente Indice(MnuIndiVar)
         Si Indice(MnuIndiVar) > LimitHaut
            Indice(MnuIndiVar) = LimitBas
         FinSi
         Indice(MnuIndiVar) = Indice(MnuIndiVar)/Divise
         Afficher Indice(MnuIndiVar)      ' Afficher valeur sur le LCD
         On va à la routine "MiseAJourVariable"
      FinSi
   Sinon Si Molette -                     ' Sens anti-horlogique
      TempoEnco = 0                       ' Réinitialisation du timer   
      Si MnuActAntiH < 128                ' Si MnuActAntiH plus petit que 128
         MnuNum = MnuActAntiH             ' on va à la ligne MnuNum
         Le caractère clignote à la position correspondante à MnuPosCur
      Sinon
         Le curseur est à la position correspondante à MnuPosCur
         Décrémente Indice(MnuIndiVar)
         Si Indice(MnuIndiVar) > LimitHaut
            Indice(MnuIndiVar) = LimitBas
         FinSi
         Indice(MnuIndiVar) = Indice(MnuIndiVar)/Divise
         Afficher Indice(MnuIndiVar)      ' Afficher valeur sur le LCD
         On va à la routine "MiseAJourVariable"
      FinSi
   Sinon Si Bouton appuyé                 ' Bouton au centre de la Molette
      TempoEnco = 0                       ' Réinitialisation du timer   
      Si MnuActRet = 130
         SORTIE de la boucle de MENU      ' On quitte le Menu, affichage normal
      Sinon Si MnuActRet < 128            ' Si Bouton appuyé et MnuActRet < 128
         MnuNum = MnuActRet               ' on se déplace à la ligne du Menu  
      Sinon Si MnuActRet > ou = 131 et < ou = 134
         Indice(1) = MnuActRet - 130      ' Sélection du Cycle de 1 à 4           
      Sinon Si MnuActRet > ou = 135 et < ou = 141
         Indice(2) = MnuActRet - 134      ' Sélection du jour de la semaine
         MnuNum = 54                      ' Après, on saute à la ligne 54         
      Sinon Si MnuActRet = 142            ' On efface les plages affichées
         (Suppression Plage en cours)
         MnuNum = 31                      ' Après, on retourne à la ligne 31 
      Sinon Si MnuActRet > ou = 143 et < ou = 144   
         Vanne_3_voies = MnuActRet - 143  ' Sélection du Type de vanne utilisée,
      FinSi                               ' Vanne Ouvert/Fermer ou Analogique
   Sinon Si TempoEnco > 30                ' 30 secondes (peut être modifié)
      SORTIE de la boucle infinie         ' On quitte le Menu, affichage normal
   FinSi
Retour au début de la BOUCLE infinie
Extinction du Rétro-éclairage
Sortie et fin de la routine principale
======================================







































Routine de "MiseAJourVariable":
-------------------------------
Si MnuNum = 8
  Annee = valeur                          ' (0 à 99)
Sinon Si MnuNum = 9
  Heure = Valeur                          ' (0 à 23)
Sinon Si MnuNum = 18
  Mois = Valeur                           ' (0 à 12)
Sinon Si MnuNum = 19
  Minute = Valeur                         ' (0 à 59)  
Sinon Si MnuNum = 20
  TempECS = Valeur                        ' (60 à 85)/1
Sinon Si MnuNum = 21
  HysTempHab = Valeur                     ' (1 à 10)/10
Sinon Si MnuNum = 32
  JourDate = Valeur                       ' (1 à 31)
Sinon Si MnuNum = 33
  HysTempEau = Valeur                     ' (1 à 10)/2
Sinon Si MnuNum = 34
  TempMiniExt = Valeur                    ' (-30 à 0)/2
Sinon Si MnuNum = 35
  TempMaxiEau = Valeur                    ' (50 à 90)/1
Sinon Si MnuNum = 48
  Cycle = Valeur                          ' (1 à 4)/1
                  ///NumPlage             ' (1 à 96)
                  ///JourPlage            ' (1 à 7)
                  /// HDebutPlage         ' (0 à 96)
                  /// DureePlage          ' (1 à 96)
Sinon Si MnuNum = 49
  Cycle = Valeur                          ' (1 à 4)
                  /// TCycleJour(Cycle)
Sinon Si MnuNum = 50
  Cycle = Valeur                          ' (1 à 4)
                  /// TCycleNuit(Cycle)
Sinon Si MnuNum = 51
  HysTempECS = Valeur                     ' (1 à 10)/2
Sinon Si MnuNum = 54
  JourSemaine = Valeur (JJJ)
                  /// Début jj:mm calculé par 1/4 heure
Sinon Si MnuNum = 55
  JourSemaine = Valeur (JJJ)
                  /// Durée / Heure début / Heure de fin
Sinon Si MnuNum = 58
  Cycle = Valeur (1 à 4) ///
Sinon Si MnuNum = 59
  Cycle = Valeur (1 à 4) ///
FinSi
Fin de la routine et retour dans la routine principale  

 Allumage du rétro-éclairage du LCD
 Boucle d'attente de dépassement du temps "Molette inactive > 30 secondes"
 11a- MENU (Programme, Date, Heure, Réglages, Sortie)
   12a- PROGRAMME (Choix_cycle, Sortie) - ( il y a maximum 4 Cycles ).
      13a- CHOIX_CYCLE  - Cycle 1.
      13b- CHOIX_CYCLE  - Cycle 2.
      13c- CHOIX_CYCLE  - Cycle 3.      
      13d- CHOIX_CYCLE  - Cycle 4.
         14a- Cycle<x> (Sélection, Ajout_plage, Editer_cycle, Sortie).               
            15a- SELECTION CYCLE<x>
                 OUI = SORTIE du MENU avec prise en compte du cycle sélectionné.
            15b- SELECTION CYCLE<x>
                 NON = saut en 12b sur SORTIE.               
         14b- AJOUT_PLAGE (Jour, Heure, Qheure, Sortie).
            15c- Lundi ( 1 ).
            15d- Mardi ( 2 ).
            15e- Mercredi ( 3 ).
            15f- Jeudi ( 4 ).
            15g- Vendredi ( 5 ).
            15h- samedi ( 6 ).
            15i- Dimanche ( 7 ).
               16a- HEURE Jour<x> ( Heure de départ de chauffe de 00 à 23 ).
                     DEBUT A xx:00
               16b- HEURE Jour<x> ( Minute de départ de chauffe de 00 à 59 ).
                     DEBUT A 07:xx
               16c- FIN DE CHAUFFE - (incrémente par pas de 15 minutes).
                     JJJ DUREE xxHxxM (96 pas de 15 min. affichés en hh et mm).
                     DE xx:xx A xx:xx ( affiche l'heure de début et de fin).
                  17a- CYCLE <x>
                        CONTINUER = saut en 14b sur AJOUT_PLAGE.
                  17b- CYCLE <x>
                        SORTIE = saut en 15j sur SORTIE.
            15j- SORTIE = Saut en 14d sur SORTIE.
         14c- CYCLE <x> ( Editer_Cycle, SORTIE).
            15k- Editer_Cycle - Affiche ce qui suit sur l'afficheur :
                  CYCLE <x> Plage <xx> ( sur la ligne1 ).
                  JJJ hh:mm hh:mm ( ligne2 ) Toutes les plages programmées pour
                   le cycle affiché défilent à l'aide de la molette.
               16d- SUPPRIMER PLAGE
                     NON = saut en 14d sur SORTIE.
               16e- SUPPRIMER PLAGE
                     OUI = Effacement de la Plage horaire affichée du jour
                     également affiché et saut en 14d sur SORTIE.
         14d- SORTIE = Validation et saut en 12b sur SORTIE.            
   12b- SORTIE = Validation et saut en 51a sur SORTIE.
 21a- DATE (Année, Mois, Jour), Validation et saut en 22a sur ANNEE.
   22a- ANNEE <20xx> (de 0 à 99), Validation et saut en 23a sur MOIS. 
      23a- MOIS <xx> (de 1 à 12), Validation et saut en 24a sur JOUR.
         24a- JOUR <xx> (de 1 à 28, 29,30 ou 31), Validation et saut en 31a.
 31a- HEURE (Heure, Minute, Seconde), Validation et saut en 32a sur Heure.
   32a- Heure <xx> (de 0 à 23), Validation et saut en 33a sur Minute.
      33a- Minute <xx> (de 0 à 59), Validation et mise à zéro des secondes et
            mise à jour de la RTC, puis saut en 51a sur SORTIE.      
 41a- REGLAGES (Températures, Hystérésis, Paramètres, Sortie).
   42a- TEMPERATURES (Jour, Nuit, ECS), Validation et saut en 43a sur JOUR.
      43a- JOUR <xx,x°C> (de 15 à 25,5°C au demi-degré), valider et saut en 44a.
         44a- NUIT <xx,x°C> (de 10 à 20,5°C au demi-degré), valider et saut 45a.
            45a- ECS <xx°C> (de 60°C à 85°C par 5 degrés) - après validation,
                  saut en 42b sur HYSTERESIS.
   42b- HYSTERESIS (Hys.Temp.Ambiante, Hys.Temp.Radiateur, Hys.Temp.ECS),valider
         et saut en 43b sur Hystérésis_Température_Ambiante.
      43b- HYS.T.AMBIANTE (de 0,1 à 1°C au dixième de degré), val. et saut 44b.
         44b- HYS.T.RADIATEUR (de 0,5 à 5,0°C au demi-degré), val. et saut 45b.
            45b- HYSTERESIS ECS (de 0,5 à 5,0°C au demi-degré), val et saut 42c.
   42c- PARAMETRES ( Température Minimum Extérieure , Température Maximale
         Chaudière, Type de Régulation, Sortie ).
      43c- TEMP. MINI. EXT., validation et saut en 44c.
         44c- <-xx°C>, ( voir tableau des régions ), validation et saut en 43d.
      43d- T. MAXI. CHAUDIERE, ( voir constructeur ), validation et saut en 44d.
         44d- <xx°C>, validation et saut en 43f.     
      43e- TYPE DE REGULATION ( Chaudière, Vannes_à_3_voies ).
         44e- CHAUDIERE, validation et saut en 43f sur SORTIE.        
         44f- VANNE-3-VOIES (Ouvrir/Fermer, Analogique), valider et saut en 45c.
            45c- OUVRIR/FERMER, validation et saut en 43f sur SORTIE. 
            45d- VANNE ANALOGIQUE, validation et saut en 43f sur SORTIE.
      43f- SORTIE (vers REGLAGES), validation et saut en 42d sur SORTIE.
   42d- SORTIE (vers MENU), validation et saut en 51a sur SORTIE.
 51a- SORTIE ( du MENU = Retour au Mode Normal ).
 Fin de boucle d'attente de dépassement du temps "Molette inactive > 30 sec."
 Extinction du rétro-éclairage du LCD. 
Fin de Menu

















-------------------------------------------------------------------------------
Routine ChgtHeure               ' Mise à l'heure du DS3231
-------------------------------------------------------------------------------
 Clignotement de l'année
   Affichage du curseur sous le troisième chiffre (L1/P15)
   Boucle d'attente de "Appuis Bouton"
   Lecture Molette
      Si Rotation sens horloger = Incrémenter en boucle la valeur 0 à 9
      ou Si Rotation sens anti-horloger = Décrémenter en boucle la valeur 9 à 0
         Afficher le nouveau chiffre
         recalculer la nouvelle valeur de l'année
      Finsi
   Fin de la boucle d'attente de "Appuis Bouton"
   Affichage du curseur sous le quatrième chiffre (L1/P16)
   Boucle d'attente de "Appuis Bouton"
   Lecture Molette
      Si Rotation sens horloger = Incrémenter en boucle la valeur 0 à 9
      ou Si Rotation sens anti-horloger = Décrémenter en boucle la valeur 9 à 0
         Afficher le nouveau chiffre
         recalculer la nouvelle valeur de l'année
      Finsi
   Fin de la boucle d'attente de "Appuis Bouton"
 Fin du clignotement de l'année

 Clignotement du mois
   Affichage du curseur sous la première lettre (L1/P9)
   Boucle d'attente de "Appuis Bouton"
   Lecture Molette
      Si Rotation sens horloger = Incrémenter en boucle la valeur 1 à 12
      ou Si Rotation sens anti-horloger = Décrémenter en boucle la valeur 12 à 1
         En faisant correspondre les nombres 1 à 12 aux
         affichages Jan, Fev, Mar, Avr, Mai, Jun, Jul, Aou, Sep, Oct, Nov & Dec
      Finsi
   Fin de la boucle d'attente de "Appuis Bouton"
 Fin du clignotement du mois














 Clignotement du jour du mois
   Calculer le nombre de jour max du mois
   Calcul sur l'année pour déterminer si il s'agit d'une année bissextile
   Si l'année est bissextile et que le mois sélectionné est février, on
      ajoute 1 à la valeur 28 pour faire 29 jours
      Affichage du curseur sous le premier chiffre (L1/P6)
      Boucle d'attente de "Appuis Bouton"
      Lecture Molette
         Si Rotation sens horloger = Incrémenter en boucle la valeur 1 à 3
            ou 1 à 2 si le mois est février
         ou Si Rotation sens anti-horloger = Décrémenter en boucle la valeur
            3 à 1 ou 2 à 1 si le mois est février
            Afficher le nouveau chiffre
            Recalculer la nouvelle valeur des jours
         Finsi
      Fin de la boucle d'attente de "Appuis Bouton"
      Affichage du curseur sous le deuxième chiffre (L1/P7)
      Boucle d'attente de "Appuis Bouton"
      Lecture Molette
         Si Rotation sens horloger = Incrémenter en boucle la valeur 0 à 9

           ou 0 à 8 si le mois est février et l'année n'est pas bissextile
         ou Si Rotation sens anti-horloger = Décrémenter en boucle la valeur 9
            à 0 ou 0 à 8 si le mois est février et l'année n'est pas bissextile
            Afficher le nouveau chiffre
            Recalculer la nouvelle valeur des jours
         Finsi
      Fin de la boucle d'attente de "Appuis Bouton"
      Si la valeur de jours est < 1 ou > que la valeur max
         Ré-afficher et remettre l'ancienne valeur
      Finsi
   Finsi
 Fin du clignotement du jour du mois















 
 Clignotement de l'heure
  Affichage du curseur sous le premier chiffre (L2/P1)
   Boucle d'attente de "Appuis Bouton"
   Lecture Molette
      Si Rotation sens horloger = Incrémenter en boucle la valeur 1 à 2
      ou Si Rotation sens anti-horloger = Décrémenter en boucle la valeur 2 à 1
         Afficher le nouveau chiffre
         Recalculer la nouvelle valeur des heures
      Finsi
   Fin de la boucle d'attente de "Appuis Bouton"
   Affichage du curseur sous le deuxième chiffre (L2/P2)
   Boucle d'attente de "Appuis Bouton"
   Lecture Molette
      Si Rotation sens horloger = Incrémenter en boucle la valeur 0 à 9
      ou Si Rotation sens anti-horloger = Décrémenter en boucle la valeur 9 à 0
         Afficher le nouveau chiffre
         Recalculer la nouvelle valeur des heures
      Finsi
   Fin de la boucle d'attente de "Appuis Bouton"
   Si cette nouvelle valeur est > 23
      Ré-afficher et remettre l'ancienne valeur
   Finsi
 Fin du clignotement de l'heure

 Clignotement des minutes
   Affichage du curseur sous le premier chiffre (L2/P4)
   Boucle d'attente de "Appuis Bouton"
   Lecture Molette
      Si Rotation sens horloger = Incrémenter en boucle la valeur 0 à 5
      ou Si Rotation sens anti-horloger = Décrémenter en boucle la valeur 5 à 0
         Afficher le nouveau chiffre
         Recalculer la nouvelle valeur des minutes
      Finsi
   Fin de la boucle d'attente de "Appuis Bouton"
   Affichage du curseur sous le deuxième chiffre (L2/P5)
   Boucle d'attente de "Appuis Bouton"
   Lecture Molette
      Si Rotation sens horloger = Incrémenter en boucle la valeur 0 à 9
      ou Si Rotation sens anti-horloger = Décrémenter en boucle la valeur 9 à 0
         Afficher le nouveau chiffre
         recalculer la nouvelle valeur de minutes
      Finsi
   Fin de la boucle d'attente de "Appuis Bouton"
   Si cette nouvelle valeur est > 59
      Ré-afficher et remettre l'ancienne valeur
   Finsi
 Fin du clignotement des minutes


 Remise à zéro des secondes
 Affichage des secondes "00" en (L2/P7)

 Calcul du jour de la semaine
   selon l'algorithme suivant :
   JS = {[(23m)/9]+j+4+a+[z/4]-[z/100]+[z/400]-y}mod7
   où:
   JS = Jour de semaine (J = 0 à 6; 0=Dim., 1=Lun., ... , 6=Sam.)
   [n] signifie le nombre entier résultant de la division, le reste est ignoré
   m = Mois (m = 1 à 12; 1=Jan., 2=Fév., 3=Mars, ... , 12=Déc.)
   j = Jour   (j = 1 à 31)
   a = année
   z = a-1 si m<3  et  z = a si m>=3
   y = 0 si m<3 et y=2 si m>=3
   mod 7 = reste de la division par 7

 Utilise le protocole I2C pour écrire l'heure et la date dans DS3231
Fin de ChgtHeure
------------------------------------------------------------------------------