Descriptions des tâches pour l'optimiseur du chauffage central V2.3 07/07/2010 ------------------------------------------------------------------------------ Modifié après la réunion M-I du 30/06/2010 - Patrick, Yves, Jean-Pol Modifications marquées par (*) suite aux remarques de Patrick - 06/07/2010 Modifications marquées par (£) + ajouté des détails dans le menu - 07/07/2010 Changement dans le menu - 19/07/2010 Liste des tâches ---------------- 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) 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 être changées via la routine MENU) Début de la boucle infinie Aller à la routine LitBouton 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 ------------------------------------------------------------------------------ Routine LitBouton ' 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 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 Finsi Finsi Si Bouton inactif > 3 secondes ou Si Bouton appuyé Extinction du rétro-éclairage du LCD Sortie de la routine 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 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 Extinction du rétro-éclairage du LCD Fin de LitBouton --------------------------------------- Routine ChgtMode ' Changement de Mode Affichage sur Ligne1 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 Bouton 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 Bouton inactif > 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 = ' Led jaune (Veille) allumée TCons = 5 ' Protection antigel de l'immeuble If Te < 1,5 Aller à la routine CourbeDeChau PompeChau = pour 10 minutes toutes les 6 heures If TE < -5 PompeChau = ' 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 = ' 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 = ' Led verte (Jour) allumée Finsi Si Mode = 4 ' Mode = Horloge Si Plage = 1 ' Egale à jour TCons = TConsJour LedD = ' Led bleue (Horloge) allumée LedC = ' Led verte (Jour) allumée Finsi Si Plage = 0 ' Egale à nuit TCons = TConsNuit LedD = ' Led bleue (Horloge) allumée LedB = ' 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 = ' Led bleue (Horloge) allumée et Led verte LedC = ' (Jour) clignote 5mS toutes les 2 secondes Si Plage = 0 ' Egale à nuit TConsJour = TConsJourOld ' Restitution de la température de consigne TCons = TConsNuit LedD = ' Led bleue (Horloge) allumée et Led rouge LedB = ' (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 = ' on force l'arrêt de la pompe du chauffage Led1 = ' Extinction de la Led1 rouge PompeECS = ' on enclenche la pompe du ballon ECS Led2 = ' Allumage de la Led2 rouge Finsi Si TECS > TECS + HysECS 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 Led1 = ' Allumage de la Led1 rouge Finsi Si Teau = Ti ' Si la température d'eau = la temp. intérieur PompeCha = ' on arrête la pompe du chauffage Led1 = ' Extinction de la Led1 rouge Finsi Si Teau < Teau - HysEau & Bruleur = CycleChau = cycleChau + 1 Led3 = ' Allumage de la Led3 rouge Led4 = ' Extinction de la Led4 rouge Si commande du Brûleur Brûleur = Finsi Si commande d'une Vanne à 3 voies Vanne = Finsi Si commande d'une Vanne Analogique Vanne Ana = Finsi Finsi Si Teau > Teau + HysEau & Bruleur = Led3 = ' Extinction de la Led3 rouge Led4 = ' Allumage de la Led4 rouge Si commande du Brûleur Bruleur = Finsi Si commande d'une Vanne à 3 voies Vanne3Voies = Finsi si commande d'une Vanne Analogique VanneAnalo = 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 = ' Pompe pour 10 minutes Led1 = ' Allumage de la Led1 rouge Finsi Sinon Si Heure = 0 & Minute > 10 PompeChau = ' Arrêt de la pompe du chauffage Led1 = ' 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 = 0 ou 5 ' 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 = 0 et Minute = 0 ' 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 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 Allumage du rétro-éclairage du LCD 1a- DATE 2a- ANNEE - (de 0 à 99) 2b- MOIS - (de 1 à 12) 2c- JOUR - (de 1 à 28, 29,30 ou 31) 2d- SORTIE vers 1(Menu) 1b- HEURE 2e- HEURE - (de 0 à 23) 2f- MINUTE - (de 0 à 59) 2g- Mise à zéro des secondes et SORTIE vers 1(Menu) 1c- PROGRAMMES (Plages horaires) 2h- CHOISIR UN POSTE (1 à 4 Postes pour travailleurs faisant les pauses) 3a- AJOUT DE PLAGES (Affichage Poste x) 4a- JOUR - (de la semaine) ( voir exemple ci-dessous) 4b- HEURE - (de départ de chauffe) 4c- QHEURE - (incrémente ou décrémente de 15 minutes à la fois {Duree} et affiche l'heure de fin) 4d- SORTIE vers 2h CHOISIR UN POSTE 3b- EDITER POSTE (Poste x sélectionné en 2h) 4e- SUPPRIMER (Poste x et les enregistrements) 5a- CONFIRMER ( OUI / NON ) Si OUI, supprimer et SORTIE vers PROGRAMME Si NON, SORTIE vers 2h CHOISIR UN POSTE 3c- EDITER JOUR (Sélectionner Lun à Dim) 4f- VIDER LES PLAGES (de ce jour pour le poste x) 5b- CONFIRMER ( OUI / NON ) Si OUI, supprimer et SORTIE vers 2h CHOISIR UN POSTE Si NON, SORTIE vers 2h CHOISIR UN POSTE 3d- Sortie vers 1c PROGRAMME 2i- Sortie vers 1(Menu) 1d- REGLAGES (Modifications des paramètres) 2j- TEMPERATURES 3e- JOUR - (de 15,0°C à 25,5°C au demi-degré) 3f- NUIT - (de 10,0°C à 20,5°C au demi-degré) 3g- ECS - (de 60°C à 85°C par 5°) (30° = risque de légionellose) 3h- SORTIE vers 1d REGLAGES 2k- HYSTERESIS 3i- TEMPERATURE AMBIANTE - (de 0,1 à 1°C au dixième de degré) 3j- TEMPERATURE RADIATEURS - (de 0,5°C à 5,0°C au demi-degré) 3k- TEMPERATURE ECS - (de 0,5°C à 5,0°C au demi-degré) 3l- SORTIE vers 1d REGLAGES 2l- PARAMETRES 3m- TEMPERATURE MINIMUM EXTERIEURE - (TeMin = - 9) 3n- TEMPERATURE MAXIMUM DE CHAUDIERE - (TeauMax = 80) 3o- TYPE DE REGULATION 4g- CHAUDIERE - (Regulation = 0) 4h- VANNE A TROIS VOIES - (Regulation = 1) 5c- OUVRIR/FERMER - (TypeVanne = 0) 5d- ANALOGIQUE - (TypeVanne = 1) 5e- SORTIE vers 3o TYPE DE REGULATION 4i- SORTIE vers 2l PARAMETRES 3p- SORTIE vers 1d REGLAGES 2m- SORTIE vers 1(Menu) 1e- SORTIE du Menu Extinction du rétro-éclairage du LCD Exemple du 4a à 4c: +----------------+ |LUN Start 07:15| <--- Lundi, le chauffage débute à 07h15. |01h15 Stop 08:30| <--- durée = 5 x 15 minutes, arrêt du chauffage à 08h30. +----------------+ 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 boutons 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 boutons 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 boutons 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 boutons 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 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 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 boutons 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 boutons 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 boutons 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 boutons 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 ------------------------------------------------------------------------------