Description pour MENU Ver1.6 - MICRO-INFO du 12/05/2011. ------------------------------------------------------- Description des tâches pour le "MENU" suite à la réunion du 26/01/2011 Modifications suite à la réunion du 09/02/2011. Modifications J-P du 28/02/2011, 02/03/2011, 09/03/2011 Modifications suite à la réunion du 09/03/2011. Note: La vidéo inverse n'existant pas sur LCD Texte, nous ferons clignoter le premier caractère de l'option sélectionnée, quant au changement de valeurs, nous mettrons le curseur sous le digit le plus à droite de la valeur à modifier. ( A vérifier la faisabilité suite à l'ajout de la routine "Affichage") Modification suite à la réunion du 06/04/2011. Modification suite à la réunion du 11/05/2011. Construction et explication du "Menu". ( A revoir par Patrick) -------------------------------------- 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(18)". -------------------- Liste des variables: -------------------- MnuNum ' Numéro de la ligne dans "Menu" Ligne1 ' Texte à afficher sur la ligne 1 du LCD Ligne2 ' Texte à afficher sur la ligne 2 du LCD MnuPosCur ' Position du Curseur sur le LCD (Clignote ou fixe) MnuActHorlo ' Action à réaliser lorsque Molette tourne dans le sens horloger MnuActAntiH ' Action à réaliser lorsque Molette tourne dans le sens antihorlo MnuActRet ' Action à réaliser lorsque Bouton est appuyé MnuIndiVar ' Variable contenant la valeur de la cellule dans "Indice()" MnuAdres ' Adresse calculée dans la mémoire EEprom du micro-contrôleur BaseAdres ' Première adresse des Data "MENU" dans la mémoire EEprom TempoEnco ' Durée d'inaction dans le Menu, si dépassement = sortie du Menu JourPlage ' Jour de 1 à 7 correspondant au jour programmé (Lundi = 1) NumPlage ' Numéro de plage sera calculé dans le programme. HDebutPlage ' Heure de début de chauffage (hh:mm) par 1/4 heure DureePlage ' Durée de chauffage (hh:mm) par 1/4 heure JourSemaine ' Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche NumCycle(4) ' Numéro de Cycle de 1 à 4 TCycleJour(4) ' Température pour le cycle de Jour x 4 TCycleNuit(4) ' Température pour le cycle de nuit x 4 TypRegulation ' 0 = Chaudière, 1 = Vanne à 3 voies TypVanne ' 0 = vanne à positionement, 1 = vanne analogique Annee ' RTC + Affichage + Menu Mois ' RTC + Affichage + Menu JourDate ' RTC + Affichage + Menu Jour ' RTC + Affichage + Menu (Lundi = 1, Mardi = 2, ..., Dimanche = 7) Heure ' RTC + Affichage + Menu Minute ' RTC + Affichage + Menu Seconde ' RTC Quart ' Nombre de 1/4 d'heure de 0 à 96 TempConsECS ' Température ECS TempMiniExt ' Température minimum extérieure (Voir table par régions) TempMaxiEau ' Température maximum eau ( Voir Constructeur de la chaudière) HysTempHab ' Hystérésis de la température de l'habitation HysTempEau ' Hystérésis de la température de l'eau des radiateurs HysTempECS ' Hystérésis de la température de l'ECS AfficLong ' Nombre de caractère contenu dans Digit$(5) Valeur ' Variable de travail ValAffi ' Valeur calculée de Indice(x) / Divise(x) Digit() ' Valeurs contenant les caractères à afficher pour la mise en forme Indice() ' Tableau des 18 indices du "Menu" LimitBas() ' Tableau des Valeurs minimums autorisées LimitHaut() ' Tableau des Valeurs maximums autorisées Divise() ' Tableau des diviseurs (pour faciliter l'échelle des grandeurs) Form() ' Tableau du format des variables. Le chiffre de gauche représente ' le nombre de chiffres, l'autre représente le nombre de décimale Indice() " LimitBas() " LimitHaut() " Divise() " Form() " -----------------------+----------------+-----------------+-------------+----------+ Indice(1) = NumCycle LimitBas(1) = 1 LimitHaut(1) = 4 Divise(1) = 1 Form(1) =10 Indice(2) = JourPlage LimitBas(2) = 1 LimitHaut(2) = 7 Divise(2) = 1 Form(2) =10 Indice(3) = HysTempHab LimitBas(3) = 1 LimitHaut(3) = 10 Divise(3) =10 Form(3) =11 Indice(4) = HysTempEau LimitBas(4) = 1 LimitHaut(4) = 10 Divise(4) = 2 Form(4) =11 Indice(5) = HysTempECS LimitBas(5) = 1 LimitHaut(5) = 10 Divise(5) = 2 Form(5) =11 Indice(6) = Annee LimitBas(6) = 0 LimitHaut(6) = 99 Divise(6) = 1 Form(6) =20 Indice(7) = Mois LimitBas(7) = 1 LimitHaut(7) = 12 Divise(7) = 1 Form(7) =20 Indice(8) = JourDate LimitBas(8) = 1 LimitHaut(8) = 31 Divise(8) = 1 Form(8) =20 Indice(9) = Heure LimitBas(9) = 0 LimitHaut(9) = 23 Divise(9) = 1 Form(9) =20 Indice(10)= Minute LimitBas(10)= 0 LimitHaut(10)= 59 Divise(10)= 1 Form(10)=20 Indice(11)= TempECS LimitBas(11)= 60 LimitHaut(11)= 85 Divise(11)= 1 Form(11)=20 Indice(12)= TempMaxEau LimitBas(12)= 50 LimitHaut(12)= 90 Divise(12)= 1 Form(12)=20 Indice(13)= NumPlage LimitBas(13)= 1 LimitHaut(13)= 96 Divise(13)= 1 Form(13)=20 Indice(14)= TempMiniExt LimitBas(14)=-30 LimitHaut(14)= 0 Divise(14)= 2 Form(14)=21 Indice(15)= TCycleJour LimitBas(15)= 20 LimitHaut(15)= 50 Divise(15)= 2 Form(15)=21 Indice(16)= TCycleNuit LimitBas(16)= 20 LimitHaut(16)= 50 Divise(16)= 2 Form(16)=21 Indice(17)= HDebutPlage LimitBas(17)= 1 LimitHaut(17)= 96 Divise(17)= 1 Form(17)=99 Indice(18)= DureePlage LimitBas(18)= 1 LimitHaut(18)= 96 Divise(18)= 1 Form(18)=99 -----------------------+----------------+-----------------+-------------+-----------+ Codes " Action " ------+---------------+ 128 + 129 - 130 1 soit valeur de j = Sortie du Menu 131 1 soit Cycle1 132 2 soit Cycle2 133 3 soit Cycle3 134 4 soit Cycle4 135 1 soit lundi 136 2 soit mardi 137 3 soit mercredi 138 4 soit jeudi 139 5 soit vendredi 140 6 soit samedi 141 7 soit dimanche 142 Suppression de la plage sélectionnée 143 0 soit TypVanne = Digitale 144 1 soit TypVanne = Analogique *********************************** 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 "Affichage" ' 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 "Affichage" ' 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 ====================================== Affichage --------- Routine servant à la mise en forme de l'affichage pour le programme MENU Variables d'entrées. -------------------- - Divise(x) ' Quatrième colonne dans le tableau "Indice" - Indice(x) ' Première colonne dans le tableau "Indice" - Poscur ' Troisième champ sur chaque ligne "Mémoire Menu" - Form(x) ' Cinquième colonne dans le tableau "Indice" Variables calculées. -------------------- Digit$(5) ' Initialisée à 5 espaces (x) ValAffi = Indice(x) / Divise(x) Quart ' Initialisé à zéro AffiLong ' Nombre de caractères contenu dans Digit$(x) ********************************* IF Form(x) = 10 THEN ' Format de 1 caractère sans décimale. Digit$(1) = CHR$(ValAffi + 48) ELSE IF Form(x) = 11 THEN ' Format de 1 caractère avec 1 décimale. Digit$(1) = CHR$(ValAffi + 48) Digit$(2) = "," Digit$(3) = CHR$((ValAffi - INT(ValAffi)) * 10 + 48) ELSE IF Form(x) = 20 THEN ' Format de 2 caractères sans décimale. Digit$(1) = CHR$(INT(ValAffi/10) + 48) Digit$(2) = CHR$((ValAffi - INT(ValAffi/10)) * 10 + 48) ELSE IF Form(x) = 21 THEN ' Format de 2 caractères avec 1 décimale. Digit$(1) = CHR$(INT(ValAffi/10) + 48) Digit$(2) = CHR$(INT(ValAffi - (INT(ValAffi/10) * 10) + 48)) Digit$(3) = "," Digit$(4) = CHR$(((ValAffi-((ASC(Digit$(1))-48)*10)-(ASC(Digit$(2))-48))*10)+48) ELSE IF Form(x) = 99 THEN ' Format horaire = hh:mm par pas de 15 minutes. Digit$(1) = CHR$(INT(ValAffi/40) + 48) Digit$(2) = CHR$(INT(ValAffi/4) - ((ASC(Digit$(1)) - 48) * 10) + 48) Digit$(3) = ":" Quart = (ValAffi - INT(ValAffi/4) * 4) * 15 Digit$(4) = CHR$(INT(Quart/10) + 48) Digit$(5) = CHR$(Quart - (INT(Quart/10) * 10) + 48) ENDIF LET AffiLong = ' De 1 à 5 on va à la routine AffiDig AffiDig 'Routine appelée pour positionner et afficher les caractères sur le LCD. ------- FOR I = 1 TO AffiLong ' on prend le premier caractère. Curseur = PosCur + I ' On incrémente la position du curseur sur le LCD. Print Digit$(I) ' On affiche le caractère. NEXT ' on boucle jusqu'au dernier caractère. Fin de la routine et retour dans la routine principale -------------------------------------------------------- Fichier Data à charger dans l'EEPROM du Micro-contrôleur. --------------------------------------------------------- Variables de 37 octets de longueur soit: 16 octets pour la Ligne1 LCD 16 octets pour la Ligne2 LCD 1 octet pour la Position Curseur 1 octet pour l'Action --> ( Molette sens horloger = 128) 1 octet pour l'Action <-- ( Molette sens anti-horloger = 129) 1 octet pour l'Action Return ( Bouton ) 1 octet pour l'Indice Variable, ceci nous donne 37 octets X 59 fenêtres = 2183 octets Fichier Mémoire "MENU": +----------------+----------------+------+------+------+------+------+ | 16 octets | 16 octets | 1 oct| 1 oct| 1 oct| 1 oct| 1 oct| +--+----------------+----------------+------+------+------+------+------+ |N°| ligne1 | Ligne2 |PosCur|Suite+|Suite-|Return|Indice| +--+----------------+----------------+------+------+------+------+------+ | 1||PROGRAMME.DATE.H| 017 | 002 | 005 | 006 | 000 | | 2||DATE.HEURE.REGLA| 017 | 003 | 001 | 008 | 000 | | 3||HEURE.REGLAGES.S| 017 | 004 | 002 | 009 | 000 | | 4||REGLAGES.SORTIE.| 017 | 005 | 003 | 010 | 000 | | 5||SORTIE.PROGRAMME| 017 | 001 | 004 | 130 | 000 | | 6||CHOIX_CYCLE.SORT| 017 | 007 | 007 | 014 | 000 | | 7||SORTIE.CHOIX_CYC| 017 | 006 | 006 | 005 | 000 | >>| 8|DATE............|jj/mm/aaaa......| 026 | 128 | 129 | 018 | 006 | >>| 9|HEURE...........|HH:MM...........| 018 | 128 | 129 | 019 | 009 | |10||TEMPERATURE_ECS.| 017 | 011 | 013 | 020 | 000 | |11||HYSTERESIS.PARAM| 017 | 012 | 010 | 021 | 000 | |12||PARAMETRES.SORTI| 017 | 013 | 011 | 022 | 000 | |13||SORTIE.TEMPERATU| 017 | 010 | 012 | 005 | 000 | |14||CYCLE1.CYCLE2.CY| 017 | 015 | 017 | 131 | 000 | |15||CYCLE2.CYCLE3.CY| 017 | 016 | 014 | 132 | 000 | |16||CYCLE3.CYCLE4.CY| 017 | 017 | 015 | 133 | 000 | |17||CYCLE4.CYCLE1.CY| 017 | 014 | 016 | 134 | 000 | >>|18|DATE............|jj/mm/aaaa......| 021 | 128 | 129 | 026 | 007 | >>|19|HEURE...........|HH:MM...........| 021 | 128 | 129 | 005 | 010 | >>|20|TEMPERATURE_ECS.|65°C............| 018 | 128 | 129 | 011 | 011 | >>|21|HYSTERESIS_TEMP_|AMBIANTE = 0,2°C| 030 | 128 | 129 | 027 | 003 | |22||T_MINI_EXTERIEUR| 017 | 023 | 025 | 028 | 000 | |23||T_MAXI_CHAUDIERE| 017 | 024 | 022 | 029 | 000 | |24||TYPE_REGULATION.| 017 | 025 | 023 | 030 | 000 | |25||SORTIE.T_MINI_EX| 017 | 022 | 024 | 013 | 000 | >>|26|DATE............|jj/mm/aaaa......| 018 | 128 | 129 | 003 | 008 | >>|27|HYSTERESIS_TEMP_|RADIATEUR= 0,5°C| 030 | 128 | 129 | 040 | 004 | >>|28|TEMPERATURE_MINI|EXTERIEUR= -09°C| 030 | 128 | 129 | 023 | 014 | >>|29|TEMPERATURE_MAXI|CHAUDIERE = 80°C| 030 | 128 | 129 | 025 | 012 | |30|TYPE_REGULATION>|CHAUDIERE.VANNE_| 017 | 037 | 037 | 025 | 000 | |31|TYPE_REGULATION>|VANNE_3_VOIES.CH| 017 | 036 | 036 | 041 | 000 | >>|32||LUNDI.MARDI.MERC| 017 | 041 | 047 | 135 | 002 | >>|33||MARDI.MERCREDI.J| 017 | 042 | 040 | 136 | 002 | >>|34||MERCREDI.JEUDI.V| 017 | 043 | 041 | 137 | 002 | >>|35||JEUDI.VENDREDI.S| 017 | 044 | 042 | 138 | 002 | >>|36||VENDREDI.SAMEDI.| 017 | 045 | 043 | 139 | 002 | >>|37||SAMEDI.DIMANCHE.| 017 | 046 | 044 | 140 | 002 | >>|38||DIMANCHE.SORTIE.| 017 | 047 | 045 | 141 | 002 | |39||SORTIE.LUNDI.MAR| 017 | 040 | 046 | 057 | 000 | >>|40|HYSTERESIS_TEMP_|ECS = 0,5°C.....| 025 | 128 | 129 | 012 | 005 | |41||OUVRIR/FERMER.AN| 017 | 053 | 053 | 143 | 000 | |42||ANALOGIQUE.OUVRI| 017 | 052 | 052 | 144 | 000 | |43|SUPPRIMER.PLAGE.|OUI..........NON| 017 | 057 | 057 | 057 | 000 | |44|SUPPRIMER.PLAGE.|NON..........OUI| 017 | 056 | 056 | 142 | 000 | >>|45|JJJ.............|DEBUT.A.hh:mm...| 029 | 128 | 129 | 046 | 017 | >>|46|JJJ........hh:mm|DE.hh:mm.A.hh:mm| 016 | 128 | 129 | 058 | 018 | >>|47|SELECTION.CYCLEx|OUI..........NON| 017 | 039 | 039 | 130 | 001 | |48|SELECTION.CYCLEx|NON..........OUI| 017 | 038 | 038 | 007 | 000 | >>|49|CYCLEx...PLAGExx|JJJ.HH:MM.hh:mm.| 016 | 128 | 129 | 043 | 013 | >>|50|CYCLEx.TEMP_JOUR|20,5°C..........| 020 | 128 | 129 | 057 | 015 | >>|51|CYCLEx.TEMP_NUIT|17,5°C..........| 020 | 128 | 129 | 057 | 016 | |52|CYCLEx..........|CONTINUER.SORTIE| 017 | 059 | 059 | 053 | 000 | |53|CYCLEx..........|SORTIE.CONTINUER| 017 | 058 | 058 | 039 | 000 | |54||SELECTION.AJOUT_| 017 | 027 | 031 | 047 | 000 | |55||AJOUT_PLAGE.EDIT| 017 | 028 | 026 | 032 | 000 | |56||EDITER_CYCLE.TEM| 017 | 029 | 027 | 049 | 000 | |57||TEMP_JOUR.TEMP_N| 017 | 030 | 028 | 050 | 000 | |58||TEMP_NUIT.SORTIE| 017 | 031 | 029 | 051 | 000 | |59||SORTIE.SELECTION| 017 | 026 | 030 | 007 | 000 | +--+----------------+----------------+------+------+------+------+------+ Note: Les '.' sont à supprimer et remplacer par des espaces et les numéros de lignes sont seulement là à titre indicatif. ***** FIN **********************************************************************