' Programmation structurée pour le MENU. - Version: 1.3 du 02/03/2011 ' ------------------------------------------------------------------- BEGIN GOSUB Initvar GOSUB Initmicro GOSUB Initaffi DO WHILE J = 0 ' Début de la boucle infinie LET MnuAdres = BaseAdres + 38 * (MnuNum - 1) LET Ligne1$ = MnuAdres LET Ligne2$ = MnuAdres + 16 LET MnuPosClig = MnuAdres + 32 LET MnuPosCur = MnuAdres + 33 LET MnuActHorlo = MnuAdres + 34 LET MnuActAntiH = MnuAdres + 35 LET MnuActRet = MnuAdres + 36 LET MnuIndiVar = MnuAdres + 37 LET RetroLcd = 1 ' Allumage du Rétro-éclairage GOSUB Affilcd ' Affichage des 2 lignes IF MnuPosCur > 0 THEN Afficher et positionner le Curseur à MnuPosCur ELSE Faire clignoter le caractère à MnuPosClig ENDIF IF Compteur > CompteurOld THEN ' Molette dans le Sens horlogique LET TempoEnco = 0 ' Réinitialisation de TempoEnco IF MnuActHorlo < 128 THEN ' Si MnuActHorlo plus petit que 128 LET MnuNum = MnuActHorlo ' on va à la ligne du Menu suivant la ELSE ' valeur de MnuActHorlo, sinon, LET Valeur = LET Valeur + 1 ' On incrémente Valeur IF Valeur > LimitHaut ' Si on dépasse la limite haute, LET Valeur = LimitBas ' On met à la limite basse ENDIF LET Valeur = Valeur/Diviseur ' On divise Valeur par diviseur ENDIF LET CompteurOld = Compteur ' Mise à jour de CompteurOld ELSEIF Compteur < CompteurOld THEN ' Molette Sens anti-horlogique LET TempoEnco = 0 ' Réinitialisation de TempoEnco IF MnuActAntiH < 128 THEN ' Si MnuActAntiH plus petit que 128 LET MnuNum = MnuActAntiH ' on va à la ligne du Menu suivant la ELSE ' valeur de MnuActAntiH, sinon, LET Valeur = LET Valeur - 1 ' On décrémente Valeur IF Valeur > LimitBas ' Si on dépasse la limite basse, LET Valeur = LimitHaut ' On met à la limite haute ENDIF LET Valeur = Valeur/Diviseur ' On divise Valeur par diviseur ENDIF LET CompteurOld = Compteur ' Mise à jour de CompteurOld ELSEIF Bouton = 1 THEN ' Bouton appuyé (axe de la Molette) LET TempoEnco = 0 ' Réinitialisation de TempoEnco IF MnuActRet = 130 THEN ' Si MnuActRet = 130, LET J = 1 ' On quitte le Menu, affichage normal ELSEIF MnuActRet < 128 THEN ' Si MnuActRet plus petit que 128 LET MnuNum = MnuActRet ' on va à la ligne Menu correspondante ELSEIF MnuActRet > OR = 131 AND MnuActRet < OR = 134 THEN LET Cycle = MnuActRet - 130 ' Sélection du "Cycle" correspondant ELSEIF MnuActRet > OR = 135 AND MnuActRet < OR = 141 THEN LET Jour = MnuActRet - 134 ' Sélection du "Jour" correspondant ELSEIF MnuActRet = 142 THEN ' Si MnuActRet = 142, alors GOSUB SupprimePlage ' Suppression de la Plage en cours LET MnuNum = 31 ' On retourne à la ligne 31 du Menu ELSEIF MnuActRet > OR = 143 AND MnuActRet < OR = 144 THEN LET TypeVanne = MnuActRet - 143 ' 0 = Vanne à positionement ou 1 = ENDIF ' Vanne Analogique ELSEIF TempoEnco > 30 ' Dépassement de la valeur prédéfinie LET J = 1 ' On quitte le Menu, affichage normal ENDIF ENDDO ' Fin de la boucle infinie LET RetroLcd = 0 ' Extinction du Rétro-éclairage END ' ****************************************************************************** ' Sous-routines ' ------------- ' Initvar ' ------- ' Description : Définition et initialisation des variables ' Variables d'entrées : Aucune ' Variables de sorties : Toutes les variables du programme ' Variables de travail : Aucune ' Sousroutines appellées : Aucune SUB Initvar ' Début de la routine DECLARE J AS BIT ' Variable de travail DECLARE RetroLcd AS BIT ' 1=ON, 0=OFF - Cde du rétroéclairage du LCD DECLARE Bouton As BIT ' Lecture du Bouton (0 = repos, 1 = Appuyé) DECLARE MoletteA As BIT ' Sortie A de l'encodeur Int0 et Int1 DECLARE MoletteB As BIT ' Sortie B de l'encodeur DECLARE PompeChau AS BIT ' 1 = ON, 0 = OFF - Commande du relais + Led1 DECLARE PompeECS AS BIT ' 1 = ON, 0 = OFF - Commande du relais + Led2 DECLARE BruleurVanne AS BIT ' 1 = ON, 0 = OFF - Commande du relais + Led3 DECLARE Vanne AS BIT ' 1 = ON, 0 = OFF - Commande du relais + Led4 DECLARE TypeVanne AS BIT ' 0= vanne à positionement, 1= vanne analogique DECLARE Plage AS BIT ' Si on est dans une plage programmée, Plage = 1 DECLARE StartCourbe AS BIT ' 0 ou 1, car il faut minimum un cycle avant de ' pouvoir optimiser la courbe de chauffe DECLARE Kb AS BYTE ' Variable de travail DECLARE Annee As BYTE ' de 0 à 99 DECLARE Mois As BYTE ' de 1 à 12 DECLARE Jour As BYTE ' de 1 à 31 suivant les mois DECLARE Heure As BYTE ' de 0 à 23 DECLARE Minute As BYTE ' de 0 à 59 DECLARE TempECS As BYTE ' Température ECS DECLARE TempMiniExt As BYTE ' Température minimim extérieure (fichier XLS) DECLARE TempMaxEau As BYTE ' Température maximum chaudière (Constructeur) DECLARE HysTempHab As BYTE ' Hystérésis température habitation DECLARE HysTempEau As BYTE ' Hystérésis température eau radiateur DECLARE HysTempECS As BYTE ' Hystérésis température eau ECS DECLARE Cycle As BYTE ' Numéro de cycle (1 à 4) DECLARE JourPlage As BYTE ' Jour correspondant à la plage horaire DECLARE NumPlage As BYTE ' Numéro de plage horaire DECLARE HDebutPlage As BYTE ' Heure de début de plage horaire DECLARE DureePlage As BYTE ' Durée de la plage horaire DECLARE Tmpsrebond As BYTE ' Constante pour antirebond DECLARE TempoBtn AS BYTE ' Définis la longueur d'appuis sur Bouton DECLARE TempoEnco AS BYTE ' Détermine la durée d'inactivité de l'Encodeur DECLARE MnuAdres AS BYTE ' Position dans la mémoire du microcontrôleur DECLARE BaseAdres AS BYTE ' 1ère position des Datas "MENU" dans la mémoire DECLARE TempExtMoy AS BYTE ' Température extérieure moyenne sur 24 heures DECLARE TempIntMoy AS BYTE ' Température intérieure moyenne sur 24 heures DECLARE TempEau1 AS BYTE ' Val.maxi donnée par le constructeur du chauff. DECLARE MnuPosClig AS BYTE ' Menu Adresse + 32 DECLARE MnuPosCur AS BYTE ' Menu Adresse + 33 DECLARE MnuActHorlo AS BYTE ' Menu Adresse + 34 DECLARE MnuActAntiH AS BYTE ' Menu Adresse + 35 DECLARE MnuActRet AS BYTE ' Menu Adresse + 36 DECLARE MnuIndiVar AS BYTE ' Menu Adresse + 37 DECLARE Iw AS WORD ' Variable de travail DECLARE TempInt AS WORD ' Température intérieure de l'habitation DECLARE TempExt AS WORD ' Température extérieure DECLARE TempEau AS WORD ' Température d'eau départ circuit de chauffage DECLARE TempECS AS WORD ' Température d'eau chaude sanitaire DECLARE TempCons AS WORD ' Température de consigne suivant le MODE DECLARE Jour$(7) AS ALPHA ' Les 7 jours de la semaine (8 Chars) DECLARE Ligne1$ AS ALPHA ' Première ligne d'affichage du LCD (16 Chars) DECLARE Ligne2$ AS ALPHA ' Deuxième ligne d'affichage du LCD (16 Chars) DECLARE Indice$(16) AS ALPHA ' Matrice contenant les correspondances Indice DECLARE LimitBas$(16) AS ALPHA ' Matrice contenant les limites basses DECLARE LimitHaut$(16)AS ALPHA ' Matrice contenant les limites hautes DECLARE Diviseur$(16) AS ALPHA ' Matrice contenant les Diviseurs DECLARE Compteur AS INTEGER ' Définition du compteur DECLARE CompteurOld AS INTEGER ' Définition du compteur avec ancienne valeur DECLARE TempExt1 AS INTEGER ' Valeur donnée par le tableau des températures ' Initialisation des variables ' ---------------------------- LET J = 0 ' Initiation de la variable bit J LET k = 0 LET Jb = 0 LET Iw = 0 LET MnuNum = 1 ' Premier élément du Menu (11a) LET TempoEnco = 0 ' Test si activité de l'encodeur LET Compteur = 0 ' Détermine le sens de la Molette LET CompteurOld = 0 ' Valeur précédente de Compteur LET TempConsJour = 20 ' Température de consigne Jour LET TempConsNuit = 17,5 ' Température de consigne Nuit LET TempConsECS = 60 ' Température de consigne ECS LET TempExt1 = -9 ' Température Minimum Extérieure LET TempEau1 = 80 ' Température Maximum de la chaudière LET HysTempEau = 5 ' Hystérésis de température d'eau chaudiére LET HysTempHab = 0,5 ' Hystérésis de température de l'habitation LET HysTempECS = 5 ' Hystérésis de température ECS LET Regulation = 0 ' 0= régulation chaudière, 1= vanne à 3 voies LET TypeVanne = 0 ' 0= vanne à positionement, 1= vanne analogique LET CycleChau = 0 LET StartCourbe = 0 LET CyclePompe = 0 LET Compteur = 0 ' Valeur du compteur LET Bouton = 0 ' Valeur de Bouton au repos LET RetroLcd = 0 ' Rétro-éclairage du LCD est éteint LET Tmpsrebond = 2 ' Défintion de la pause antirebond (à ajuster) LET Ligne1$ = " " LET Ligne2$ = " " LET Indice$(1) = Annee, LET Indice$(2) = Mois, LET Indice$(3) = Jour, LET Indice$(4) = Heure, LET Indice$(5) = Minute, LET Indice$(6) = TempECS, LET Indice$(7) = TempMiniExt, LET Indice$(8) = TempMaxEau, LET Indice$(9) = HysTempHab, LET Indice$(10) = HysTempEau, LET Indice$(11) = HysTempECS, LET Indice$(12) = Cycle, LET Indice$(13) = JourPlage, LET Indice$(14) = NumPlage, LET Indice$(15) = HDebutPlage, LET Indice$(16) = DureePlage LET LimitBas$(1) = 0, LET LimitBas$(2) = 1, LET LimitBas$(3) = 1, LET LimitBas$(4) = 0, LET LimitBas$(5) = 0, LET LimitBas$(6) = 60, LET LimitBas$(7) = -30, LET LimitBas$(8) = 50, LET LimitBas$(9) = 1, LET LimitBas$(10) = 1, LET LimitBas$(11) = 1, LET LimitBas$(12) = 1, LET LimitBas$(13) = 1, LET LimitBas$(14) = 1, LET LimitBas$(15) = 1, LET LimitBas$(16) = 1 LET LimitHaut$(1) = 99, LET LimitHaut$(2) = 12, LET LimitHaut$(3) = 31, LET LimitHaut$(4) = 23, LET LimitHaut$(5) = 59, LET LimitHaut$(6) = 85, LET LimitHaut$(7) = 0, LET LimitHaut$(8) = 90, LET LimitHaut$(9) = 10, LET LimitHaut$(10)= 10, LET LimitHaut$(11)= 10, LET LimitHaut$(12)= 4, LET LimitHaut$(13)= 7, LET LimitHaut$(14)= 96, LET LimitHaut$(15)= 96, LET LimitHaut$(16)= 96 LET Diviseur$(1) = 1, LET Diviseur$(2) = 1, LET Diviseur$(3) = 1, LET Diviseur$(4) = 1, LET Diviseur$(5) = 1, LET Diviseur$(6) = 1, LET Diviseur$(7) = 2, LET Diviseur$(8) = 1, LET Diviseur$(9) = 10, LET Diviseur$(10) = 2, LET Diviseur$(11) = 2, LET Diviseur$(12) = 1, LET Diviseur$(13) = 1, LET Diviseur$(14) = 1, LET Diviseur$(15) = 1, LET Diviseur$(16) = 1 LET Jour$(1) = LUNDI, LET Jour$(2) = MARDI, LET Jour$(3) = MERCREDI, LET Jour$(4) = JEUDI, LET Jour$(5) = VENDREDI, LET Jour$(6) = SAMEDI, LET Jour$(7) = DIMANCHE ' ****************************************************************************** ' Initmicro ' --------- ' Description : Initialisation du micro-contrôleur et création des "Alias" ' qui déterminerons les connexions hardwares du système et ' qui seront définies ici comme des simples variables. ' ' Variables d'entrées : Aucune ' Variables de sorties : Aucune ' Variables de travail : Aucune ' Sousroutines appellées : Aucune ' SUB Initmicro LET Bouton = PortD.1 ' Liaison du "Bouton" de l'encodeur à l'AtMega LET MoletteA = PortD.2 ' Liaison de "Molette" de l'encodeur à l'AtMega LET MoletteB = PortD.3 ' Liaison de "Molette" de l'encodeur à l'AtMega ENDSUB ' ****************************************************************************** ' Initaffi '---------- ' Description : Initialisation de l'affichage et affichage du message ' d'accueil. ' ' Variables d'entrées : Aucune ' Variables de sorties : Aucune ' Variables de travail : Ligne1$, Ligne2$ ' Sousroutines appellées : Affilcd ' SUB Initaffi LET Ligne1$ = "Micro-Info asbl " ' Définition de la première ligne LET Ligne2$ = " MENU V 1.2 " ' Définition de la seconde ligne ' Effacement de l'écran GOSUB Affilcd ' Affichage des 2 lignes ' Petite pause LET Ligne1$ = " " ' Première ligne à 16 blancs LET Ligne2$ = " " ' Deuxième ligne à 16 blancs ' Effacement de l'écran GOSUB Affilcd ' Affichage des 2 lignes ENDSUB ' ****************************************************************************** ' Routines par INTERRUPTIONS ' -------------------------- ' DetectA ' ------- ' Description : Détecte les mouvements de l'encodeur (Molette) par Interruptions ' Variables d'entrées : MoletteA, MoletteB ' Variables de sorties : Compteur ' Variables de travail : Tmpsrebond ' Sousroutines appellées : Aucune SUB DetectA IF MoletteB = MoletteA THEN ' Test si B est égal à A LET Compteur = Compteur - 1 ' Alors Sens AntiHorlogique ELSE ' Sinon LET Compteur = Compteur + 1 ' Sens Horlogique ENDIF ' Fin du test de A et de B ENDSUB ' ****************************************************************************** ' Tempo ' ----- ' Description : Timer par Interruptions toutes les secondes ' Variables d'entrées : Timer interne ' Variables de sorties : TempoEnco ' Variables de travail : Aucune ' Sousroutines appellées : Aucune SUB Tempo LET TempoEnco = TempoEnco + 1 ' Incrémente TempoEnco ENDSUB ' ****************************************************************************** ' AffiLCD ' ------- ' Description : Affichage des chaînes Ligne1$ et Ligne2$ sur l'écran LCD ' ' Variables d'entrées : Ligne1$, Ligne2$ ' Variables de sorties : Aucune ' Variables de travail : Aucune ' Sousroutines appellées : Aucune ' SUB Affilcd ' Début de la routine ' Affichage de la première ligne ' Affichage de la seconde ligne ENDSUB ' ****************************************************************************** ' SupprimePlage ' ------------- ' Description : Supprime la Plage en cours ' Variables d'entrées : Cycle, JourPlage, NumPlage, HDebutPlage, DureePlage ' Variables de sorties : Aucune ' Variables de travail : Aucune ' Sousroutines appellées : Aucune SUB SupprimePlage ' Début de la routine ' A compléter ENDSUB ' ****************************************************************************** ' Mémoire MENU ' A placer dans l'EEprom ' ------------ "","PROGRAMME DATE H","017","000","002","005","006","000", "","DATE HEURE REGLA","017","000","003","001","008","000", "","HEURE REGLAGES S","017","000","004","002","009","000", "","REGLAGES SORTIE ","017","000","005","003","010","000", "","SORTIE PROGRAMME","017","000","001","004","130","000", "","CHOIX_CYCLE SORT","017","000","007","007","014","000", "","SORTIE CHOIX_CYC","017","000","006","006","005","000", "DATE ","jj/mm/aaaa ","026","026","128","129","018","001", "HEURE ","HH:MM ","016","018","128","129","019","004", "","TEMPERATURE_ECS ","017","000","011","013","020","000", "","HYSTERESIS PARAM","017","000","012","010","021","000", "","PARAMETRES SORTI","017","000","013","011","022","000", "","SORTIE TEMPERATU","017","000","010","012","005","000", "","CYCLE1 CYCLE2 CY","017","000","015","017","131","000", "","CYCLE2 CYCLE3 CY","017","000","016","014","132","000", "","CYCLE3 CYCLE4 CY","017","000","017","015","133","000", "","CYCLE4 CYCLE1 CY","017","000","014","016","134","000", "DATE ","jj/mm/aaaa ","021","021","128","129","032","002", "HEURE ","HH:MM ","021","021","128","129","005","005", "TEMPERATURE_ECS ","65°C ","018","018","128","129","011","006", "HYSTERESIS_TEMP_","AMBIANTE = 0,2°C","030","030","128","129","033","009", "","T_MINI_EXTERIEUR","017","000","023","025","034","000", "","T_MAXI_CHAUDIERE","017","000","024","022","035","000", "","TYPE_REGULATION ","017","000","025","023","036","000", "","SORTIE T_MINI_EX","017","000","022","024","013","000", "","SELECTION AJOUT_","017","000","027","031","038","000", "","AJOUT_PLAGE EDIT","017","000","028","026","040","000", "","EDITER_CYCLE TEM","017","000","029","027","048","000", "","TEMP_JOUR TEMP_N","017","000","030","028","049","000", "","TEMP_NUIT SORTIE","017","000","031","029","050","000", "","SORTIE SELECTION","017","000","026","030","007","000", "DATE ","jj/mm/aaaa ","018","018","128","129","003","003", "HYSTERESIS_TEMP_","RADIATEUR= 0,5°C","030","030","128","129","051","010", "TEMPERATURE_MINI","EXTERIEUR= -09°C","030","030","128","129","023","007", "TEMPERATURE_MAXI","CHAUDIERE = 80°C","030","030","128","129","025","008", "TYPE_REGULATION>","CHAUDIERE VANNE_","017","000","037","037","025","000", "TYPE_REGULATION>","VANNE_3_VOIES CH","017","000","036","036","052","000", "SELECTION CYCLEx","OUI NON","017","000","039","039","130","012", "SELECTION CYCLEx","OUI NON","030","000","038","038","007","000", "","LUNDI MARDI MERC","017","000","041","047","135","013", "","MARDI MERCREDI J","017","000","042","040","136","013", "","MERCREDI JEUDI V","017","000","043","041","137","013", "","JEUDI VENDREDI S","017","000","044","042","138","013", "","VENDREDI SAMEDI ","017","000","045","043","139","013", "","SAMEDI DIMANCHE ","017","000","046","044","140","013", "","DIMANCHE SORTIE ","017","000","047","045","141","013", "","SORTIE LUNDI MAR","017","000","040","046","031","000", "CYCLEx PLAGExx","JJJ HH:MM hh:mm ","015","016","128","129","056","014", "CYCLEx TEMP_JOUR","20,5°C ","020","020","128","129","031","000", "CYCLEx TEMP_NUIT","17,5°C ","020","020","128","129","031","000", "HYSTERESIS_TEMP_","ECS = 0,5°C ","025","025","128","129","012","011", "","OUVRIR/FERMER AN","017","000","053","053","143","000", "","ANALOGIQUE OUVRI","017","000","052","052","144","000", "JJJ ","DEBUT A hh:mm ","029","029","128","129","055","015", "JJJ hh:mm","DE hh:mm A hh:mm","016","016","128","129","058","016", "SUPPRIMER PLAGE ","OUI NON","017","000","057","057","031","000", "SUPPRIMER PLAGE ","OUI NON","030","000","056","056","142","000", "CYCLEx ","CONTINUER SORTIE","017","000","059","059","027","000", "CYCLEx ","CONTINUER SORTIE","027","000","058","058","047","000" ' ***** END ********************************************************************