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();
}
}