PID et sortie sur deux relais

Bonjour

voila toujours pour mon projet de regulation solaire, je dois réguler la température de l'eau de chauffage via une vanne trois voies pilotée par un servo. le servo est lui même piloté par deux relais : un pour le sens +, l'autre pour le sens -

la commande doit donc piloter alternativement les deux relais selon qu'il faille diminuer ou augmenter le température.

j'ai bien entendu regardé l'exemple "relais" de la librairie pid, mais j'ai du mal à imaginer comment adapter cela à mon cas.

je ne vois pas bien comment interpréter la sortie du pid de sorte à la convertir non pas en une fenetre temporelle mais deux, selon le sens de mouvement necessaire

si vous avez une idée...

En sortie de votre PID, vous avez une tension dont le signe et l'amplitude représentent le sens et l'amplitude d'ouverture de votre vanne.

Si le signe est positif, vous commandez le relais de la voie eau froide,
Si le signe est négatif, vous commandez le relais de la voie eau chaude

L'amplitude va être utilisée pour commander le servo de la voie active à l'aide de la fonction map() par exemple.

S'il n'y a qu'un seul servo pour les deux voies, le principe reste le même

Une doc de votre vanne trois voies ne serait pas inutile.

Cordialement.

Pierre

bonsoir pierre

alors de ce que j'ai compris de la librairie pid, il me semblait que le signe de la sortie est forcément positif ?

ou alors si j'ai une sortie, mettons en 0 - 5000 (ce qui en ms me donne une fenêtre temporelle sur 5s pour commander mon servo ce qui parait raisonnable), je la passe par map() avec -2500, 2500 et ensuite avec ce résultat je pilote les deux relais selon le signe ? en effet ça semble pouvoir fonctionner. Et ensuite quand je suis dans une plage de disons +-2° autour de ma valeur de consigne je désactive le pid pour éviter que le servo fasse en permanence des micros-mouvements qui auraient sans doute tot fait de le cramer.

la vanne trois voies, ben... c'est une vanne trois voies de chauffage, rien de particulier. sur 1/4 de tour on passe du recyclage total au puisage total. Je n'ai pas de doc particulière à son sujet

bricofoy:
... la vanne trois voies, ben... c'est une vanne trois voies de chauffage, rien de particulier. sur 1/4 de tour on passe du recyclage total au puisage total. Je n'ai pas de doc particulière à son sujet

Ce qui m'intéresse c'est le mode de commande de cette vanne. Combien y a-t-il de servos ? un ou deux ?

S'il n'y en a qu'un, est-ce que d'une butée à l'autre, il passe de plein recyclage à plein puisage ? A quoi correspond la position médiane du servo ?

Ou bien alors, le servo commande-t-il l'ouverture de la vanne de zéro à plein et chaque relais aiguille vers le recyclage ou le puisage ?

Les relais actionnent quoi ?

Avez-vous un schéma électrique de cette vanne ?

Il m'est impossible de vous dire comment faire si je ne sais pas quel organe comment quoi.

Cordialement.

Pierre

Alors ok, le servo c'est un moteur AC (synchrone à aimants permanents je pense, comme ceux des anciens programmateurs de lave-linge) avec une grosse réduction derrière, et deux enroulements, un pour tourner dans un sens, l'autre dans l'autre.

Il y a également deux contacts de fin de course de manière à ne pas griller le moteur quand on arrive en butée.
La commande se fait par trois fils : un neutre commun, et la phase envoyée d'un coté ou de l'autre selon le sens de rotation voulu (vers le recyclage ou le puisage).

D'où les deux relais de commande, un pour chaque sens.
Enfin plus exactement j'ai placé les deux relais en série : un relais qui sert à changer le sens en basculant entre une phase et l'autre du moteur et l'autre pour alimenter ou non le premier (donc le moteur), de la sorte il est impossible même en cas de bug dans mon code d'alimenter les deux phases du moteur en même temps et de griller le servo bêtement.

Le temps de rotation complet est de l'ordre de 40s (de butée à butée, donc de recyclage 100%,à puisage 100%)

La position médiane de la vanne correspond à 50% de recyclage. Ou du moins à 50% d'ouverture, après au niveau des débits c'est pas forcément exactement le cas, mais peu importe.

Cela dit, commander la vanne ne me pose pas de soucis particulier. C'est ma méconnaissance de la librairie pid et de ce qu'elle attends/donne qui m'en pose. Actuellement j'avais fait un truc très simple avec un cycle qui attends 5s, mesure la température en sortie, compare à la consigne, tourne la vanne en + ou - pendant 2s selon ce qui est nécessaire puis retourne 5s en attente. Mais bien entendu, ce n'est pas stable et la température oscille en permanence, même si l'inertie du circuit de chauffage limite les dégats. c'est pour ça que je voudrais utiliser un algo de pilotage plus évolué.

bricofoy:
... Enfin plus exactement j'ai placé les deux relais en série : un relais qui sert à changer le sens en basculant entre une phase et l'autre du moteur et l'autre pour alimenter ou non le premier (donc le moteur), de la sorte il est impossible même en cas de bug dans mon code d'alimenter les deux phases du moteur en même temps et de griller le servo bêtement. ...

?? Pas compris. Vous pouvez me faire schéma des relais, de leurs commandes et de leurs contacts qui actionnent l'une ou l'autre des phases du moteur ?

NOTA : Attention à ne pas appeler un moteur un servo, cela prête à confusion. Un servo est un ensemble moteur+commande en position ou en vitesse piloté par un signal spécifique.

Cordialement.

Pierre

en chauffage on appelle ce "truc" un servo. Possible que dans l'industrie ça désigne autrechose, mais j'ai utilisé le nom sous lequel je le vends et je l'emploie depuis des années, désolé si ce n'est pas exact.

les relais, oui je peux faire un schéma, voila :

je n'ai pas représenté le circuit de commande, chaque bobine est commandée par une pin de l'arduino, rien de problématique je pense.

R1 commande l'alimentation du moteur, et R2 le sens de rotation, en envoyant la phase vers un des enroulements ou l'autre.
De la sorte impossible physiquement d'envoyer en même temps la phase des deux cotés du moteur, ce qui pourrait être le cas si chaque relais alimentait un des enroulements et qu'un bug les fasse activer simultanément.

OK, j'ai compris (enfin).

J'ai regardé ce que fait la bibliothèque PID avec des relais : il commande un rapport cyclique (durée de fermeture /durée d'ouverture) du relais proportionnel à la valeur à asservir. Il faut translater cela en ± ; ce ne devrait pas être un problème.

Par contre, je vais y réfléchir plus précisément car "a priori", ce type de commande correspond à l'intégrale de ce qu'il faut faire, c'est-à-dire qu'il commande un débit plutôt qu'une quantité d'eau.

Mais quoi qu'il en soit, et toujours "a priori, la commande par PDI va faire bagoter les relais plus souvent qu'une simple régulation en tout ou rien avec seuil qui, si elle est bien réglée, devrait maintenir la température de l'eau dans le degré.

J'y réfléchis :wink:

Cordialement.

Pierre

c'est pour ça que pour ne pas faire trop de petits mouvements je pensais désactiver le PID tant que je reste dans +-2° autour de ma consigne

avec mon algo précédent du fait de la durée de commande fixe je met parfois longtemps à corriger, et surtout je ne suis jamais vraiment proche de la consigne, du coup ça oscille constamment. J'ai aussi pensé à appliquer un coefficient à la durée d'activation des relais en fonction de l'écart (ne garder que le P du PID, en gros) mais je me disais que quitte à modifier le système, autant partir direct sur un pid complet (que je n'arrive pas vraiment à comprendre, en fait... les maths et moi ça fait un certain nombre :stuck_out_tongue: )

Pouvez-vous indiquer quelle est la puissance de votre installation solaire et quelle est le volume de l'eau que vous voulez chauffer.

Ces deux valeurs vont influer beaucoup sur le mode de régulation. Pour un important volume d'eau, la commande proportionnelle ne me semble pas pertinente.

Cordialement.

Pierre

Bonjour;

Ca ne me semble pas évident de faire du PID adapté à des signaux analogiques sur des signaux TOUT OU RIEN.

Car c'est bien là la finalité d'une régulateur PID, c'est de corriger en permanence, ou en continu, sans interruption, en Proportionnel, Integral et Dérivé un signal constitué de la consigne - le retour.

Le retour devant être dans le même domaine que la consigne.

Par exemple si vous donnez une consigne de vitesse en à-10V avec à=Arrêt et 10V=1500trs:min, il vous faut un retour du même domaine, soit un signal à 0-10V image de la vitesse, histoire de comparer des carottes avec des carottes et non des carottes avec des patates.

Dans la lib PID, il est bien dit que PID n'est pas l'idéal pour piloter un signal TOUT OU RIEN adapté à un relais, mais ils donnent tout de même un exemple où ils le font.

Avec si j'ai bien compris un PWM "long" par exemple si je veux envoyer une consigne "A FOND" je pilote le relais allumé en permanence à fond pendant 5s j'arrête, je relis Consigne - retour et je recommence.

Consigne "A MOITIE", je pilote le relais allumé pendant 2,5s et éteints pendant 2,5s sur la moyenne cela donne "à moitié"

Dans votre schéma, vous ne pilotez pas 1 seul relais mais 2.
L'un qui sert de ON/OFF
L'autre qui indique le sens d'ouverture de l'électrovanne.

Quand l'electrovanne n'est pas pilotée, revient-elle à 0 toute seul?

Si c'est le cas, dans l'application PID adaptée à votre cas, il faut une petite adaptation pour convertir le "+" du correcteur en "piloter dans sens 1" à savoir piloter uniquement R1 et le "-" du correcteur en "piloter dans sens 2" à savoir piloter R1 et R2.

Et jouer sur le temps de pilotage selon ce qu'indique le PID (plus ou moins longtemps donc plus ou moins ouvert)

Mais ce n'est pas à proprement parlé un PID, c'est plus je crois un simple P.

PS: une quantité d'eau, en m3, c'est = à 1 débit (en m3/h) x temps, la quantité d'eau serait bien AMHA l'intégrale du débit, ou le débit la derivée de la quantité d'eau.

quand le moteur n'est pas piloté, il ne bouge juste pas. la vanne reste dans sa position. Il n'y a pas de retour vers l'une ou l'autre position extrème.

pour la simplicité, considérons que les deux relais pilotent les deux sens, la petite logique pour les activer ensuite dans leur configuration réelle n'a rien à voir avec le pid et ne pose aucun problème particulier

Mon problème, c'est de transposer la "PWM lente" dont j'ai bien compris le fonctionnement sur un seul relais, à deux relais. Sur quel critère se baser pour activer l'un ou l'autre relais. Si la sortie du PID peut être de type -X à +X alors pas de soucis, le signe détermine quel relais sera activé. Mais il me semblait avoir compris que la valeur de sortie était obligatoirement positive.

Bon en fait pas du tout, j'ai craqué tout seul sur ce coup là. Après avoir passé une partie l'après-midi à relire le code le la librairie et les explications de l'auteur sur son blog, je me rends compte que depuis le début je me prends vraisemblablement la tête pour rien.
Je n'ai en revanche toujours pas compris la méthode de calcul des dérivées et intégrales de l'erreur, mais je comprends dans quelle mesure cela agit sur la valeur de sortie.

Mais quoi qu'il en soit puisque je sais que la sortie peut donc vraiment être une plage centrée sur 0, j'utilise le signe pour activer ou non R2, et la valeur absolue de la sortie pour la fenêtre temporelle d'activation de R1 comme dans l'exemple relay.

Bon, plus qu'a tester ça dans la semaine pour voir ce que ça donne.

Sinon pour répondre aussi à la question de pierre, la puissance du capteur solaire est d'environ 10kW dans les conditions optimales (capteur à tubes sous vide avec 80 tubes, soit 8,4m² au total)
Ce capteur chauffe un ballon tampon de 1000L avec un serpentin sanitaire pour la création instantanée d'eau chaude sanitaire. Le circuit de chauffage puise ensuite dans ce ballon.
Il y a un appoint par une cuisinière à bois avec bouilleur, qui va elle aussi chauffer le ballon.

Pour le ballon de 1m³ le capteur devrait pouvoir le faire monter de 8°/h dans les conditions d'ensoleillement optimales (j'ai pris une irradiation de 1400W/m², ce qui peut paraitre élevé mais est courant chez nous (proche de perpignan) ).
La conso de chauffage je ne la connais pas, l'isolation est en train d'être refaite, et de toutes manières il y a le bouilleur en appoint. Avant installation du solaire le bouilleur assurait seul le chauffage, en thermosiphon.

Je n'ai pas le schéma hydraulique sur ce PC mais je peux le poster demain.

Je ne prétend pas avoir une solution, je m'intéresse seulement.

Donc tu regule un débit d'eau chaude ou froide que tu introduit en permanence dans ton circuit pour réchauffer ou refroidir plutôt que une quantité d'eau chaude ou froide que tu introduit ponctuellement, et uniquement si nécessaire ?

Je dis cela car à priori quand tu ouvre dans un sens, tu y reste jusqu'à la prochaine correction.

Tu ne crsin pas que se soit très instable de cette façon ?

Non, c'est comme ça que sont régulés tous les circuits de chauffage que je connais. A ma connaissance, c'est d'ailleurs la seule technique qui existe du moins pour les installations domestiques.
Mais c'est logique, un circuit de chauffage, c'est un système qui a tout de même énormément d'inertie, et une perte continue sensiblement constante à température extérieure constante.
Une fois que le débit d'ajout d'eau chaude est déterminé, et du fait de la forte inertie, ça reste assez stable, et comme la perte est continue, il est logique que l'ajout d'eau chaude dans le circuit soit continu. Enfin je trouve, en tout cas.

bricofoy:
... Pour le ballon de 1m³ le capteur devrait pouvoir le faire monter de 8°/h dans les conditions d'ensoleillement optimales (j'ai pris une irradiation de 1400W/m², ce qui peut paraitre élevé mais est courant chez nous (proche de perpignan) ). ...

Vous dites optimales, je dirais plutôt maximales en plein zénith avec un ciel pur. Mais bon, prenons ces valeurs. Je suis d'accord avec vous, sans perte, vous pouvez faire monter la température de 8.6 °/h.

C'est-à-dire qu'il vous faut 8 minutes pour la faire monter de 1°. Mais cela, c'est dans les conditions d'exploitation max de la puissance solaire, c'est à dire pour une ouverture max de votre vanne.

Prétendre à une régulation meilleure que 1 ° me semble complètement illusoire compte tenu des diverses variations d'apport et de retrait d'eau dans votre ballon. De ce fait, une commande proportionnelle conduisant à une ouverture fractionnée de votre vanne vous conduirait à un delta de température de 1 ° en plus de 8 minutes. Ne pouvant espérer une régulation meilleure que le degré, je n'en vois pas le sens.

De plus, il faut être conscient que les 1400 W / m² ne sont valables que sur une petite fraction de la journée et par temps clair. Vouloir découper cela en tranches plus fines par une commande proportionnelle de votre vanne m'apparaît comme vouloir couper les cheveux en quatre.

Par ailleurs, le I et le D d'une commande PID ne servirait à rien :

  • pour le I : il ne corrige qu'un biais stable sur le long terme. Son action ne pourrait avoir lieu que sur un délai de plusieurs heures, délai sur lequel les variations d'apport et retrait n'ont aucune stabilité.
  • Pour le D : un système hydraulique de ce type se comporte comme un premier ordre ou un retard pur et de ce fait est stable dans une large gamme de réglage de P.
    Donc, à mon sens, une bonne régulation classique telle qu'elle faite ordinairement est largement suffisante.

Par contre, un élément qui peut faire que le régulation soit plus ou moins bonne est l'emplacement du capteur de température de l'eau. Pour moi, cette capture devait se faire au sein du ballon.

Cordialement.

Pierre

bricofoy:
il est logique que l'ajout d'eau chaude dans le circuit soit continu. Enfin je trouve, en tout cas.

Bonjour,

C'est probable, si je compare à mon chauffage gaz, il ne chauffe pas l'eau en permanence, juste quand la température dans la maison (et pas celle de l'eau) est inférieur à un seuil.

Quand elle dépasse un autre seuil, le CHAUFFAGE (la flamme) s'arrête mais la circulation d'eau continu pendant un certain temps.

Une maison aussi a des fuites, et une certaine inertie.

Je ne crois pas que cela soit un PID, mais plutôt un TOUT ou RIEN qui peut marcher trés bien je pense sur des sytémes lents et TOUT ou RIEN.

Donc je faisait sans doute à tort, une analogie et je croyais que l'eau chaude ou froide n'était pas forcément constamment ajoutée dans ton circuit, donc qu'en position repos, l’électrovanne revenait sur son point 0 ou milieu.

Bonjour

Pierre -> alors je crois qu'il y a un point ou on ne s'est pas compris : le capteur solaire chauffe le stock (le ballon) dès que possible, et au maximum possible, du moins dans la période de chauffe.
La vanne n'a rien à voir la dedans. Pour cette partie chauffe-eau solaire, j'ai aussi un PID mais sur la vitesse de la pompe, de manière à garder autant que possible un delta constant entre la température des capteurs et celle du ballon pour maximiser l'échange. La aussi j'avais essayé avec un algo bien plus simple, mais sans succès.

Ensuite on puise dans ce stock pour alimenter le circuit de chauffage par radiateurs, et c'est lors de ce puisage que la vanne en question entre en jeu. Car il n'y a aucun intérêt à balancer de l'eau trop chaude (entre 95 et 65) dans les radiateurs, d'une part car ce serait dangereux, et d'autre part car on épuiserait le stock extrêmement vite, or ce stock est quand même assez limité, 1m³ ça ne va pas bien loin, et l'objectif c'est que les jours de temps bien clair au moins il ne soit pas obligatoire de brûler du bois, donc le stock doit pouvoir tenir une partie de la nuit.
Sans non plus trop baisser en température pour qu'il reste de quoi prendre une douche le matin. Là dessus j'aurais un seuil qui limite la décharge du ballon aux alentours de 50° en haut du ballon et coupe le chauffage, de sorte à conserver de quoi chauffer l'eau de la douche.

Il y a dans le ballon trois sondes une tout en haut, une à mi-hauteur et une au niveau du bas de l'échangeur solaire. Celle du bas est utilisée pour le système solaire, les trois permettent de se rendre compte de l'évolution du chargement du ballon. Avec la stratification qui se crée naturellement, la température n'est pas la même selon la hauteur dans le ballon, il est par exemple courant d'avoir un ballon avec le haut à 55° et le bas à 20.

Pour ce qui est de la régulation de la vanne, les régulations du commercent utilisent généralement un PID, justement. Et le délai de plusieurs heures justifiant le I , du fait de l'inertie très importante du système, il est bien présent, du moins pour ce que j'en comprends.

ZigZag -> Oui dans le cas d'une chaudière directement raccordée au circuit radiateur, sans stockage tampon, la situation est différente et en effet c'est en général une régulation tout ou rien sur la température du circuit avec un hystérésis de quelques degrés, du moins sur les systèmes un peu anciens.
Du fait de l'inertie importante d'une maison, ça fonctionne, mais avec des variation importantes de température tout de même pour ne pas devoir mettre en route/éteindre le brûleur trop souvent.

Sur la majorité des nouvelles chaudières même de petite puissance, le brûleur est maintenant modulant, et la puissance s'adapte en continu, du moins dans une certaine mesure et si la machine est bien dimensionnée. Le problème est que les chaudières sont beaucoup trop souvent surdimensionnées par les chauffagistes (bien oui c'est plus interressant de vendre la plus grosse, elle est plus chère...), ce qui conduit finalement à retrouver un fonctionnement tout ou rien alors qu'elles sont prévues pour moduler, mais qu'on se retrouve en dessous du minimum de la plage possible de modulation. Avec du coup des rendements catastrophiques car on travaille toujours en bas de la courbe, encrassement, surconsommation, pollution etc etc
Mais c'est un autre débat :stuck_out_tongue:

Avec un stockage tampon, tous les systèmes de chauffages modernes utilisent une vanne trois voies pilotée pour adapter la température de l'eau des radiateurs.

Ensuite pour déterminer cette température, on se base sur la température extérieure sur laquelle est appliqué un coefficient (la "pente", car concrètement c'est une fonction affine ax+b avec a la pente, x la temp ext et b le décalage du zéro (la température nécessaire quand la temp ext est à 0°), le tout pondéré par la différence entre la valeur de la température intérieure et la consigne de température intérieure.

La formule exacte du calcul je ne l'ai pas encore déterminée, les documentations des régulations existantes sont assez discrètes sur leur cuisine interne... et ça me gonfle. Ça plus plein de fonctions qui me manquent, comme par exemple un log sur carte sd, et ça m'a conduit à vouloir fabriquer ma propre régul... et à tomber dans ces réflexions sans fin :stuck_out_tongue: Mais c'est bien ça remet les neurones en mouvement :smiley:

le post initial qui parle de ma régulation est ici : Thermalduino, régulation de chauffage open source - Français - Arduino Forum

bricofoy:
... Pour cette partie chauffe-eau solaire, j'ai aussi un PID mais sur la vitesse de la pompe, de manière à garder autant que possible un delta constant entre la température des capteurs et celle du ballon pour maximiser l'échange. ...

Maximiser la puissance transmise par le capteur solaire, c'est obtenir la plus grande quantité de thermies transmises. Ce maximum est égal à l'écart de température multiplié par le débit. En l’occurrence, ce n'est pas forcément en conservant un delta de température constant.

bricofoy:
... Pierre -> alors je crois qu'il y a un point ou on ne s'est pas compris ...

Ah oui, là, je me suis complètement planté. Si j'ai bien compris, votre but est de réguler la température de l'eau dans le circuit de chauffage, l'eau étant prélevée dans le ballon. La régulation étant faite par une vanne trois qui établit un rapport distribution / recirculation fonction de sa position d'ouverture. La position d'ouverture étant en relation avec une consigne qui dépend de différents paramètres.

Alors, si je ne me trompe pas à nouveau, cela relève bien d'une régulation proportionnelle, mais n'étant toujours pas convaincu de l'utilité du I et du D.

Au final, votre chaîne de contrôle va comporter un PID, puis une commande des relais pour interpréter le signal du PID.

Le relais de sens va être commandé par le signe de l'erreur (pas de problème) et le relais d'activation par l'amplitude du l'erreur de la manière suivante : c'est la quantité de déplacement de la vanne qui est proportionnelle à l'amplitude de l'erreur.

Ce mode de fonctionnement est de type échantillonné à très basse fréquence compte tenu de l'inertie de votre circuit de chauffage..

Il est difficile de faire un calcul, mais par exemple : les écarts de température entre le ballon et le circuit de chauffage peuvent être de 30 °. Vous divisez la course totale de votre vanne par 30 pour avoir une finesse de 1°. Vous dites qu'il faut 40 s pour aller d'une buté à l'autre, donc chaque degré de commande issue de votre PID va faire bouger votre vanne pendant 40 / 30 = 1.3 seconde. Puis, vous devez attendre qu'une évolution doivent se faire sentir : ce sera la période d'échantillonnage. Sur mon circuit de chauffage c'est de l'ordre de une à deux minutes.

Une fois que vous aurez réussi à faire cela, vous pourrez vous intéresser à une commande I (que je persiste à trouver inutile compte tenu des écarts de situations qui vont se présenter et de la finesse du réglage à obtenir : l'ordre du degré me paraissant déjà bien superflu)

Cordialement.

Pierre

le temps de réaction sera assez court, je mesure ici la température de départ du circuit, pas celle du retour, comme c'est j'imagine le cas chez vous pour que ce soit aussi long.

pour le moment, je suis arrivé à ça comme solution : le PID me donne une valeur entre 0 et le temps maximum mis par la vanne pour tourner, en ms. Si entre deux itérations du PID la valeur de sortie à évolué de plus de 1000, alors je répercute l'évolution sur la position de la vanne, en la faisant tourner de cette durée. J'ai mis ce seuil pour éviter les trop petits mouvements qui ne serviraient pas à grand chose concrètement, et qui en revanche risqueraient de conduire à griller le moteur par des sollicitations trop fréquentes. Si l'évolution de la valeur change de sens, alors je tourne la vanne dans l'autre sens.

void heat_run()
{
	static unsigned long windowStartTime;
	static int lastWoutput;
	static int windowOn;
	static bool direction;
		
	if(heat.isFirstRun())
	{
		windowStartTime=millis();
		WaterPID.SetMode(AUTOMATIC);
		lastWoutput=0; //valve must be fully closed prior to start 
	}

	setOutput(BIT_R1,1); //pump on
	
	if(heat.periodic(30E3)) //check every 30s is often enough
	{
		if( DateTime.hour<C[0][3] || DateTime.hour>C[0][4] )
			TinSet=C[0][2];  //night setpoint
		else
			TinSet=C[0][1];  //day setpoint
	}

	/*water setpoint calculation :
	base formula is Twater= -slope*Tout + b
	we know one point : (ToutNoHeat,TwaterNoHeat) so we can write :
	TwaterNoHeat= -slope*ToutNoHeat +b
	so b= TwaterNoHeat+slope*ToutNoHeat
	so b= C2.2+C2.0/10*C2.1   (/10 because slope parameter is recorded in tenth)
	so with Text=T6 we have : 
	Wsetpoint= (-C[2][0]/10*T[6] + C[2][2]+C[2][0]/10*C[2][1] )
	
	then we use Tin and TinSet to make final adjustment :
	we define coef*(TinSet - Tin) and with Tin = T7 we eventually have :
	
	Wsetpoint= Wsetpoint + C[2][3]*10*(TinSet- T[7]) 	*/
	
	//main calculation :
	Wsetpoint= (-C[2][0]/10*T[6] + C[2][2]+C[2][0]/10*C[2][1] );
	//final adjustment taking Tin into account :
	Wsetpoint= Wsetpoint + C[2][3]/10*(TinSet- T[7]);
	
	//check for upper limit
	if(Wsetpoint>C[3][0]) Wsetpoint=C[3][0];
	
	Winput=T[4]; //get the actual water temp	
	
	if( WaterPID.Compute() ) 
	{	//if PID computed a new output
		//we calculate the corresponding amount of time to move the valve
		windowOn=Woutput-lastWoutput;		
		//we do this to get only the difference between two subsequent PID
		//outputs, so we can adjust the valve position
		
		lastWoutput=Woutput; //and then store the current value for next time
					
		//if movement is shorter than min mvmt time, just don't move to protect
		//the valve motor. But doing so we need to keep track of the amount of 
		//move we did not actually do, to keep accurate recording of valve position 
		if (abs(windowOn)<(C[1][2]*1E3))
		{
			lastWoutput-=windowOn;
			//and we just don't move
			windowOn=0;
		}
		
		direction = (windowOn>0); 	//get the movement direction
		windowOn = abs(windowOn); 	//get the time to move the valve
	}
	
	
	if (millis() - windowStartTime > (C[1][0]*1E3))
		windowStartTime += (C[1][0]*1E3); //time to shift the time Window
	
	if (windowOn > millis() - windowStartTime) 
	{ 
		moveMixValve(direction); //move the valve according to PID output
	}
	
	if(!Hon) 
	{
		heat.next(heat_close);
		WaterPID.SetMode(MANUAL);
	}
	if(Hon && (T[3]<C[3][1]))
	{
		heat.next(heat_err_close);
		WaterPID.SetMode(MANUAL);
	}	
}

Screenshot des logs d'activité