' Programmation structurée pour le MENU. - Version: 1.4 du 09/03/2011 ' ------------------------------------------------------------------- BEGIN GOSUB Initvar GOSUB Initmicro GOSUB Initaffi DO WHILE J = 0 ' Début de la boucle infinie LET MnuAdres = BaseAdres + 37 * (MnuNum - 1) LET Ligne1$ = MnuAdres LET Ligne2$ = MnuAdres + 16 LET MnuPosCur = MnuAdres + 32 LET MnuActHorlo = MnuAdres + 33 LET MnuActAntiH = MnuAdres + 34 LET MnuActRet = MnuAdres + 35 LET MnuIndiVar = MnuAdres + 36 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 Let MnuNum = 54 ' On saute à la ligne 54 du Menu 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 TypRegulation AS BIT ' 0 = Chaudière, 1 = Vanne à 3 voies DECLARE TypVanne AS BIT ' 0 = vanne On/Off, 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 JourDate As BYTE ' de 1 à 31 suivant les mois DECLARE Heure As BYTE ' de 0 à 23 DECLARE Minute As BYTE ' de 0 à 59 DECLARE TempMaxEau As BYTE ' Température maximum chaudière (Constructeur) DECLARE TempECS AS WORD ' Température fixée pour l'eau chaude sanitaire DECLARE HysTempEau As BYTE ' Hystérésis température eau radiateur DECLARE HysTempECS As BYTE ' Hystérésis température eau ECS DECLARE NumCycle As BYTE ' Numéro de cycle (1 à 4) DECLARE Jour As BYTE ' de 1 à 7 DECLARE NumPlage As BYTE ' Numéro de plage horaire (1 à 96) DECLARE JourPlage As BYTE ' Jour correspondant à la plage horaire (1 à 7) DECLARE PlageWeek(28) AS BYTE ' 4 Cycles par jour X 7 jours semaine = 28 DECLARE HDebutPlage As BYTE ' Heure de début de plage horaire (1 à 96) DECLARE DureePlage As BYTE ' Durée de la plage horaire par 1/4 heure 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 MnuPosCur AS BYTE ' Menu Adresse + 32 DECLARE MnuActHorlo AS BYTE ' Menu Adresse + 33 DECLARE MnuActAntiH AS BYTE ' Menu Adresse + 34 DECLARE MnuActRet AS BYTE ' Menu Adresse + 35 DECLARE MnuIndiVar AS BYTE ' Menu Adresse + 36 DECLARE Iw AS WORD ' Variable de travail DECLARE TempHabLue AS WORD ' Température lue à l'intérieure de l'habitation DECLARE TempExtLue AS WORD ' Température lue à l'extérieure DECLARE TempEauLue AS WORD ' Température lue d'eau départ radiateur DECLARE TempECSLue AS WORD ' Température lue d'eau chaude sanitaire DECLARE TempConsOld AS WORD ' Température de consigne précédente DECLARE JourSemaine$(7) AS ALPHA ' Les 7 jours de la semaine (8 Chars) DECLARE Ligne1$(16) AS ALPHA ' Première ligne d'affichage du LCD (16 Chars) DECLARE Ligne2$(16) AS ALPHA ' Deuxième ligne d'affichage du LCD (16 Chars) DECLARE Indice$(18) AS ALPHA ' Matrice contenant les correspondances Indice DECLARE LimitBas$(18) AS ALPHA ' Matrice contenant les limites basses DECLARE LimitHaut$(18) AS ALPHA ' Matrice contenant les limites hautes DECLARE Diviseur$(18) 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 TempMiniExt As INTEGER ' Température minimim extérieure (fichier XLS) DECLARE HysTempHab As INTEGER ' Hystérésis température habitation en 1/2°C DECLARE TCycleJour(4) AS INTEGER ' Température du cycle Jour X 4 cycles/jour DECLARE TCycleNuit(4) AS INTEGER ' Température de cycle Nuit X 4 cycles/jour ' Initialisation des variables ' ---------------------------- LET J = 0 ' Initiation de la variable bit J LET k = 0 LET Jb = 0 LET Iw = 0 LET TCycleJour = 20 ' Température pour le cycle Jour LET TCycleNuit = 17,5 ' Température pour le cycle Nuit LET TempConsECS = 60 ' Température de consigne ECS LET TempMinExt = -9 ' Température Minimum Extérieure LET TempMaxEau = 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 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 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 Indice$(17) = TCycleJour, LET Indice$(18) = TCycleNuit 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 LimitBas$(17) = 20, LET LimitBas$(18) = 20 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 LimitHaut$(17)= 50, LET LimitHaut$(18)= 50 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 Diviseur$(17) = 2, LET Diviseur$(18) = 2 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.4 " ' 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 ' ****************************************************************************** ' MiseAJourVariable: ' ------------------ ' Description : Mise à jour de la variable suivant le numéro de ligne du "Menu" ' ' Variables d'entrées : Valeur, Jour, Indice(), LimitBas(), LimitHaut(), Diviseur() ' Variables de sorties : Annee, Heure, Mois, Minute, TempECS, HysTempHab, JourDate, HysTempEau, TempMiniExt, TempMaxiEau, Cycle, HysTempECS, Joursemaine, NumPlage, JourPlage, HdebutPlage, DureePlage, TCycleJour(), TCycleNuit() ' Variables de travail : Aucune ' Sousroutines appellées : Aucune ' SUB MiseAJourVariable: IF MnuNum = 8 THEN LET Annee = Valeur ' (0 à 99) ELSE IF MnuNum = 9 THEN LET Heure = Valeur ' (0 à 23) ELSE IF MnuNum = 18 THEN LET Mois = Valeur ' (0 à 12) ELSE IF MnuNum = 19 THEN LET Minute = Valeur ' (0 à 59) ELSE IF MnuNum = 20 THEN LET TempECS = Valeur ' (60 à 85)/1 ELSE IF MnuNum = 21 THEN LET HysTempHab = Valeur ' (1 à 10)/10 ELSE IF MnuNum = 32 THEN LET JourDate = Valeur ' (1 à 31) ELSE IF MnuNum = 33 THEN LET HysTempEau = Valeur ' (1 à 10)/2 ELSE IF MnuNum = 34 THEN LET TempMiniExt = Valeur ' (-30 à 0)/2 Voir Tableau ELSE IF MnuNum = 35 THEN LET TempMaxiEau = Valeur ' (50 à 90)/1 Voir Constructeur ELSE IF MnuNum = 48 THEN LET NumPlage = Valeur ' (1 à 96) ///NumCycle (1 à 4) ///JourPlage (1 à 7) ///HDebutPlage (0 à 96) ///DureePlage (1 à 96) ELSE IF MnuNum = 49 THEN LET NumCycle = Valeur ' (1 à 4) ///TCycleJour(Cycle) ELSE IF MnuNum = 50 THEN LET NumCycle = Valeur ' (1 à 4) ///TCycleNuit(Cycle) ELSE IF MnuNum = 51 THEN LET HysTempECS = Valeur ' (1 à 10)/2 ELSE IF MnuNum = 54 THEN LET Jour = Valeur ' (1 à 7) ///Début hh:mm calculé par 1/4 heure ELSE IF MnuNum = 55 THEN LET Jour = Valeur ' (1 à 7) ///Durée / Heure début / Heure de fin ELSE IF MnuNum = 58 THEN LET NumCycle = Valeur ' (1 à 4) /// ELSE IF MnuNum = 59 THEN LET NumCycle = Valeur ' (1 à 4) /// ENDIF ENDSUB ' Retour à la routine principale ' ***************************************************************************** ' 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 ' Variable de 2 nibbles + 96 bits soit 13 octets, pas de programmation = 0, ' mettre un 1 par 1/4 heure programmé ' exemple:Cycle 1 , Mercredi, départ de chauffe à 8heure pour 1 heure (4 X 1/4) ' __ ' Mercredi, Cycle1 08:00/ \4 X 1/4 h ' 00110001000000000000000000000000111100000000000000000000...000000000000000000 ' Pour supprimer une plage, il suffit de mettre des zéros à la place des 1 ENDSUB ' ****************************************************************************** ' Mémoire MENU ' A placer dans l'EEprom ' ------------ "","PROGRAMME DATE H","017","002","005","006","000", "","DATE HEURE REGLA","017","003","001","008","000", "","HEURE REGLAGES S","017","004","002","009","000", "","REGLAGES SORTIE ","017","005","003","010","000", "","SORTIE PROGRAMME","017","001","004","130","000", "","CHOIX_CYCLE SORT","017","007","007","014","000", "","SORTIE CHOIX_CYC","017","006","006","005","000", "DATE ","jj/mm/aaaa ","026","128","129","018","001", "HEURE ","HH:MM ","018","128","129","019","004", "","TEMPERATURE_ECS ","017","011","013","020","000", "","HYSTERESIS PARAM","017","012","010","021","000", "","PARAMETRES SORTI","017","013","011","022","000", "","SORTIE TEMPERATU","017","010","012","005","000", "","CYCLE1 CYCLE2 CY","017","015","017","131","000", "","CYCLE2 CYCLE3 CY","017","016","014","132","000", "","CYCLE3 CYCLE4 CY","017","017","015","133","000", "","CYCLE4 CYCLE1 CY","017","014","016","134","000", "DATE ","jj/mm/aaaa ","021","128","129","032","002", "HEURE ","HH:MM ","021","128","129","005","005", "TEMPERATURE_ECS ","65°C ","018","128","129","011","006", "HYSTERESIS_TEMP_","AMBIANTE = 0,2°C","030","128","129","033","009", "","T_MINI_EXTERIEUR","017","023","025","034","000", "","T_MAXI_CHAUDIERE","017","024","022","035","000", "","TYPE_REGULATION ","017","025","023","036","000", "","SORTIE T_MINI_EX","017","022","024","013","000", "","SELECTION AJOUT_","017","027","031","038","000", "","AJOUT_PLAGE EDIT","017","028","026","040","000", "","EDITER_CYCLE TEM","017","029","027","048","000", "","TEMP_JOUR TEMP_N","017","030","028","049","000", "","TEMP_NUIT SORTIE","017","031","029","050","000", "","SORTIE SELECTION","017","026","030","007","000", "DATE ","jj/mm/aaaa ","018","128","129","003","003", "HYSTERESIS_TEMP_","RADIATEUR= 0,5°C","030","128","129","051","010", "TEMPERATURE_MINI","EXTERIEUR= -09°C","030","128","129","023","007", "TEMPERATURE_MAXI","CHAUDIERE = 80°C","030","128","129","025","008", "TYPE_REGULATION>","CHAUDIERE VANNE_","017","037","037","025","000", "TYPE_REGULATION>","VANNE_3_VOIES CH","017","036","036","052","000", "SELECTION CYCLEx","OUI NON","017","039","039","130","012", "SELECTION CYCLEx","NON OUI","017","038","038","007","000", "","LUNDI MARDI MERC","017","041","047","135","013", "","MARDI MERCREDI J","017","042","040","136","013", "","MERCREDI JEUDI V","017","043","041","137","013", "","JEUDI VENDREDI S","017","044","042","138","013", "","VENDREDI SAMEDI ","017","045","043","139","013", "","SAMEDI DIMANCHE ","017","046","044","140","013", "","DIMANCHE SORTIE ","017","047","045","141","013", "","SORTIE LUNDI MAR","017","040","046","031","000", "CYCLEx PLAGExx","JJJ HH:MM hh:mm ","016","128","129","056","014", "CYCLEx TEMP_JOUR","20,5°C ","020","128","129","031","017", "CYCLEx TEMP_NUIT","17,5°C ","020","128","129","031","018", "HYSTERESIS_TEMP_","ECS = 0,5°C ","025","128","129","012","011", "","OUVRIR/FERMER AN","017","053","053","143","000", "","ANALOGIQUE OUVRI","017","052","052","144","000", "JJJ ","DEBUT A hh:mm ","029","128","129","055","015", "JJJ hh:mm","DE hh:mm A hh:mm","016","128","129","058","016", "SUPPRIMER PLAGE ","OUI NON","017","057","057","031","000", "SUPPRIMER PLAGE ","NON OUI","017","056","056","142","000", "CYCLEx ","CONTINUER SORTIE","017","059","059","027","000", "CYCLEx ","SORTIE CONTINUER","017","058","058","047","000" ' ***** END ********************************************************************