Pilotage d'un capteur solaire pour piscine

Bonjour à tous,
j’ai appris l’utilisation de l’Arduino grâce à tous vos exemples et cours, merci à tous.
J’ai fait un croquis qui me permet de piloter une pompe de circulation de l’eau de ma piscine dans un capteur solaire de 33 m² que j’ai fabriqué.
Le pilotage réalise :

  • La mise en service de la pompe si la température de mon capteur est supérieure à une Température Haute définie dans le programme ici 40°C
  • L’arrêt de la pompe si la température de mon capteur est inférieure à une Température Basse définie dans le programme ici 36°C
  • La mise en service de la pompe si la température de mon capteur est inférieure à une Température Gel définie dans le programme ici 2°C
    L’ensemble fonctionne bien depuis 5 ans et mon écran LCD 16*2 type 1602 à claquer, je l’ai remplacé par un écran identique mais en I2C.
    Là j’ai le même problème que beaucoup d’entre vous, l’ensemble fonctionne très bien tant que l’alimentation 12V de commande du relais n’est pas alimentée.
    Dès que je met l’alimentation 12V le programme se bloque et l’écran soit affiche n’importe quoi soit reste bleu sombre bien que je n’ai branché aucune charge sur les sorties 240V du relais.
    Je pense avoir des problème de parasites comme j’ai lu sur plusieurs topics mais je ne suis pas électronicien et je ne sais pas résoudre mon problème.
    J’utilise une carte Arduino Uno REV3
    Merci par avance pour votre aide.
    Je me permet de vous joindre :
  • mon schéma électronique (d’un mécanicien :}) en retraite)
  • mon schéma d’implantation des composants sur un circuit imprimé
  • mon code source du croquis si cela peut servir à d’autres
// Déclarer les bibliothèques spéciales
#include <Wire.h>
#include<LiquidCrystal_I2C.h> // bibliothèque LCD - I2C

// Régler l'adressage de l'écran LCD
LiquidCrystal_I2C lcd(0x27,16,2);

// Écrire le code du SETUP, exécuter qu’une seule fois
void setup() {
  lcd.init(); // Initialisation de l'écran LCD
  Serial.begin(9600); // Réglage de la sortie série à 9600 bauts pour communiquer avec le moniteur du portable
  pinMode(2,OUTPUT); // Définition de la broche digital D2 en mode sortie utilisée pour piloter le relais de puissance de la pompe
}

// Déclaration des constantes
float U5V = 5.0; // Alimentation des thermistances Capteur et Piscine
float RC = 10000.0; // Résistance de la thermistance Capteur
float RP = 10000.0; // Résistance de la thermistance Piscine
int FT = 0;  // Sens de variation de la température capteur FT=0 T augmente FT=1 T diminue
int GEL = 0;  // Fonctionnement lors de gel capteur GEL=0 pas de gel GEL=1 capteur en sécurité
float T_H = 40.0;  // Température haute capteur où la pompe se met en marche
float T_B = 36.0;  // Température basse capteur où la pompe se coupe
float T_CM = 0.0;  // Température Capteur Maximale
float T_CMini = 100.0;  // Température Capteur Minimale
float T_G = 2.0;  // Température de gel capteur, la pompe se met en marche continue par sécurité

// Déclaration des constantes Steinhart de la sonde CTN 10K Capteur
float AC = 1.133618908E-3;
float BC = 2.333942596E-4;
float CC = 0.9056118493E-7;

// Déclaration des constantes Steinhart de la sonde CTN 10K Piscine
float AP = 1.022798253E-3;
float BP = 2.530888021E-4;
float CP = 0.002511372037E-7;

// Écrire le code Programme, exécuter en boucle infinie
void loop() {
   lcd.backlight(); // Activer le rétro éclairage
  int TSCA = analogRead(A0);  // TempSondeCapteurAnalogique (Lire en nombre entier la tension Analogique broche A0 de la sonde Capteur)
  float TSCV = TSCA * (5.0 / 1023.0);  // TempSondeCapteurVolt (Convertir cette valeur (de 0 - 1023) en volt (de 0 - 5V))
  float TSCR = (TSCV*RC)/(U5V-TSCV);  // TempSondeCapteurOhm (calcul de la résistance en Ohm de la sonde Capteur)
  float TSCK = AC + (BC*log(TSCR)) + (CC*pow(log(TSCR),3));  // TempSondeCapteurKelvin (calcul de la température en degré Kelvin de la sonde Capteur)
  float TSCC = (1/TSCK) - 273.15;  // TempSondeCapteurCelsius (calcul de la température en degré Celsius de la sonde Capteur)

// CDT1 Passage de Temp Basse en phase descendante de la température
  if(FT == 1 && TSCC < T_B){  // SI Temp Capteur diminue ET est inf à Temp Basse alors coupure du moteur sur sortie D2
    digitalWrite(2,LOW);
    FT = 0;
    }

// CDT2 Passage entre Temp basse et Temp Haute en phase montante de la température
  if(FT == 0 && TSCC > T_B){ // SI Temp Capteur augmente ET est sup à Temp Basse alors coupure du moteur sur sortie D2
    digitalWrite(2,LOW);
    FT = 0;
    } 

// CDT3 Capteur dont la température est supérieure à Temp Haute
  if(FT == 1 || TSCC > T_H){   // SI Temp Capteur diminue OU est sup à Temp Haute alors marche du moteur sur sortie D2
    digitalWrite(2,HIGH);
    FT = 1; // Gestion du sens d'évolution de la température
    }

 // CDT4 Mise en marche en continue de la pompe si risque de gel 
  while(TSCC < T_G) { // TANT QUE Temp Capteur inf à Temp Gel alors
    digitalWrite(2,HIGH); //  marche du moteur sur sortie D2
    int TSCA = analogRead(A0);
    float TSCV = TSCA * (5.0 / 1023.0);
    float TSCR = (TSCV*RC)/(U5V-TSCV);
    float TSCK = AC + (BC*log(TSCR)) + (CC*pow(log(TSCR),3));
    TSCC = (1/TSCK) - 273.15;
    GEL = 1;  // Capteur en mode sécurité
    int TSPA = analogRead(A1);
    float TSPV = TSPA * (5.0 / 1023.0);
    float TSPR = (TSPV*RP)/(U5V-TSPV);
    float TSPK = AP + (BP*log(TSPR)) + (CC*pow(log(TSPR),3));
    float TSPC = (1/TSPK) - 273.15;
    lcd.home();  // Positionne le curseur en colonne 0 et ligne 0 coin haut gauche
    lcd.print("T Capteur ="); // Affichage du texte T Capteur =
    lcd.setCursor(11,0);  // Positionne le curseur colonne 12(11+1) et ligne 1 (0+1)
    lcd.print(TSCC,1);  // Ecrit la variable TSCC
    lcd.setCursor(15,0);  // Positionne le curseur colonne 16(15+1) et ligne 1 (0+1)
    lcd.print("C");  // Ecrit le texte C
    lcd.setCursor(0,1);
    lcd.print("T Piscine =");
    lcd.setCursor(11,1);
    lcd.print(TSPC,1);
    lcd.setCursor(15,1);
    lcd.print("C");
    }

// Gestion de sortie de la phase gel
    if(GEL == 1){  // SI le programme sort du mode sécurité
    digitalWrite(2,LOW);  // Arrêt pompe
    GEL = 0; // Réinitialisation de la variable GEL
    FT = 0;  // Réinitialisation de la variable FT (Gestion du sens d'évolution de la température)
    }

// Gestion de l'affichage de la température Capteur et Piscine
  int TSPA = analogRead(A1); // TempSondePiscineAnalogique (Lire en nombre entier la tension Analogique broche A1 de la sonde Piscine)
  float TSPV = TSPA * (5.0 / 1023.0); // TempSondePiscineVolt (Convertir cette valeur (de 0 - 1023) en volt (de 0 - 5V))
  float TSPR = (TSPV*RP)/(U5V-TSPV);  // TempSondePiscineOhm (calcul de la résistance en Ohm de la sonde Piscine)
  float TSPK = AP + (BP*log(TSPR)) + (CP*pow(log(TSPR),3)); // TempSondePiscineKelvin (calcul de la température en degré Kelvin de la sonde Piscine)
  float TSPC = (1/TSPK) - 273.15;  // TempSondePiscineCelsius (calcul de la température en degré Celsius de la sonde Piscine)
  lcd.home();
  lcd.print("T Capteur =");
  lcd.setCursor(11,0);
  lcd.print(TSCC,1);
  lcd.setCursor(15,0);
  lcd.print("C");
  lcd.setCursor(0,1);
  lcd.print("T Piscine =");
  lcd.setCursor(11,1);
  lcd.print(TSPC,1);
  lcd.setCursor(15,1);
  lcd.print("C");

  delay(2000);  // Temporisation de 2000 millisecondes soit 2 s

// Gestion de l'affichage de la température maximale du Capteur
  if(T_CM < TSCC) {
    T_CM = TSCC;
    }
  lcd.home();
  lcd.print("T Capteur =");
  lcd.setCursor(11,0);
  lcd.print(TSCC,1);
  lcd.setCursor(15,0);
  lcd.print("C");
  lcd.setCursor(0,1);
  lcd.print("T Cap Max =");
  lcd.setCursor(11,1);
  lcd.print(T_CM,1);
  lcd.setCursor(15,1);
  lcd.print("C");

  delay(2000);

// Gestion de l'affichage de la température minimale du Capteur
  if(T_CMini > TSCC) {
    T_CMini = TSCC;
    }
  lcd.home();
  lcd.print("T Capteur =");
  lcd.setCursor(11,0);
  lcd.print(TSCC,1);
  lcd.setCursor(15,0);
  lcd.print("C");
  lcd.setCursor(0,1);
  lcd.print("T Cap Min =");
  lcd.setCursor(11,1);
  lcd.print(T_CMini,1);
  lcd.setCursor(15,1);
  lcd.print("C");

Serial.println(" Fin programme ");
  delay(2000);
  
  }

Schéma électronique V2.pdf (57.3 KB)

Circuit électronique V2.pdf (36.8 KB)

Bonjour

votre montage


(fait froid dans la piscine en ce moment !!)

Merci pour le partage, ce serait bien mieux dans les projets finis !
(avec une petite photo des 33 m² en plus !! :slight_smile: )

demandez éventuellement au modérateur de déplacer le post

Bonjour JML,

Dès que ce problème d’affichage qui me bloque le programme est réglé je le mets dans les projets finis. Mon système fonctionne bien mais sans affichage ce qui me gêne beaucoup car je ne peux pas contrôler ce qui se passe au niveau du capteur solaire, il ne doit pas dépasser 60°C sinon j’ai des risques que mes tubes fondent (33 tubes en parallèle de 30 m de long) ce serait dommage :(.

Tout a été fait de nos mains avec l’aide de mes 4 enfants. Généralement début mai la piscine (couverte) est à 28°C et monte vers 32°C en plein été, on se baigne jusque vers fin octobre pour la plus grande joie de nos enfants et petits enfants vive le capteur et sa gestion hum!! Je vous une photo du capteur.

Dans l’attente de votre aide, merci par avance,

vos fils pour SCL et SDA de l'afficheur I2C sont vraiment bien longs - ça fait de jolies antennes :slight_smile: (en I2C la fréquence de base est 100 kHz et on peut aller à 400 kHz)

Essayez de tester en mettant l'écran directement très proche de l'arduino (genre à 5cm avec des fils courts)

Si ça résout le souci:

  • Raccourcir les fils au maximum, notamment entre l'arduino et la carte perforée qui sont sans doute fixés
  • entre la carte et l'écran, entortillez le fil GND qui va aussi au LCD autour des signaux SCL et SDA
  • mettre deux résistances de PULLUP vers 5V de 4.7kΩ (une pour chaque ligne) sur votre carte perforée

On dirait aussi que les 5V et 12V sont plus ou moins proches sur votre carte perforée, dans l'absolu ce serait bien de faire deux étages bien séparés

Bonjour JML,

Je vous remercie de votre aide je vais dès demain modifier mon circuit en prenant en compte toutes vos remarques.

Je vous tiens au courant des résultats en croisant les doigts; La mécanique de base est plus simple ça marche ou sa casse et l'électronique est bien plus délicate :))

Merci et bonne soirée,

Bonjour JML

Merci infiniment pour votre aide tout fonctionne OUF !!!

j’ai appliqué vos recommandations :

  • Fils le plus court possibles pour le LCD (j’ai changé la position de l’écran) et de tous les autres connections Arduino-Carte perforée,
  • Entourer les fils SCL et SDA avec le fil GND de l’écran LCD (voir photo),
  • Connexion directement sur l’Arduino des connections de l’écran LCD (sauf le +5V).
    Je n’ai pas installé les résistances PULLUP car je ne les ai pas en stock, si elles sont vraiment indispensables je modifierai la carte.
    Comment demander au modérateur de passer ce Topic dans la rubrique projet fini, il faut que je complète avec les plans de câblage modifiés ?
    Encore merci et bonne soirée.

la photo

pourquoi démarrer seulement la circulation au delà de 40° ? c'est dommage, tu perds des calories, un différentiel avec l'eau de la piscine serait il me semble plus performant.