Programmation structurée du programme Optimiseur simplifié Ver 1.0 du 09/11/11. ******************************************************************************* BEGIN ' Début du programme GOSUB InitMicro ' Initialisation du micro-contrôleur GOSUB InitVar ' Définition et initialisation des variables GOSUB Init1Wire ' Initialisation des sondes de température GOSUB LitDipSwitches ' Initialisation de la température de consigne 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 "1Wire" à l'AtMega LET Thermostat = Portx.x ' Liaison du contact venant du thermostat LET Dipsw1 = Portx.x ' Liaison du Dipswitche bit1 (poids faible) LET Dipsw2 = Portx.x ' Liaison du Dipswitche bit2 LET Dipsw3 = Portx.x ' Liaison du Dipswitche bit3 LET Dipsw4 = Portx.x ' Liaison du Dipswitche bit4 (poids fort) 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 la 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 Dipsw(3) AS bit ' Etat des pins DECLARE TeauC AS byte ' Température de consigne de l'eau du chauffage DECLARE TeauM AS byte ' Temp. mesurée de l'eau du chauffage (1Wire) DECLARE Teau1 AS byte ' Température maximale d'eau du chauffage DECLARE Te1 AS byte ' Température extérieure suivant la région DECLARE Ti AS byte ' Température intérieure (Sonde 1Wire) DECLARE TiMin AS byte ' Température intérieure Minimale DECLARE TiMax AS byte ' Température intérieure Maximale DECLARE TiMoy AS byte ' Température intérieure Moyenne DECLARE Tempo AS byte ' Valeur représentant la durée de cde de vanne DECLARE TempoOld AS byte ' Valeur précédente de Tempo 'DECLARE TempInt AS word ' Variable de comptage par Interruption DECLARE Te AS integer ' Température extérieure (Sonde 1Wire) DECLARE Pente AS float ' Pente de courbe de chauffe. DECLARE Pivot AS float ' Température d'eau pour temp. extérieure de 0 C° DECLARE TCons AS Float ' Température de consigne ( Dip-Switches ) DECLARE OW_Nombre AS byte ' Nombre d'éléments sur le bus DECLARE OW_ID_1(7) AS byte ' circuit 1, 7 = les 8 bytes de l'identifiant DECLARE OW_ID_2(7) AS byte ' circuit 2, 7 = les 8 bytes de l'identifiant DECLARE OW_ID_3(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 Temp(2) AS word ' Températures des 3 sondes indicées DECLARE TempL(2) AS byte ' Lecture de l'octet 'Low' des 'Temp' indicées DECLARE TempH(2) AS byte ' Lecture de l'octet 'High' des 'Temp' indicées DECLARE i AS byte ' Variable de travail 'DECLARE j AS byte ' Variable de travail 'DECLARE k AS byte ' Variable de travail 'DECLARE m AS word ' Variable de travail 'DECLARE n AS word ' Variable de travail LET System = 1 ' Choix entre 0 = Chaudière ou 1 = Vanne 3 voies LET Teau1 = 80 ' Température maximale (voir constructeur) LET Te1 = 9 ' Ajouter le signe (-) moins dans le programme LET Tempo = 2 ' A déterminer pour le pas d'ouverture vanne LET CycleCourbe = 0 ' Détermine si on a déjà fait un cycle complet IF System = 1 ' Optimisation par vannes à 3 voies LET TempoOld = 75 ' Fermeture totale = uniquement l'eau de retour DO WHILE Tempo > 0 ' Boucle permettant la fermeture jusqu'à butée LET Relais3 = 1 ' Commande de la fermeture de la vanne et on ' allume la Led3 ENDDO ' Fin de boucle LET Relais3 = 0 ' Arrêt de la commande de la fermeture de la ' vanne 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 ' Commande de l'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 ' et on éteint la Led2 ENDIF 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 : Aucune Variables de travail : ow_nombre, ow_id, 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 ******************************************************************************* LitDipSwitches -------------- Description : Initialisation de la température de consigne Variables d'entrées : DipSw(3) Variables de sorties : Aucune Variables de travail : TCons, i, j Sous-routine appellée : Aucune SUB LitDipSwitches LET j = 0 DO WHILE j <= 3 Let i = i & DipSw(j) LET j = j + 1 ENDDO If i = 0000 LET TCons = 17,5 ELSE IF i = 0001 LET TCons = 18 ENDIF ELSE IF i = 0010 LET TCons = 18,5 ENDIF ELSE IF i = 0011 LET TCons = 19 ENDIF ELSE IF i = 0100 LET TCons = 19,5 ENDIF ELSE IF i = 0101 LET TCons = 20 ENDIF ELSE IF i = 0110 LET TCons = 20,5 ENDIF ELSE IF i = 0111 LET TCons = 21 ENDIF ELSE IF i = 1000 LET TCons = 21,5 ENDIF ELSE IF i = 1001 LET TCons = 22 ENDIF ELSE IF i = 1010 LET TCons = 22,5 ENDIF ELSE IF i = 1011 LET TCons = 23 ENDIF ELSE IF i = 1100 LET TCons = 23,5 ENDIF ELSE IF i = 1101 LET TCons = 24 ENDIF ELSE IF i = 1110 LET TCons = 24,5 ENDIF ELSE IF i = 1111 LET TCons = 25 ENDIF ENDIF ENDSUB ******************************************************************************* Programme principal ------------------- DO WHILE I=I ' Début de la boucle principale infinie IF Thermostat = 1 ' Si il y a demande de chaleur GOSUB LitSondeT ' Lecture des DS18B20-PAR en 1Wire GOSUB CourbeDeChau ' Adaptation de la "courbe de chauffe" GOSUB CommandeChauffage ' Commande du chauffage ENDIF GOSUB Communication ' Teste si le PC "demande" des infos ENDDO ' Fin de la boucle principale infinie END ' Fin du programme ------------------------------------------------------------------------------- LitSondeT --------- Description : Lecture des sondes DS18B20-PAR en 1Wire Variables d'entrées : Aucune Variables de sorties : Aucune Variables de travail : i, j, ow_nombre, ow_id, 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 LET j = j + 1 ' lecture après les 2 premiers octets ENDDO ' ne provoque pas d'erreur... LET i = i + 1 ENDDO ENDSUB ' Retour à la routine principale ******************************************************************************* CalculTempMoy ------------- Description : Calcul la température moyenne Variables d'entrées : Aucune Variables de sorties : Aucune Variables de travail : Ti, TiMax, TiMin, TiMoy Sousroutine appellée : Aucune IF Ti > TiMax ' Si température intérieure est > que Ti maximum LET TiMax = Ti ' Température intérieure maximum = Ti ENDIF IF Ti < TiMin ' Si température intérieure est < que Ti minimum LET TiMin = Ti ' Température intérieure minimum = Ti ENDIF LET TiMoy = (TiMin + TiMax)/2 ' Calcul de la température intérieure moyenne ENDSUB ' Retour à la routine LitSondeT ******************************************************************************* Interruptions ------------- Description : Timer par Interruptions toutes les secondes Variables d'entrées : Timer interne Variables de sorties : Aucune Variables de travail : TempoOld Sousroutine appellée : Aucune SUB Interruptions LET TempoOld = TempoOld - 1 ' Décrémente Tempo ENDSUB ******************************************************************************* CourbeDeChau ------------ Description: Adaptation de la "courbe de chauffe" Variables d'entrées : Aucune Variables de sorties : Aucune Variables de travail : CycleCourbe, TiMoy, Te1, TCons, Te, Pente, Pivot, Teau, Teau1 Sous-routine appellée : Aucune SUB CourbeDeChau IF CycleCourbe = 1 ' Après un cycle, on peut optimiser LET Teau = Pente X Te + Pivot '(y = ax + b). IF TiMoy > TCons ' Diminution de la Pente LET Pivot = Pivot ' Pivot = 63,125°C LET Pente = (Teau1 - (TiMoy - TCons)- Pivot) / Te1 ENDIF ' Teau1 = 80°C , Te1 = -9°C IF TiMoy < TCons ' Déplacement point Pivot vers le haut LET Pente = Pente ' Pente = -1,875 LET Pivot = Pivot + (TCons - TiMoy) LET Teau = Pente X Te1 + Pivot IF Teau => Teau1 LET Pente = (Teau1 - Pivot) / Te1 ENDIF ENDIF ENDIF ENDSUB ' Retour à la routine principale ******************************************************************************* CommandeChauffage ----------------- Description: Commande du chauffage Variables d'entrées : Aucune Variables de sorties : Relai1, Relais2, Relais3 Variables de travail : Ti, TCons, Teau, System, TeauM, TeauC, HysEau, Tempo, TempoOld Sous-routine appellée : Aucune SUB CommandeChauffage IF Ti < TCons ' Si la temp. intér. est < la temp. de consigne LET Relais1 = 1 ' Commande du relais de la pompe du chauffage et ' on allume la Led1 rouge ENDIF IF Teau = Ti ' Si la température d'eau = la temp. intérieur, LET Relais1 = 0 ' arrêt du relais de la pompe du chauffage et ' on éteint la Led1 rouge ENDIF IF System = 0 ' 0 = commande du brûleur IF TeauM < TeauC - HysEau LET Relais2 = 1 ' Brûleur en marche et allumage de la Led2 rouge ELSE IF TeauM > TeauC + HysEau LET Relais2 = 0 ' Arrêt du brûleur et extinction de la Led2 rouge ENDIF ENDIF ENDIF IF System = 1 ' 1 = commande par vanne à 3 voies IF TeauM < TeauC - HysEau IF TempoOld > 0 ' Test si la temporisation 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 ON ELSE LET Relais2 = 0 ' Arrêt de la commande vanne et Led2 rouge OFF LET TempoOld = Tempo ' Remise à la valeur initiale ENDIF ENDIF IF TeauM > TeauC + HysEau IF TempoOld > 0 ' Test si la temporisation 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 ON ELSE LET Relais3 = 0 ' Arrêt de la commande vanne et Led3 rouge OFF LET TempoOld = Tempo ' Remise à la valeur initiale ENDIF ENDIF ENDIF LET CycleCourbe = 1 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 : Sous-routine appellée : Aucune SUB Communication IF ENDIF ENDSUB ' Retour à la routine principale *******************************************************************************