Descriptions des tâches pour la régulation de chauffage ------------------------------------------------------- Liste des tâches ---------------- Initialiser le micro-contrôleur AtMega16 ou 32 Initialiser le LCD (2 X 16) Initialiser le DS3221 en I2C (Real Time Clock) Initialiser les 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 et pourront être changées via la routine MENU) Début de la boucle infinie Aller à la routine LectureBouton Aller à la routine LireHeure Aller à la routine LireTemp Aller à la routine Consommation Aller à la routine ModeActuel Aller à la routine Communication Aller à la routine Affichage Aller à la routine AffiLCD Fin de la boucle infinie ------------------------------------------------------------------------------ Routine LectureBouton (Encodeur rotatif avec poussoir) Si Bouton uniquement en rotation Si Mode = 2 ' Nuit TConsNuitOld = TConsNuit ' Allumage du rétro-éclairage du LCD Ligne1 ' TConsNuitOld Ligne2 ' TConsNuit Aller à la routine AffiLCD Si Bouton 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 Aller à la routine AffiLCD Finsi Finsi Si Mode = 3 ' Jour TConsJourOld = TConsJour ' Allumage du rétro-éclairage du LCD Ligne1 ' TConsJourOld Ligne2 ' TConsJour Aller à la routine AffiLCD Si Bouton 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 Aller à la routine AffiLCD Finsi Finsi Si Bouton inactif > 3 secondes ou Si Bouton appuyé Aller à la routine ModeActuel Finsi Finsi Si Bouton poussé pour une durée inférieure à 0,5 seconde Si Mode = 4 ' Mode Horloge Allumage du rétro-éclairage du LCD Inverse la valeur de derogaBit ' valeur 0 ou 1 Si DerogaBit = 1 Mode = 5 ' Mode Dérogation Finsi Finsi Aller à la routine ModeActuel Finsi Si Bouton poussé pour une durée supérieure à 1 seconde Allumage du rétro-éclairage du LCD Aller à la routine Menu Finsi Si Bouton poussé brièvement suivi d'une rotation Allumage du rétro-éclairage du LCD Aller à la routine ChgtMode Finsi Fin de LectureBouton --------------------------------------- Routine ChgtMode Affichage sur Ligne1 Affichage du mode en cours en contraste inversé sur Ligne2 'exemple: Mode1 = Veille ou OFF Mode2 = Nuit Mode3 = Jour Mode4 = Horloge Mode5 = Override ou Dérogation Si Bouton en rotation Défilement des 5 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 Finsi Aller à la routine ModeActuel Fin de ChgtMode --------------------------------------- Routine ModeActuel ' Exécute les actions suivant les modes Si Mode = 1 ' Mise du chauffage en SECURITE (Veille) LedA = ' Led jaune allumée TCons = 5 ' Protection antigel de l'immeuble If Text < 1,5 Aller à la routine CourbeDeChauffe PompeChau = pour 10 minutes toutes les 6 heures If TExt < -5 PompeChau = ' Relais pompe enclenché Sinon Mode = 2 ' Mode = Nuit Finsi Si Mode = 2 ' Mode = Nuit Si TConsNuitOld<>TConsNuit ' La température de consigne a été changée TCons = TConsNuit ' Mise à jour de la consigne LedB = ' Led rouge allumée Finsi Aller à la routine CourbeDeChauffe Si Mode = 3 ' Mode = Jour Si TConsJourOld<>TConsJour ' La température de consigne a été changée TCons = TConsJour ' Mise à jour de la consigne LedC = ' Led verte allumée Finsi Aller à la routine CourbeDeChauffe Si Mode = 4 ' Mode = Horloge Si Heure > HeureDebut et < HeureFin TCons = TConsJour LedD = ' Led bleue allumée LedC = ' Led verte allumée Finsi Si Heure > HeureFin et < HeureDebut TCons = TConsNuit LedD = ' Led bleue allumée LedB = ' Led rouge allumée Finsi Aller à la routine CourbeDeChauffe Si Mode = 5 ' Mode = Dérogation ou Override Si DerogaBit = 1 Si Heure > HeureDebut et < HeureFin ' Egale à jour TConsNuit = TConsNuitOld ' Restitution de la température de consigne TCons = TConsJour LedD = ' Led bleue allumée LedC = ' Led verte clignote 5mS ttes les 2 secondes Si Heure > HeureFin et < HeureDebut ' Egale à nuit TConsJour = TConsJourOld ' Restitution de la température de consigne TCons = TConsNuit LedD = ' Led bleue allumée LedB = ' Led rouge clignote 5mS ttes les 2 secondes Finsi Finsi Aller à la routine CourbeDeChauffe Finsi Extinction du rétro-éclairage du LCD Fin de ModeActuel --------------------------------------- Routine CourbeDeChauffe Teau = Pente X Te = Pivot '(y = ax + b) Si TMoy > TCons ' Diminution de la Pente Pivot = Pivot Pente = (Teau1-(Tmoy-TCons)-Pivot)/Te1 Si TMoy < TCons ' Déplacement du point Pivot vers le haut Pente = Pente Pivot = Pivot + (TCons-Tmoy) Teau = Pente X Te1 + Pivot If Teau => Teau1 Pente = (Teau1 - Pivot) / Te1 Finsi Finsi Si TECS < TECS - HysteresisECS ' Eau chaude sanitaire est PRIORITAIRE PompeCha = ' on force l'arrêt de la pompe du chauffage PompeECS = ' on enclenche la pompe du ballon ECS Si TECS > TECS + HysteresisECS PompeECS = ' on arrête la pompe du ballon ECS Si Ti < TCons ' Si la temp. int. est < la temp. de consigne PompeCha = ' on enclenche la pompe du chauffage si Teau = Ti ' Si la temp. d'eau = la temp. intérieur PompeCha = ' on arrête la pompe du chauffage si Teau < Teau - HysteresisCha si commande du Brûleur Brûleur = si commande d'une Vanne à 3 voies Vanne = si commande d'une Vanne Analogique Vanne Ana = Finsi Si Teau > Teau + HysteresisCha si commande du Brûleur Brûleur = si commande d'une Vanne à 3 voies Vanne = si commande d'une Vanne Analogique VanneAna = Finsi Finsi Si Heure = 00 ' Minuit si DureePompeCha = 0 ou Index = 1 ' Si la pompe du chauffage n'a pas Index = 1 ' fonctionner durant 24 heures PompeCha = ' On enclenche la pompe pour 10 minutes Incrémente DureePompeCha toutes les minutes si DureePompeCha > 10 Index = 0 ' Reset de l'index DureePompeCha = 0 ' Reset du compteur Finsi Finsi Finsi Fin de CourbeDeChauffe --------------------------------------- Routine LireHeure Utilise le protocole I2C pour lire l'heure et la date dans DS3221 Aller à la routine Affichage Fin de LireHeure --------------------------------------- Routine LireTemp 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 = 0 ou 5 ' Toutes les 5 minutes, on lit La température Lire la sonde Te ' extérieure, car elle ne varie pas rapidement Finsi Aller à la routine CourbeDeChauffe Fin de LireTemp --------------------------------------- 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 minutes écoulées > 1439 ' 1440 minutes = 24 heures Aller à la routine EcritureEEprom Finsi DureePompeCha = Minutes de fonctionnement journalier de la pompe chauffage Fin de Consommation --------------------------------------- Routine EcritureEEprom Ecrire dans l'EEprom dd/mm/aa, la Te moyenne et la consoJour en % Fin de EcritureEEprom --------------------------------------- Routine Communication 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 Traitement de la commande Finsi Fin de Communication --------------------------------------- Routine LectureEEprom Lecture dans l'EEprom de l'µC des consommations et paramètres. Fin de LectureEEprom --------------------------------------- Routine Affichage 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 Envoi de la Ligne1 sur le LCD Envoi de la Ligne2 sur le LCD Fin de AffiLCD --------------------------------------- Routine Menu Allumage du rétro-éclairage du LCD Niveau1a- Date & Heure Niveau2a- Date Niveau3a- Année (de 0 à 99) Niveau3b- Mois (de 1 à 12) Niveau3c- Jour (de 1 à 28, 29,30 ou 31) Niveau3d- Sortie vers Niveau2 Niveau2b- Heure Niveau3e- Heure (de 0 à 23) Niveau3f- Minute (de 0 à 59) Niveau3g- Sortie vers Niveau2 et mise à zéro des secondes Niveau2c- Sortie vers Niveau1 Niveau1b- Plages horaires Niveau2d- Création (jusqu'à 4 Postes pour travailleurs faisant les pauses) Niveau3h- Poste (un poste pour les personnes avec horaire fixe) Niveau4a- Jour (de la semaine) Niveau4b- Heure (de départ de chauffe) Niveau4c- Quart d'heure (incrémente de 15 minutes à la fois) Niveau4d- Durée (affiche l'heure de fin de chauffe) Niveau4e- Sortie vers Niveau3 Niveau3i- Sortie vers Niveau2 Niveau2e- Suppression (des postes) Niveau3j- Liste Niveau4f- Affichage (des postes) Niveau4g- Supprimer (le poste affiché) Niveau4h- Sortie vers Niveau3 Niveau3k- Sortie vers Niveau2 Niveau2f- Sortie vers Niveau1 Niveau1c- Paramètres Niveau2g- Températures Niveau3l- Jour (de 15,0°C à 25,5°C au demi-degré) Niveau3m- Nuit (de 10,0°C à 20,5°C au demi-degré) Niveau3n- ECS (de 60°C à 85°C par 5 degrés) (30°= légionellose) Niveau3o- Sortie vers Niveau2 Niveau2h- Hystérésis Niveau3p- Température ambiante (de 0,1 à 1°C au dixième de degré) Niveau3q- Température radiateurs (de 0,5°C à 5,0°C au demi-degré) Niveau3r- Température ECS (de 0,5°C à 5,0°C au demi-degré) Niveau3s- Sortie vers Niveau2 Niveau2i- Paramètres Niveau3t- Température minimum extérieure Niveau3u- Température maximum de chaudière Niveau3v- Type de régulation Niveau4i- Chaudière Niveau4j- Vanne à trois voies Niveau5a- Ouvrir/Fermer Niveau5b- Analogique Niveau5c- Sortie vers Niveau4 Niveau4k- Sortie vers Niveau3 Niveau3w- Sortie vers Niveau2 Niveau2j- Sortie vers Niveau1 Niveau1d- Sortie du Menu Extinction du rétro-éclairage du LCD Fin de Menu --------------------------------------- Routine ChgtHeure Clignotement de l'année Affichage du curseur sous le troisième chiffre (L1/P15) Boucle d'attente de "Appuis Bouton" Lecture boutons Si Rotation sens horloger = Incrémenter en boucle la valeur 0 à 9 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 boutons Si Rotation sens horloger = Incrémenter en boucle la valeur 0 à 9 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 boutons Si Rotation sens horloger = Incrémenter en boucle la valeur 1 à 12 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 boutons Si Rotation sens horloger = Incrémenter en boucle la valeur 1 à 3 ou 1 à 2 si le mois est février 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 boutons 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 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 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 boutons Si Rotation sens horloger = Incrémenter en boucle la valeur 1 à 2 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 boutons Si Rotation sens horloger = Incrémenter en boucle la valeur 0 à 9 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 boutons Si Rotation sens horloger = Incrémenter en boucle la valeur 0 à 5 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 boutons Si Rotation sens horloger = Incrémenter en boucle la valeur 0 à 9 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 étant 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 Aller à la routine EcrisHeure Fin de ChgtHeure --------------------------------------- Routine EcrisHeure Utilise le protocole I2C pour lire l'heure et la date dans DS3221 Fin de EcrisHeure ------------------------------------------------------------------------------