Programmation structurée du programme Optimiseur simplifié Ver 1.2 du 13/11/11. ******************************************************************************* Modifié le 13/11/2011 suite à la réunion M-I du 09/11/2011. BEGIN ' Début du programme GOSUB InitMicro ' Initialisation du micro-contrôleur GOSUB InitVar ' Définition et init. des variables GOSUB Init1Wire ' Initialisation des sondes de température Programme principal ------------------- DO WHILE I=I ' Début de la boucle principale infinie IF Thermostat = 1 THEN ' Si il y a demande de chaleur GOSUB LitSondeT ' Lecture des DS18B20-PAR en 1Wire IF ThermostatOld = 0 THEN ' on a pas eu de cycle de chauffe LET TiTh1 = Ti ' Temp. intérieure au moment ou le ENDIF ' thermostat est en demande de chaleur IF Ti < TiMin THEN ' Si temp. intérieure est < que Ti mini LET TiMin = Ti ' Température intérieure minimum = Ti ENDIF LET ThermostatOld = 1 ' Mise en mémoire de Thermostat IF CourbeCycle = 1 THEN ' on a eu un cycle de chauffe GOSUB CourbeDeChau ' Adaptation de la "courbe de chauffe" ENDIF GOSUB CommandeChauffage ' Commande du chauffage ELSE IF ThermostatOld = 0 THEN ' on a pas eu de cycle de chauffe LET TiTh0 = Ti ' Temp. intérieure au moment ou le ' thermostat n'est plus en demande de ENDIF ' chaleur IF ThermostatOld = 1 THEN ' GOSUB LitSondeT ' Lecture des DS18B20-PAR en 1Wire IF Ti > TiMax THEN ' Si temp. intérieure est > que Ti max LET TiMax = Ti ' Température intérieure maximum = Ti ENDIF LET TiMoy = (TiMin + TiMax)/2 ' Calcul de la temp. intérieure moyenne LET CourbeCycle = 1 ' On a eu un cycle de chauffe LET ThermostatOld = 0 ' ENDIF ENDIF GOSUB Communication ' Teste si le PC "demande" des infos ENDDO ' Fin de la boucle principale infinie END ' Fin du programme ------------------------------------------------------------------------------- InitMicro --------- Description : Initialisation du micro-contrôleur et création des "Alias" qui déterminerons les connections 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 Sous-routine appellée : Aucune SUB InitMicro LET 1Wire = Portx.x ' Liaison du bus "1Wire" à l'AtMega LET Thermostat = Portx.x ' Liaison venant du contact thermostat LET RS232_In = Portx.x ' Liaison du "Port Série_In" à l'AtMega LET RS232_Out = Portx.x ' Liaison du "Port Série_Out" à l'AtMega ENDSUB ******************************************************************************* InitVar ------- Description : Définition et initialisation des variables Variables d'entrées : Aucune Variables de sorties : Aucune Variables de travail : Toutes les variables du programme Sous-routine appellée : Interruptions SUB InitVar DECLARE CycleCourbe AS bit ' Index 0 ou 1 - détermine l'état du cycle DECLARE Relais1 AS bit ' Led1 et circulateur d'eau DECLARE Relais2 AS bit ' Led2 et Brûleur ou Ouverture de Vanne DECLARE Relais3 AS bit ' Led3 et fermeture de la Vanne à 3 voies DECLARE System AS bit ' 0 = Brûleur et 1 = Vanne à 3 voies DECLARE Thermostat AS bit ' 0 = contact Ouvert et 1 = contact fermé DECLARE ThermostatOld AS bit ' Valeur précédente de Thermostat DECLARE HysEau AS Nibble ' Hystérésis en plus ou en moins de la temp. ' de l'eau de chauffage DECLARE Teau1 AS byte ' Température maximale d'eau du chauffage DECLARE Te1 AS byte ' Température extérieure suivant la région DECLARE TiMin AS Integer ' Température intérieure Minimale DECLARE TiMax AS Integer ' Température intérieure Maximale DECLARE TiMoy AS Integer ' Température intérieure Moyenne DECLARE TiTh1 AS Integer ' Temp. int. basculement de Thermostat = 1 DECLARE TiTh0 AS Integer ' Temp. int. basculement de Thermostat = 0 DECLARE Ti AS Integer ' Température intérieure (1Wire Sonde 1) DECLARE Te AS Integer ' Température extérieure (1Wire Sonde 2) DECLARE TeauC AS Integer ' Temp. calculée de l'eau du chauffage DECLARE TeauM AS Integer ' Temp. mesurée eau chauffage (1Wire Sonde 3) DECLARE TCons AS float ' Température de consigne = (TiTh0 + TiTh1)/2 DECLARE Pente AS float ' Pente de courbe de chauffe DECLARE Pivot AS float ' Temp. d'eau pour temp. extérieure de 0 C° DECLARE OW_Nombre AS byte ' Nombre d'éléments sur le bus 1Wire DECLARE OW_ID_0(7) AS byte ' circuit 1, 7 = les 8 bytes de l'identifiant DECLARE OW_ID_1(7) AS byte ' circuit 2, 7 = les 8 bytes de l'identifiant DECLARE OW_ID_2(7) AS byte ' circuit 3, 7 = les 8 bytes de l'identifiant DECLARE OW_Erreur AS bit ' Drapeau d'erreur pour les fonctions 1Wire DECLARE TempL(2) AS byte ' Lecture de l'octet 'Low' des 3 sondes DECLARE TempH(2) AS byte ' Lecture de l'octet 'High' des 3 sondes DECLARE i AS byte ' Variable de travail DECLARE j AS byte ' Variable de travail LET System = 1 ' Choix entre 0 = Brûleur ou 1 = Vanne 3 voies LET Teau1 = 80 ' Température maximale (voir constructeur) LET Te1 = -9 ' Valeur définie pour la région de Liège LET HysEau = 5 ' Hystérésis pour l'eau de chauffage LET CycleCourbe = 0 ' Valeur au démarrage LET ThermostatOld = 0 ' Valeur au démarrage LET TCons = 20 ' Valeur au démarrage, sera ensuite calculée IF System = 1 THEN ' Optimisation par vannes à 3 voies DECLARE Tempo AS byte ' Constante définie par l'utilisateur DECLARE TempoOld AS byte ' Variable pour la durée de commande vanne DECLARE TempInter AS word ' Variable de comptage par Interruption LET Tempo = 2 ' Valeur à déterminer pour définir le temps ' d'ouverture de la vanne à 3 voies LET TempoOld = 75 ' Fermeture totale, uniquement l'eau de retour DO WHILE TempoOld > 0 ' Boucle permettant la fermeture jusqu'à butée LET Relais3 = 1 ' Démarrage de la commande de la fermeture de ' la vanne 3 voies et on allume la Led3 ENDDO ' Fin de boucle LET Relais3 = 0 ' Arrêt de la commande de la fermeture de la ' vanne à 3 voies et on éteint la Led3 LET TempoOld = 22 ' Ouverture à environ 30% = mélange faible de ' l'eau de départ chaudière et important de ' l'eau de retour DO WHILE TempoOld > 0 ' Boucle permettant l'ouverture partielle LET Relais2 = 1 ' Démarrage de la commande d'ouverture de la ' vanne et on allume la Led2 ENDDO ' Fin de boucle LET Relais2 = 0 ' Arrêt de la commande d'ouverture de la vanne ENDIF ' et on éteint la Led2 LET TempoOld = Tempo ' Réinitilisation de la valeur ENDSUB ******************************************************************************* Init1Wire --------- Description : Initialisation des sondes de température Variables d'entrées : Aucune Variables de sorties : ow_nombre, ow_id Variables de travail : i Sous-routine appellée : Aucune SUB Init1Wire LET ow_nombre = IF ow_nombre > 1 THEN LET i = 1 DO WHILE i <= ow_nombre LET i = i + 1 ENDDO ENDIF ENDSUB ******************************************************************************* LitSondeT --------- Description : Lecture des sondes DS18B20-PAR en 1Wire Variables d'entrées : ow_nombre, ow_id Variables de sorties : Ti, Te, TeauM Variables de travail : i, j, TempL, TempH Sous-routine appellée : CalculTempMoy SUB LitSondeT LET i = 0 DO WHILE i <= ow_nombre ' Code ROM d'adressage LET j = 0 DO WHILE j < 8 ' Adressage du circuit n°i LET j = j + 1 ENDDO ' A partir de maintenant et jusqu'au RESET suivant, les ' commandes concerneront uniquement le circuit adressé. ' Exécute une conversion PAUSE 750 ms ' Temps d'attente pour la conversion ' Lecture de la ram LET TempL(i) = ' Lecture de l'octet 'Low' de Temp LET TempH(i) = ' Lecture de l'octet 'High' de Temp LET j = 0 ' A tester, normalement le DS18B20 DO WHILE j < 7 ' Envoie 9 octets, mais il est ' Possible que l'arrêt de la lecture LET j = j + 1 ' après les 2 premiers octets ne provoque ENDDO ' pas d'erreur... LET Ti = TempL(0) / 2 ' Temp. intérieure toujours positive LET TeauM = TempL(1) / 2 ' Temp. eau chauffage toujours positive IF TempH(2) = 0 THEN ' Si température positive LET Te = TempL(2) / 2 ' Température extérieure positive ELSE ' Sinon, température négative LET Te = ((~TempL(2)+1)/2) ' Complémentaire à 2 = Temp. ext. négative ENDIF LET i = i + 1 ' Sonde suivante ENDDO ENDSUB ' Retour à la routine principale ******************************************************************************* Interruptions ------------- Description : Timer par Interruptions toutes les secondes Variables d'entrées : Timer interne Variables de sorties : TempoOld Variables de travail : TempInter, Tempo Sousroutine appellée : Aucune SUB Interruptions LET TempInter = TempInter + 1 ' Incrémente TempInter IF TempInter = Tempo THEN ' Test si durée est atteinte en seconde LET TempoOld = TempoOld - 1 ' Décrémente Tempo ENDIF ENDSUB ******************************************************************************* CourbeDeChau ------------ Description: Adaptation de la "courbe de chauffe" Variables d'entrées : TiMoy, TiTh0, TiTH1 Variables de sorties : CycleCourbe, TeauC, TCons Variables de travail : Te1, Te, Pente, Pivot, Teau1 Sous-routine appellée : Aucune SUB CourbeDeChau ' Teau1 = 80°C , Te1 = -9°C LET TCons = (TiTh0 + TiTh1)/2 ' Calcul de la température de consigne LET TeauC = Pente X Te + Pivot '(y = ax + b) IF TiMoy > TCons THEN ' Diminution de la Pente LET Pivot = Pivot ' Pivot = 63,125°C LET Pente = (Teau1 - (TiMoy - TCons)- Pivot) / Te1 ELSE IF TiMoy < TCons THEN ' Déplacement point Pivot vers le haut LET Pente = Pente ' Pente = -1,875 LET Pivot = Pivot + (TCons - TiMoy) LET TeauC = Pente X Te1 + Pivot IF TeauC => Teau1 THEN LET Pente = (Teau1 - Pivot) / Te1 ENDIF ENDIF ENDIF LET CourbeCycle = 0 ' Réinitialise la variable ENDSUB ' Retour à la routine principale ******************************************************************************* CommandeChauffage ----------------- Description: Commande du chauffage Variables d'entrées : Ti, TeauC, TeauM Variables de sorties : Relais1, Relais2, Relais3 Variables de travail : TCons, System, HysEau, Tempo, TempoOld Sous-routine appellée : Aucune SUB CommandeChauffage IF Ti < TCons THEN ' Si la temp. intér. est < la temp. de consigne LET Relais1 = 1 ' Relais du circulateur et Led1 rouge ENDIF IF TeauM = Ti THEN ' Si la température d'eau = la temp. intérieur, LET Relais1 = 0 ' Relais du circulateur et Led1 rouge ENDIF IF System = 0 THEN ' 0 = système géré par commande du brûleur IF TeauM < TeauC - HysEau THEN LET Relais2 = 1 ' Brûleur et Led2 rouge ELSE IF TeauM > TeauC + HysEau THEN LET Relais2 = 0 ' Brûleur et Led2 rouge ENDIF ENDIF ELSE ' 1 = Système géré par commande de vanne 3 voies IF TeauM < TeauC - HysEau THEN IF TempoOld > 0 THEN ' Test si la temporisation est toujours active LET Relais3 = 0 ' Un seul relais de vanne activé en même temps LET Relais2 = 1 ' Ouverture de la vanne et Led2 rouge ELSE LET Relais2 = 0 ' Commande de la vanne et Led2 rouge LET TempoOld = Tempo ' Remise à la valeur initiale ENDIF ENDIF IF TeauM > TeauC + HysEau THEN IF TempoOld > 0 THEN ' Test si la temporisation est toujours active LET Relais2 = 0 ' Un seul relais de vanne activé en même temps LET Relais3 = 1 ' Fermeture de la vanne et Led3 rouge ELSE LET Relais3 = 0 ' Commande de la vanne et Led3 rouge LET TempoOld = Tempo ' Remise à la valeur initiale ENDIF ENDIF ENDIF ENDSUB ' Retour à la routine principale ******************************************************************************* Communication ------------- Description: Communication avec le PC via le port série Variables d'entrées : RS232_In Variables de sorties : RS232_Out Variables de travail : Aucune Sous-routine appellée : Aucune SUB Communication IF THEN ENDIF ENDSUB ' Retour à la routine principale *******************************************************************************