Régulation de pompe par température d'eau de piscine

Bonjour, à tous.
Voilà un petit moment que je travailles sur une régulation
J’ai une piscine autoportante et voulant la réchauffer, j’ai trouvé ceci http://forum.allinbox.com/aspectgeek/Environnement-consommation-Energies-nouvelles-et-recyclage/Chauffage/chauffage-solaire-piscine-sujet_40_1.htm.
Je n’ai pas encore fait la partie matériel mais j’ai commencé la partie régulation.
Avec une carte arduino, un Lcd 16*2, 3 sondes ds18b20, un rtc, un relai et une pompe 24 volts. dc50d-2465s
L’idée la pompe envoie de l’eau de la piscine vers le réchauffeur
-prise de la température d’entrée (in)
-prise de la température en sortie du réchauffeur (OUt)

si la température de sortie est inférieur à la température d’entrée + 1 alors arrêt de la pompe.
si la température de sortie est supérieur à la température d’entrée + 2 alors démarrage de la pompe.
et modulation du PWM de la pompe pour avoir un débit le plus faible possible.

la troisième sonde de température me sert à connaitre la température extérieur.
avec les boutons de l’écran, je change la température maxi et le régime mini de la pompe.

Voilà, je n’ai rien à vous demander ou à vous vendre, je suis là pour partager ( mon code n’est certe pas beau mais je ne sais pas faire mieux.)

Bonne journée.

Guigui76

#include <LiquidCrystal.h>/
#include <OneWire.h>
#include <DallasTemperature.h>
#include <RTClib.h>
#include <Wire.h>
RTC_DS1307 RTC;

int Tmax= 45; // temperature à laquelle la pompe sera à 100% de régime
int Fmin=(115*0.3921);// régime de minimum de la pompe
LiquidCrystal lcd(8,9,4,5,6,7);//initialiser la bibliothèque avec les numéros des broches d'interface
const int relais=A12; // Pin du relai
int pinA = 13; //pin 13 utilisé pour le PWM
int demarrage = 0;

#define ONE_WIRE_BUS A4 // pin utilisé pour les sondes de température

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// adresse des sondes de Temperature. 
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { 0x28, 0x04, 0x5A, 0x11, 0x05, 0x00, 0x00, 0x68 };// adresse du capteur
DeviceAddress outsideThermometer = { 0x28, 0xF2, 0x7A, 0x11, 0x05, 0x00, 0x00, 0x50 };// adresse du capteur
DeviceAddress airsideThermometer = { 0x28, 0x91, 0xE8, 0xF8, 0x03, 0x00, 0x00, 0xF5 };// adresse du capteur
  
float Fan1Max=255; // régimme maximum de la pompe
  
 //bouton
int currentMenuItem = 0;
int lastState = 0;

void setup()
{
 
  lcd.begin(16, 2);//déclaration du type d'écran utilisé
  Wire.begin();
  pinMode(relais, OUTPUT);// pin relai en sortie
  pinMode(pinA,OUTPUT);// pin pwm en sortie
  RTC.begin();
   if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    
} 
     
  sensors.begin();
//format des valeurs de températures (XXXXXXXXXX,2) pour deux chiffres après la virgules
sensors.setResolution(insideThermometer, 10);
sensors.setResolution(outsideThermometer, 10);
sensors.setResolution(airsideThermometer, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("Err");// si la sonde temperature n'est pas détecté alors message d'erreur
} else {
lcd.print(tempC,2); //le chiffre donne le nbre de apres la virgule
}
}

void loop()  
{ 
 mainMenu();
  float Temp1Max=Tmax;  
  float Fan1Min= (Fmin/0.3921);   // PWM is between 40 and 255 for that fan (8 bit pwm)
  sensors.requestTemperatures(); // Send the command to get temperatures
  float in=sensors.getTempC(insideThermometer);
  float out=sensors.getTempC(outsideThermometer);
  float K1=(Fan1Max-Fan1Min)/(Temp1Max-in);
  float T1 = sensors.getTempC(outsideThermometer);  // lecture de la température de sortie
  
  
  DateTime now = RTC.now();
   lcd.setCursor(0,0);
    lcd.print (now.hour(),DEC);
     lcd.print(":");
      lcd.print(now.minute(), DEC);

  lcd.setCursor(0, 1);
   lcd.print("E");
    lcd.setCursor(2, 1);
     printTemperature(insideThermometer); // température d'entrée
    
  lcd.setCursor(8, 1);
   lcd.print("S");
    lcd.setCursor(10, 1);
     printTemperature(outsideThermometer); // température de sortie
 
 if ((now.hour() >= 9) &(now.hour() <= 21)) // si l'heure est comprise entre 9 et 21 heures faire sinon attente
   {    

   if (T1 < in) 
      T1 = in;
      
   float Pwm1=((T1-in)*K1)+Fan1Min;   
      
      if (in + 1 >= out) //si la température d'entrée + 1 dégré est supérieur à la température de sortie arrêt de la pompe
   {
     digitalWrite (relais, LOW);
     lcd.setCursor(5, 0);
       lcd.print("             ");
     demarrage = 0;
      lcd.setCursor(11, 0);
       lcd.print("arret");
   }
      if (demarrage ==1)// si démarrage est =1 faire ceci
      {
        digitalWrite (relais, HIGH);
      lcd.setCursor(12, 0);
       lcd.print(Pwm1* 0.3921,0); // un point pwm donne 0.39% de fonctionnement
  
      lcd.setCursor(15, 0);
       lcd.print("%");
       
   lcd.setCursor(6,0);
      lcd.print(Tmax);
      lcd.setCursor(9,0);
      lcd.print(Fmin);
      
    
      analogWrite(pinA, Pwm1 );// Assign pwm
    }
     else if ((in +2 < out) & (demarrage ==0)) //si la température d'entrée + 2 dégré est inférieur à la température de sortie et que démarrage=0 , démmarer la pompe avec un pwm 125 pendant 3 secondes
     {   
     lcd.setCursor(7,0);
     digitalWrite (relais, HIGH);
      lcd.print("Demarrage");
     analogWrite(pinA, 125 );// Implusion pour le démarrage
     demarrage = 1 ; // mets à 1 le compteur de démarrage 
     delay(3000); // delay pour avoir un progression
     lcd.setCursor(6,0);
       lcd.print("           ");// effacement d'une partie de l'écran      
      }
          
  else 
    demarrage = 0;
 
  
}}
void mainMenu() {
  //State = 0 every loop cycle.
  int state = 0;
  //Refresh the button pressed.
  int x = analogRead (0);
  //Set the Row 0, Col 0 position.
  lcd.setCursor(0,0);


if (x < 40) {// si appuie sur la touche rigth augmenter fmin de 1 point
    //Right
    Fmin= Fmin+1;
     lcd.setCursor(9,0);
      lcd.print(Fmin);
       
  } else if (x < 250) {// si appuie sur la touche up augmenter tmax de 1 point
   //Up
    state = 1;
     Tmax=(Tmax+ 1);
      lcd.setCursor(6,0);
      lcd.print(Tmax);
          
  } else if (x < 450){// si appuie sur la touche down diminuer tmax de 1 point
   //Down  
    state = 2;
     Tmax=Tmax- 1;
     lcd.setCursor(6,0);
      lcd.print(Tmax);
            
  } else if (x < 650){// si appuie sur la touche left diminuer fmin de 1 point
    //Left
   Fmin= Fmin-1;
   lcd.setCursor(6,0);
     lcd.setCursor(9,0);
      lcd.print(Fmin);
   
  } else if (x < 850){// si appuie sur la touche select faire une impulsion de la pompe pendant 10 secondes
    //Select
    state = 3;
     digitalWrite (relais, HIGH);
    lcd.setCursor(6,0);
       lcd.print("Forcage");
      
     analogWrite(pinA, 125 );// Implusion pour le démarrage
      delay(10000);
      lcd.clear();
    
  }
}

Possible de voir des photos de la réalisation?

ça m’intéresse :grin:

Pour les miennes voir ici:
http://johnlenfr.1s.fr/index.php?option=com_content&view=section&layout=blog&id=18&Itemid=81

:wink:

Mes remarques:

Je ne suis pas sur qu ela condition:

if ((now.hour() >= 9) &(now.hour() <= 21))

fonctionne.
Car il n’y a qu’un seul & et non &&.
http://arduino.cc/en/Reference/Boolean

Pour ne pas bloquer ton programme et notamment l’affichage, la détection des boutons et le lancement de la pompe tu peux utiliser millis() qui permet de lancer des action sans attendre un “delay” défini:

Hello , pour la puissance moteur je suis passé par un mofset P16NF06: Exemple d'utilisation. http://arduino103.blogspot.fr/2012/07/commande-moteur-avec-transitor-mosfet.html

Après le reste est ordinaire, j'attends toujours de trouver une solution pour ranger l'ensemble.

Une sonde de température avec son accord en T http://cjoint.com/14av/DDBlKIRLPjZ.htm

L'ensemble. http://cjoint.com/14av/DDBlN4qYWzL.htm

Ecran pompe à l'arrêt. http://cjoint.com/14av/DDBlRULwGug.htm

Ecran démarrage de la pompe. http://cjoint.com/14av/DDBlTtoS6Tc.htm

Ecran pompe en service. http://cjoint.com/14av/DDBlUs9WzID.htm

les fichiers de l'ensemble du projet

http://www.cjoint.com/confirm.php?cjoint=DDBmsALeauS