Page 2 sur 2

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

Posté : lun. 31 déc. 2018 13:52
par chacal1985
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.

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

Posté : lun. 31 déc. 2018 14:22
par piman33
IMG_20180920_063543_2.png
IMG_20180920_063543_2.png (490.71 Kio) Vu 8903 fois
oui j ai bien avancé reste a affiné le scetch
je posterai mon travail dans la semaine ;)

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

Posté : mar. 1 janv. 2019 13:50
par chacal1985
Ok, super ton système.
Tu pourras le détailler pour savoir le matériel utilisé ?

Merci

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

Posté : mar. 1 janv. 2019 19:24
par piman33
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();
      }
}

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

Posté : mar. 1 janv. 2019 19:29
par piman33
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 8892 fois

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

Posté : mar. 1 janv. 2019 19:52
par piman33
ca fait plus propre qu une planche a pain :)
IMG_20190101_193742333.png
IMG_20190101_193742333.png (238.26 Kio) Vu 8892 fois

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

Posté : mer. 2 janv. 2019 09:42
par chacal1985
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 )

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

Posté : mer. 2 janv. 2019 12:01
par piman33
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

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

Posté : mer. 2 janv. 2019 12:56
par chacal1985
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.

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

Posté : mer. 2 janv. 2019 13:32
par piman33
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