Régulation de pompe à chaleur , possible ou pas ?

Au programme la régulation de température, la climatisation, les chauffe-eau...

Modérateur : Francois

chacal1985
Messages : 8
Enregistré le : mar. 1 sept. 2015 18:20

Re: Régulation de pompe à chaleur , possible ou pas ?

Message par chacal1985 » lun. 31 déc. 2018 13:52

Bonjour,
Je tombe par hasard sur un sujet que j'avais lancé puis abandonné faute de temps.
Après avoir pris la foudre récemment ma regulpac, est partie en réparation chez le fabricant et elle fonctionne à nouveau mais il reste des séquelles car la page HTML plante au bout de quelques minutes bref pas top.

Avez vous avancé sur le sujet ?

De mon côté un ami va me faire un programme en l'UA pour Domoticz.
On a trouvé la formule pour la loi d'eau.
La partie hardware serait composée d'un Wemos D1 mini, une carte double relais, 2 sondes de température Ds18b20, l'ensemble connecté par wifi à Domoticz.

piman33
Messages : 12
Enregistré le : mer. 1 août 2018 19:04

Re: Régulation de pompe à chaleur , possible ou pas ?

Message par piman33 » lun. 31 déc. 2018 14:22

IMG_20180920_063543_2.png
IMG_20180920_063543_2.png (490.71 Kio) Vu 8865 fois
oui j ai bien avancé reste a affiné le scetch
je posterai mon travail dans la semaine ;)

chacal1985
Messages : 8
Enregistré le : mar. 1 sept. 2015 18:20

Re: Régulation de pompe à chaleur , possible ou pas ?

Message par chacal1985 » mar. 1 janv. 2019 13:50

Ok, super ton système.
Tu pourras le détailler pour savoir le matériel utilisé ?

Merci

piman33
Messages : 12
Enregistré le : mer. 1 août 2018 19:04

Re: Régulation de pompe à chaleur , possible ou pas ?

Message par piman33 » mar. 1 janv. 2019 19:24

voici le code j ai pas testé sur la pac ,il y aura surement des modifications a faire mais je pense que c est déja un bon début
tu peux le mettre sur un esp mais faut modifié les pins

le bouton haut et bas tu navigue dans les différents menus (5 pour le moment)
- accueil affiche les différentes températures
- temperature Ambiance regle la temperature ambiance
-pente
-Hysteresie
-OnOffManuel pour demarrer la pac et le circulateur manuellement

gauche et droite tu change dans les menus
un arduino nano
des ds18b20 pour les sondes de température (départ,retour,extérieur,ambiance)
des relais 2
le pcb j en ai eu pour 11 euros les 11 avec les frais de port

Code : Tout sélectionner

/*  Les formules de calculs sont alors les suivantes : http://blog.elyotherm.fr/2013/08/reglage-optimisation-courbe-de-chauffe.html
La courbe de chauffe peut se définir ensuite par :

Pente = (T°eau de retour - T°ambiante) / (T°ambiante - T°extérieure)
T°eau de retour = (T°ambiante + T°extérieure) × pente + T° ambiante
*/

// --- librairies ---
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>

////////////////////////////////////////////////////////////////////////entrées et sorties //////////////////////////////////////////////////////////////////////
#define ONE_WIRE_BUS        12          //sonde temperature ds18b20
#define RELAIS_pac          5           // Broche utilisée pour Relais 
#define RELAIS_circulateur  6           // Broche utilisée pour Relais
#define LED_pin13          13           // pin 13 led controle on/off pac
#define butUp               4           //bouton up digital 4
#define butDroit            9           //bouton gauche digital 9
#define butDown            11           //bouton down digital 11
#define butGauche          10           //bouton droit digital 10
// i2C lcd                 A4           //lcd i2c 4 lignes
//i2c  lcd                 A5           //lcd i2c 4 lignes

// --- Hardware do LCD ---
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// --- variable  -------------------------------------------------------
    char menu = 0x01;                                     //variable pour selectionner le menu
    char set1 = 0x00, set2 = 0x00;                        //etat 1 et etat 2
    boolean t_butUp, t_butDown, t_butDroit, t_butGauche;  //etats des boutons
   
    float pente = 0.20 ;
    float ValPente ;
    float TempConsigne = 60;
    float temp_retour;
    int temp_retour_preco;
    float temp_depart;
    float temp_ext;
    float temperature_ambiance = 21; // temperature d ambiance souhaiter
    int parallele = 0;
    int etat_PAC = 0;
    float hysteresie = 3;
    float ValeurHysteresie ;
    float tempMini ;  //
    float tempMaxi ;  //
   //float  pas01 =0.1 ;
    float A ;
    int B ;   
   
    
// --- fonction divers----------------------------------------------------------
void changeMenu();                  //fonction qui change le menu            
void dispMenu();                    //fonction qui affiche le menu
void accueil();                     //fonction accueil
void reglagePente();                //fonction reglage de la pente
void reglageHysteresie();           
void temperatureAmbiance();
void OnOffManuel();
void PacOn();
void PacOff();
void calculTempEau();
void demarageAuto();

OneWire oneWire(ONE_WIRE_BUS);// Setup a oneWire instance to communicate with any OneWire device
DallasTemperature sensors(&oneWire);
DeviceAddress TEMP_int = { 0x28, 0x40, 0x83, 0xCC, 0x04, 0x00, 0x00, 0x5B };   
DeviceAddress TEMP_ext = { 0x28, 0xFF, 0xA4, 0x39, 0xB0, 0x15, 0x03, 0xF2 };  
DeviceAddress TEMP_retour = { 0x28, 0xFF, 0x95, 0x35, 0xA2, 0x15, 0x03, 0xAC };
DeviceAddress TEMP_depart = { 0x28, 0xFF, 0x3D, 0x34, 0xA2, 0x15, 0x03, 0x2E };

char ValTEMP_int = TEMP_int ;                                                 
char ValTEMP_ext = TEMP_ext ;

// --- fonction setup ---
void setup(){
  lcd.begin(20,6);                         //initialisation LCD 20 x 4
  lcd.setBacklight(HIGH);
  lcd.clear(); // start with a blank screen
sensors.setResolution(TEMP_int, 10);
//sensors.setResolution(TEMP_ext, 10);
sensors.setResolution(TEMP_retour, 10);
sensors.setResolution(TEMP_depart, 10);

pinMode(RELAIS_pac, OUTPUT);               // declaration relais pac en sortie
pinMode(RELAIS_circulateur, OUTPUT);       // declaration RELAIS_circulateur en sortie
pinMode(LED_pin13, OUTPUT);                // declaration LED_pin13 en sortie
pinMode(butUp,INPUT_PULLUP);               // declaration bouton en entrée
pinMode(butDroit,INPUT_PULLUP);                
pinMode(butDown, INPUT_PULLUP);
pinMode(butGauche, INPUT_PULLUP);

digitalWrite(RELAIS_pac, LOW);
digitalWrite(RELAIS_circulateur, LOW);
digitalWrite(LED_pin13, LOW);

  t_butUp     = 0x00;                                      //nettoie le bouton Up
  t_butDown   = 0x00;                                      //nettoie le bouton Down
  t_butDroit  = 0x00;                                      //nettoie le bouton  P
  t_butGauche = 0x00;                                      //nettoie le bouton

  /* Initialise le port série */
  Serial.begin(115200);
  Serial.println(F("~~ regulPac 1-Wire ~~"));
  lcd.setCursor(0,0);                                 
   lcd.print("-----Regul Pac------");
   lcd.print("******par manu******");
delay(3000);
  
}  // fin de la fonction setup

void printTemperature(DeviceAddress deviceAddress)
{
      float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("Error");
} 
else {
lcd.print(tempC);
}

}
////////////////////////////////////////fonction loop//////////////////////////////////////////////////////////////
void loop()
{
   changeMenu();
   dispMenu();
   calculTempEau();
   demarageAuto();
   
} //end loop

//************************ fonction change menu ***********************************************
void changeMenu()
{                                      
   if(!digitalRead(butUp))   t_butUp   = 0x01;         
   if(!digitalRead(butDown)) t_butDown = 0x01;        
      
   if(digitalRead(butUp) && t_butUp)                   
   {                                                    
      t_butUp = 0x00;                                  
      
      lcd.clear();                                   
      menu++;                                          
      
      if(menu > 0x05) menu = 0x01;                      //si le menu est superieur a 5 retour a menu1
   
   } //fin 
   
   if(digitalRead(butDown) && t_butDown)                //si bouton down appuyer 
   {                                                    
      t_butDown = 0x00;                                
      
      lcd.clear();                                     
      menu--;                                           // menu -
      
      if(menu < 0x01) menu = 0x05;                      //si le menu est inferieur a 1 menu retourne a 5
   
   } //fin butDown   

} //fin changeMenu

//************************ fonction affiche qui menu ***********************************************
void dispMenu()                                         
{
    switch(menu)                                        
    {
       case 0x01:                                       
             accueil();
             break;
                                                  
       case 0x02:                                      
             temperatureAmbiance();                             
             break;
                                                  
       case 0x03:                                       
             reglagePente();
             break;
                                                 
       case 0x04:                                       
             reglageHysteresie();                                   
             break;                                     

       case 0x05:
             OnOffManuel();                                   
             break;
             
    } //fin switch menu

} //fin dispMenu

//************************ fonction ecran accueil ***********************************************
void accueil()       
{
   sensors.requestTemperatures();
   lcd.setCursor(0,0);                                 
   lcd.print("-----Regul Pac------");
   
   lcd.setCursor(0,1);                                 
   lcd.print("mini<<<<");
   lcd.print(A);
  // printTemperature(TEMP_ext);                        // temp_retour_preco         
   lcd.print(">>>>max");
   
   lcd.setCursor(0,2);                                 
   lcd.print("Ext=");
   printTemperature(TEMP_ext);                                 
   lcd.print("  Amb=");
   printTemperature(TEMP_int);
   
   lcd.setCursor(0,3);                                 
   lcd.print("Dep=");                           
   printTemperature(TEMP_depart);                                                       
   lcd.print("  Ret=");
   printTemperature(TEMP_retour);

} //fin ecran accueil

//************************ fonction reglage pente *********************************************** 

void reglagePente()                                           
{
   lcd.setCursor(0,0);                                 
   lcd.print("Reglage de la Pente ");
   lcd.setCursor(0,1);
   lcd.print("--------------------"); 
   lcd.setCursor(0,2);                                 
   lcd.print(" Plus"); 
   lcd.print("          Moins");                      
  lcd.setCursor(8,3);
  lcd.print(pente);

   if(!digitalRead(butDroit))    t_butDroit    = 0x01;          
   if(!digitalRead(butGauche))    t_butGauche    = 0x01;
   if(pente < 0.05) pente = 0.60;
   if(pente > 0.60) pente = 0.05; 
                                                               
   
   if(digitalRead(butDroit) && t_butDroit)                      
   {                                                   
      t_butDroit = 0x00;                                   
      
    pente = pente +0.02 ;
   } 
   
   if(digitalRead(butGauche) && t_butGauche)                      
   {                                                    
      t_butGauche = 0x00;                                    
      
    pente = pente -0.02 ;
   }
} 

//************************ fonction reglage Hysteresie ***********************************************
void reglageHysteresie()                                          
{
   lcd.setCursor(0,0);                                 
   lcd.print("*****Hysteresie*****");
   lcd.setCursor(0,1);
   lcd.print("--------------------"); 
   lcd.setCursor(0,2);                                 
   lcd.print(" Plus"); 
   lcd.print("          Moins");
   lcd.setCursor(8,3);                                    
   lcd.print(hysteresie);

   if(!digitalRead(butDroit))    t_butDroit    = 0x01;          
   if(!digitalRead(butGauche))    t_butGauche    = 0x01;
   if(hysteresie < 0.2) hysteresie = 5;
   if(hysteresie > 5) hysteresie = 0.2; 
                                                               
   
   if(digitalRead(butDroit) && t_butDroit)                      
   {                                                   
      t_butDroit = 0x00;                                   
      
     hysteresie = hysteresie +0.2 ;
   } 
   
   if(digitalRead(butGauche) && t_butGauche)                      
   {                                                    
      t_butGauche = 0x00;                                    
      
      hysteresie = hysteresie -0.2 ;
   }
} 
//************************ fonction reglage temperature consigne ***********************************************

void temperatureAmbiance()                                           
{
   lcd.setCursor(0,0);                                 
   lcd.print("****Temp Ambiance***");
   lcd.setCursor(0,1);
   lcd.print("--------------------"); 
   lcd.setCursor(0,2);                                 
   lcd.print(" Plus"); 
   lcd.print("          Moins");
   lcd.setCursor(8,3);                                    
   lcd.print(temperature_ambiance);                    
  
   if(!digitalRead(butDroit))    t_butDroit    = 0x01;          
   if(!digitalRead(butGauche))    t_butGauche    = 0x01;
   if(temperature_ambiance < 19) temperature_ambiance = 23;
   if(temperature_ambiance > 23) temperature_ambiance = 19; 
                                                               
   
   if(digitalRead(butDroit) && t_butDroit)                      
   {                                                   
      t_butDroit = 0x00;                                   
      
      temperature_ambiance = temperature_ambiance +0.1;
   } 
   
   if(digitalRead(butGauche) && t_butGauche)                      
   {                                                    
      t_butGauche = 0x00;                                    
      
      temperature_ambiance = temperature_ambiance -0.1;
   } 
} 

//************************ fonction PAC on/off manuel ***********************************************
void OnOffManuel()                                           
{
   lcd.setCursor(0,0);                                 
   lcd.print("****Controle PAC****");
   lcd.setCursor(0,1);
   lcd.print("--------------------"); 
   lcd.setCursor(0,2);                                 
   lcd.print(" CIRCU"); 
   lcd.print("          PAC");                    
  
   if(!digitalRead(butDroit))    t_butDroit    = 0x01;          
   if(!digitalRead(butGauche))    t_butGauche    = 0x01;         
   
   if(digitalRead(butDroit) && t_butDroit)                     
   {                                                    
      t_butDroit = 0x00;                                    
      
      set1++;                                          
      
      if(set1 > 2) set1 = 0x01;                         
      
      switch(set1)                                      
      {
          case 0x01:                                    
                lcd.setCursor(10,3);                    
                lcd.print("      ON  ");                   
                digitalWrite(RELAIS_pac, HIGH);
                break;                                  
          case 0x02:                                   
                lcd.setCursor(10,3);                    
                lcd.print("      OFF");                   
                digitalWrite(RELAIS_pac, LOW);
                break;                                  
      
      }
   
   } 
   
   if(digitalRead(butGauche) && t_butGauche)                      
   {                                                   
      t_butGauche = 0x00;                                   
      
      set2++;                                           
      
      if(set2 > 2) set2 = 0x01;                         
      
      switch(set2)                                     
      {
          case 0x01:                                    
                lcd.setCursor(0,3);                    
                lcd.print("  ON ");                   
                digitalWrite(RELAIS_circulateur, HIGH);
                break;                                  
          case 0x02:                                    
                lcd.setCursor(0,3);                    
                lcd.print("  OFF");                  
                digitalWrite(RELAIS_circulateur, LOW);
                break;                                  
      
      }
   
   } 
}
//************************ fonction PAC on ***********************************************
void PacOn() 
{                                                      
   lcd.setCursor(0,3);                                              
   lcd.print("                 On ");
digitalWrite(RELAIS_pac, HIGH);
digitalWrite(RELAIS_circulateur, HIGH);
digitalWrite(LED_pin13, HIGH);
  etat_PAC = 1;
}
//************************ fonction PAC off ***********************************************
void PacOff() 
{ 
   lcd.setCursor(0,3);                                 
   lcd.print("                 On ");
digitalWrite(RELAIS_pac, LOW);
digitalWrite(RELAIS_circulateur, LOW);
digitalWrite(LED_pin13, LOW);
  etat_PAC = 0;
} 
  //************************ fonction calcul temperature retour eau ***********************************************
void calculTempEau() 
{
temp_ext = sensors.getTempC(TEMP_ext);
                                                                                        
     if(TEMP_ext > 0 )
     {
      A=((temperature_ambiance-(temp_ext))*pente)+temperature_ambiance;      // T° eau= (T°ambiante + T°extérieure) × pente + T° ambiante  
     
      temp_retour_preco = A + parallele ;
          Serial.print("temperature retour a atteindre= ");
          Serial.print("temperature positive= ");
          Serial.println(A);
          Serial.println(temp_retour_preco);
     }
    else                                                                                  // formule si temp  negatif
     {
          A=((temperature_ambiance+(temp_ext))*pente)+temperature_ambiance;      // T° eau= (T°ambiante + T°extérieure) × pente + T° ambiante  
  
      temp_retour_preco = A + parallele ;
          Serial.print("temperature retour a atteindre= ");
          Serial.print("temperature negative= ");
          Serial.println(A);
          Serial.println(temp_retour_preco);
     }
}

void demarageAuto()
{
temp_retour = sensors.getTempC(TEMP_retour);
      if (temp_retour > A+hysteresie/2)
      {
  void PacOff();
      }
      if (temp_retour < A-hysteresie/2)
      {
  void PacOn();
      }
}

piman33
Messages : 12
Enregistré le : mer. 1 août 2018 19:04

Re: Régulation de pompe à chaleur , possible ou pas ?

Message par piman33 » mar. 1 janv. 2019 19:29

j ai domoticz installer sur un pi3 mais connais pas grand chose en Lua :(
si tu veux pour ton pi 3 j ai dessiner ca sur fritzing ca fais plus propre
tu as des entrées avec resistance pull... et sortie
-entrée 1-wire
-pour un compteur d eau detecteur de fuite
-pour la teleinfo
Le fichier joint Capture22222.PNG n’est plus disponible.
Capture22222.PNG
Capture22222.PNG (347.93 Kio) Vu 8854 fois

piman33
Messages : 12
Enregistré le : mer. 1 août 2018 19:04

Re: Régulation de pompe à chaleur , possible ou pas ?

Message par piman33 » mar. 1 janv. 2019 19:52

ca fait plus propre qu une planche a pain :)
IMG_20190101_193742333.png
IMG_20190101_193742333.png (238.26 Kio) Vu 8854 fois

chacal1985
Messages : 8
Enregistré le : mar. 1 sept. 2015 18:20

Re: Régulation de pompe à chaleur , possible ou pas ?

Message par chacal1985 » mer. 2 janv. 2019 09:42

Merci pour ton travail, tu les fais faire chez qui tes pcb ?

Ensuite je sais pas si la solution du rpi avec Domoticz est la meilleure solution car en cas de plantage de ma box je risque d'avoir des soucis ( car j'aimerai utiliser un Wemos D1 mini ).
Bref à voir la solution finale.
Le top serait d'avoir un système indépendant du fonctionnement de Domoticz mais également pilotable par Domoticz pour l'interface qui est facile d'utilisation ( pour ma femme )

piman33
Messages : 12
Enregistré le : mer. 1 août 2018 19:04

Re: Régulation de pompe à chaleur , possible ou pas ?

Message par piman33 » mer. 2 janv. 2019 12:01

Pour les pcb
https://jlcpcb.com

Je pense qu un wemos D1 mini est une bonne solution
De plus tu peux copier mon code dessus

chacal1985
Messages : 8
Enregistré le : mar. 1 sept. 2015 18:20

Re: Régulation de pompe à chaleur , possible ou pas ?

Message par chacal1985 » mer. 2 janv. 2019 12:56

Le wemos avec espeasy ne peut pas accepter de code il me semble.
Sinon il me faudrait utiliser ton code avec un wemos et trouver une solution pour pouvoir également le contrôler avec Domoticz pour pouvoir mettre en route la PAC à distance et surveiller les températures.

piman33
Messages : 12
Enregistré le : mer. 1 août 2018 19:04

Re: Régulation de pompe à chaleur , possible ou pas ?

Message par piman33 » mer. 2 janv. 2019 13:32

Oui tu peux le contrôler avec un serveur web
Comme https://randomnerdtutorials.com/esp8266-web-server/
Et envoyer des requêtes http a ton serveur depuis domoticz

Répondre

Retourner vers « Gestion de la température »