Régulation température d'eau chaude sanitaire

Bonjour à vous,

J’essaye de programmer une régulation de température pour ma production d’eau chaude sanitaire
je n’ai qu’un relai à gérer en fonction des données analogiques reçues de la sonde de température.

J’ai donc mesuré les tensions de cette sonde en fonction de la température de l’eau .
Ce qui donne une plage de tensions comprise entre 2V->40° et 1.4V->50° (et oui la courbe de tension est inversée par rapport à celle de la température)

Le but de ma régulation est d’activer uniquement mon relai si la température passe en dessous 40° et de le désactiver si la température passe au dessus des 50°.

Le soucis est que si mon eau est à 45° par exemple, mon relai s’active quand même sans atteindre la température mini de 40°
J’ai donc rajouté une condition en faisant 2 mesures de tension avec un interval de temps pour palier à ce probléme en essayant de determiner si la température est montante ou descendante mais sans succès

Auriez vous un tuyau svp ?

int relai5v220v = 13; // selection sortie 13 vers relai 5v 220v
float valeurECS1 = 0;  // mise à 0 variable ecs1
float valeurECS2 = 0;  // mise à 0 variable ecs2
float tension1 = 0;  // mise à 0 variable tension1
float tension2 = 0;  // mise à 0 variable tension2

void setup() {
  pinMode(relai5v220v, OUTPUT);
}

void loop() {

  valeurECS1 = analogRead(A0); // Lire la valeur entrée A0
  float tension1 = valeurECS1 * (5.0 / 1023.0);  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):

  if (tension1 < 1.4)
  {
    digitalWrite(relai5v220v, LOW); // la condition est vraie, donc je n'envoi pas de courant dans le relai
  }
  delay(60000);
  
  valeurECS2 = analogRead(A0); // Lire la valeur entrée A0
  float tension2 = valeurECS2 * (5.0 / 1023.0);  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):

  if (tension1 < tension2)
  {
    digitalWrite(relai5v220v, HIGH); // la condition est vraie, donc j'envoi 5v dans le relai
  }

  if (tension2 > 2)
  {
    digitalWrite(relai5v220v, HIGH); // la condition est vraie, donc j'envoi 5v dans le relai
  }

  delay(60000);
}

Bonjour,

Je ne comprend pas ton problème.
A 45° ton relais restera dans l’état ou il était.
Il suffit de faire
si température > 50 alors
allumer le relais
Si température <40 alors
éteindre le relais.

et pour éviter toute approximation faite par le calcul en nombre flottant, faites directement la comparaison de valeurECS1 avec les nombres entre 0 et 1023 qui représentent ces t°

==> comme ça même pas besoin de fairefloat tension1 = valeurECS1 * (5.0 / 1023.0);

1 Like

J-M-L:
et pour éviter toute approximation faite par le calcul en nombre flottant, faites directement la comparaison de valeurECS1 avec les nombres entre 0 et 1023 qui représentent ces t°

Oui, on peut faire comme ça, mais personnellement j'aurais calculé la température (en supposant que c'est linéaire) pour plus de lisibilité.

oui, la lisibilité est un élément important mais si on peut travailler en entier, c’est plus efficace sur un petit Arduino.

Généralement je définis deux constantes dont le nom est parlant (et éventuellement même avec la formule)

const int ECSMin = ...; // valeur entre 0 et 1023 correspondant à la T° min
const int ECSMax = ...; // valeur entre 0 et 1023 correspondant à la T° max

...

  int ECS = analogRead(A0);
  if (ECS <= ECSMin) {...}
  else if (ECS >= ECSMax) {...}

comme ça le compilateur ne fait qu’une seule fois le travail, ce n’est pas fait à l’exécution

1 Like

J-M-L:
oui, la lisibilité est un élément important mais si on peut travailler en entier, c'est plus efficace sur un petit Arduino.

Efficace ... avec des pauses de 60s entre 2 mesures ?

Mon credo est :
1 - on fait un programme en restant naturel et lisible (donc on compare des Températures exprimées en °C)
2 - on bataille + ou - pour que le programme marche.
3 - s'il ne marche pas à cause de sa lenteur ou de son empreinte mémoire, là seulement on optimise.

Globalement d’accord

On peut soit convertir les températures connues vers l’échelle 0-1023, soit l’inverse pour faire la comparaison. Dans les deux cas il faut une fonction de transfert et Dans les 2 cas le programme est lisible de la même manière.

Dans ce cas de figure pour décider la solution retenue je préfère prendre l’approche qui est la plus efficace, et c’est celle où on évite le passage en float et du calcul au run time.

Elle a de plus l’avantage de bien faire prendre conscience que l’on a que 1024 valeurs et pas un nombre à 6 chiffres de précision après la virgule..

Mais bien sûr il s’agit d’un choix personnel, chacun fait comme il veut

Merci beaucoup pour toutes vos réponses, en effet j’ai dû chercher midi à 14 heure
je me suis compliqué la vie…je viens de tester sur Tinkercad en faisant un simple circuit en remplaçant la sonde par une alimentation où j’ai fait varier la tension et sa fonctionne :slight_smile: Encore merci à vous

int relai5v220v = 13; // selection sortie 13 vers relai
int valeurECS = 0;  // mise à 0 variable ecs

void setup() {
  pinMode(relai5v220v, OUTPUT);
}

void loop() {

  valeurECS = analogRead(A0); // Lire la valeur entrée A0
  
  if (valeurECS < 290)
  {
    digitalWrite(relai5v220v, LOW); // la condition est vraie, donc je n'envoi pas de courant dans le relai
  }
  delay(1000);

  if (valeurECS > 410)
  {
    digitalWrite(relai5v220v, HIGH); // la condition est vraie, donc j'envoi 5v dans le relai
  }
  delay(1000);
}

En général, on ne fait pas une régulation tout ou rien comme ça. On place deux seuils autour de la température désirée, et on change la sortie de commande lorsqu’on passe en dessus du seuil haut ou en dessous du seuil bas. On appelle ça un hystérésis. En général la boucle de régulation tourne plus rapidement, par exemple toutes les secondes. Globalement, un cycle de marche / arrêt de l’organe qui délivre l’énergie est de l’ordre de quelques minutes. S’il s’agit d’une chaudière, on essaye de faire en sorte que ce soit plus lent : quatre démarrages par heure est souvent considéré comme une valeur correcte pour la durée de vie de la chaudière. Cela dit, les chaudières modernes régulent avec une puissance variable, ce qui change un peu le problème.

1 Like

Mais c’est bien ce qui est fait, les deux seuils sont 40°C et 50°C. Et le nombre de démarrage dépend des temps de chauffe et de refroidissement de l’eau.

1 Like

Je n’avais pas lu la dernière version du code :slight_smile:

1 Like

Pour revenir au code il serait bon de donner des petits noms sympas aux valeurs numériques 290 et 410 (déclarées en const int)

Bonsoir Buzleclair
Je me permets d’intervenir dans la discussion car j’ai un projet similaire, à savoir réchauffer l’eau de ma piscine avec deux planchers chauffant indépendants. Les électrovannes des planchers ne seront actionnées que si leur T° est supérieure à celle de l’eau de la piscine. Je souhaite m’inspirer de votre code pour démarrer. Pourriez-vous me communiquer votre code ?
Cordialement

Une petite observation, chauffer de l’eau dans un ballon à une température inférieure a 55° est un moyen pratique pour te chopper un nids de legionellose…

Dangers de la salmonelle
Une vraie saleté… et pas mal de morts avec ça.

Il me semble qu’il manque une donnée importante dans ce problème de chauffage d’eau chaude sanitaire: le coût de l’électricité varie suivant des plages horaires (chez moi c’est entre 2 et 7H le matin et 14 et 17H l’après-midi que l’électricité coûte le moins) qui dépendent du contrat que l’on a avec EDF.

En conséquence, tout ballon d’eau chaude qui se respecte n’est pas branché directement au réseau mais derrière un appareil qui détecte la “porteuse” envoyée par EDF sur le réseau du client pour permettre d’alimenter en particulier les chauffe-eaux uniquement durant les plages “creuses”. Ce faisant, le principe du ballon d’eau chaude est qu’il chauffe autant que possible durant ces pages “creuses” (il est de base équipé d’un thermostat) et pas du tout en dehors.

Par ailleurs un ballon d’eau chaude est aussi muni d’un dispositif permettant de limiter la température maximum de l’eau dans le ballon (en général le minimum est réglable jusqu’à 50 °C ce qui est judicieux pour éviter les brûlures si il y a de jeunes enfants). Réduire à 50°C la température maximum de l’eau dans le ballon permet d’en prolonger la vie car moins de tartre se formera à l’intérieur.

En conclusion: un ballon d’eau chaude se régule déjà tout seul très bien.

Il n’y a plus de “porteuse” sur les réseaux qui sont passés au Linky. Mais on a toujours la ligne “télé-information” sur le compteur, qui permet de savoir si on est en heures creuses ou pleines. Attention pour décoder les infos sur cette ligne, il y a maintenant un protocole “ancien” qui émule les anciens compteurs et un protocole “nouveau” qui donne beaucoup plus d’informations.

J’ai un compteur linky ET je reçois ET utilise la “porteuse”.

1 Like

Probablement parce qu’il reste encore d’anciens compteurs dans votre coin :slight_smile:

1 Like

Bien sûr le voici.
ECS.ino (873 Bytes)

Pas de soucis , j’ai un ballon a eau glycolée et un échangeur à plaque pour la production instantané d’eau chaude :wink: