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