Partage de projet de gestion radiateur

Bonsoir,
à près avoir posé plein de question, et avoir eu des réponses
je partage mon projet, si ça peut donner des idées à quelqu un

le matos :
un ulcd32pt
une 2560
un protoshield avec un ds32hz et ds1307
des db18b20
du câble reseau
une carte relais kmtronic

et mon code quasi fini :

#include "proxySerial.h"
#include "Serial_LCD.h"
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DS1307new.h>

// test release
#if SERIAL_LCD_RELEASE < 118
#error required SERIAL_LCD_RELEASE 118
#endif

ProxySerial myPort(&Serial3);

Serial_LCD myLCD( &myPort);

uint8_t aa;

uint16_t startAddr = 0x0000; // Start address to store in the NV-RAM
uint16_t lastAddr; // new address for storing in NV-RAM
uint16_t TimeIsSet = 0xaa55;

//Définition pin de sortie
/*
Digital 5 = relais 1 = Cuisine
Digital 6 = relais 2 = Tom
Digital 4 = relais 3 = Bureau
Digital 3 = relais 4 = Chambre
Digital 2 = relais 5 = SAM
Digital 7 = relais 6 = SAM1
Digital 8 = relais 7 = Entree
Digital 9 = relais 8 = --
*/

int PinCuisine = 5;
int PinTom = 6;
int PinBureau = 4;
int PinChambre = 3;
int PinSalle = 2;
int PinSalle1 = 7;
int PinEntree = 8;

// Définition pin entrée digital Dallas
#define ONE_WIRE_BUS 36

// Définition communication avec tout matériel Onewire
OneWire oneWire(ONE_WIRE_BUS);

// Référence t° Dallas
DallasTemperature sensors(&oneWire);
// uint8_t T1[8] = { 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x }; // Sonde Cuisine
uint8_t T2[8] = { 0x28, 0x4, 0x49, 0xBB, 0x3, 0x0, 0x0, 0x39 }; // Sonde Tom
uint8_t T3[8] = { 0x28, 0x62, 0xEE, 0x74, 0x3, 0x0, 0x0, 0x89 }; // Sonde Bureau
uint8_t T4[8] = { 0x28, 0xDE, 0x2, 0x75, 0x3, 0x0, 0x0, 0x87 }; // Sonde Chambre
uint8_t T5[8] = { 0x28, 0x89, 0x23, 0x63, 0x3, 0x0, 0x0, 0x28 }; // Sonde SAM
// uint8_t T6[8] = { 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x }; // Entree
// uint8_t T8[8] = { 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x }; // Sonde Arduino

// capteur t°
float sensorCuisine;
float sensorTom;
float sensorBureau;
float sensorChambre;
float sensorSalle;
float sensorEntree;
float sensorArduino;
float sensordefault=-127.00;

// Nuit_Jour Temp et delta
float Temp1Nuit=18.00; // cuisine
float Temp1Jour=20.00;
float Temp2Nuit=18.00; // Tom
float Temp2Jour=20.00;
float Temp3Nuit=18.00; // Bureau
float Temp3Jour=20.00;
float Temp4Nuit=18.00; // Chambre
float Temp4Jour=20.00;
float Temp5Nuit=18.00; // SAM
float Temp5Jour=20.00;
float Temp6Nuit=18.00; // Entrée
float Temp6Jour=20.00;
float DeltaJ=0.5;
float DeltaN=1.0;

// Divers
//String s;
int Menu=1;
int MAJH;
int ligne;
int valid;
long TBas;
long THaut;
char buffer[8];

//balise
int MClear=0;
int CuisineAnnule=0;
int TomAnnule=0;
int BureauAnnule=0;
int ChambreAnnule=0;
int SAMAnnule=0;
int EntreeAnnule=0;
int Annule=0;
int RouteCuisine=0;
int RouteTom=0;
int RouteBureau=0;
int RouteChambre=0;
int RouteSAM=0;
int RouteEntree=0;
int TCuisine=0;
int TTom=0;
int TBureau=0;
int TChambre=0;
int TSAM=0;
int TEntree=0;

// Gestion heure
int heure;
int minutes;
int secondes;
long current;
char* jour;
int date=10;
int mois;
int annee;

// basculement heure/nuit
long heureN=72000L; // 20h
long heureJ=19800L; //5 h30

// remise en route des radiateurs après arrêt
long currentCuisine;
long currentTom;
long currentBureau;
long currentChambre;
long currentSAM;
long currentEntree;
long Remiseenroute=30L;

uint8_t c;

void setup() {
Serial.begin(19200);
Serial.print("\n\n\n***\n");
Serial.print("avr\n");
Serial3.begin(9600);

myLCD.begin();

delay(100);
myLCD.initSD();

delay(100);
// myLCD.checkSD();

delay(100);

myLCD.setFontSolid(1);
delay(100);

Serial.print("\n setTouch \t");
aa=myLCD.setTouch(true);
Serial.print(aa, DEC);
Serial.print("\n ");

pinMode(PinCuisine, OUTPUT);
pinMode(PinTom, OUTPUT);
pinMode(PinBureau, OUTPUT);
pinMode(PinChambre, OUTPUT);
pinMode(PinSalle, OUTPUT);
pinMode(PinSalle1, OUTPUT);
pinMode(PinEntree, OUTPUT);

RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));
RTC.getTime();
RTC.ctrl = 0x00; // 0x00=disable SQW pin, 0x10=1Hz,
RTC.setCTRL();
myLCD.setFont(02);
delay(100);

}

uint16_t x, y;
uint8_t b;

void loop() {
myLCD.setFont(02);
delay(50);

c=myLCD.getTouchActivity();

//affichage menu
myLCD.readScreenFAT("Menu.gci", 0, 0);

// envoie de commande de récupération
RTC.getTime();
sensors.requestTemperatures();

// Récuperation/Affichage Heure
date=RTC.day;
mois=RTC.month;
annee=RTC.year;
heure = RTC.hour;
minutes = RTC.minute;
secondes = RTC.second;

//calcul temps en seconde
current=(((long)RTC.hour3600L)+((long)RTC.minute60L)+(long)RTC.second);

//affichage jour
switch (RTC.dow)
{
case 1:
jour=("Lundi ");
break;
case 2:
jour=("Mardi ");
break;
case 3:
jour=("Mercredi");
break;
case 4:
jour=("Jeudi ");
break;
case 5:
jour=("Vendredi");
break;
case 6:
jour=("Samedi ");
break;
case 0:
jour=("Dimanche");
break;
}

// affichage date/heure
myLCD.gText(55, 15, Serial_LCD::rgb16(254, 254, 1), jour);

if (RTC.day < 10)
{
myLCD.gText(126, 15, Serial_LCD::rgb16(254, 254, 1), "0");
myLCD.gText(134, 15, Serial_LCD::rgb16(254, 254, 1), (date));
}
else
{
myLCD.gText(126, 15, Serial_LCD::rgb16(254, 254, 1), (date));
}

myLCD.gText(143, 15, Serial_LCD::rgb16(254, 254, 1), "/");

if (RTC.month < 10)
{
myLCD.gText(152, 15, Serial_LCD::rgb16(254, 254, 1), "0");
myLCD.gText(160, 15, Serial_LCD::rgb16(254, 254, 1), (mois));
}
else
{
myLCD.gText(152, 15, Serial_LCD::rgb16(254, 254, 1), (mois));
}

myLCD.gText(169, 15, Serial_LCD::rgb16(254, 254, 1), "/");

myLCD.gText(178, 15, Serial_LCD::rgb16(254, 254, 1), (annee));

if (RTC.hour < 10)
{
myLCD.gText(247, 15, Serial_LCD::rgb16(254, 254, 1), "0");
myLCD.gText(255, 15, Serial_LCD::rgb16(254, 254, 1), (heure));
}
else
{
myLCD.gText(247, 15, Serial_LCD::rgb16(254, 254, 1), (heure));
}

myLCD.gText(262, 15, Serial_LCD::rgb16(254, 254, 1), ":");

if (RTC.minute < 10)
{
myLCD.gText(271, 15, Serial_LCD::rgb16(254, 254, 1), "0");
myLCD.gText(279, 15, Serial_LCD::rgb16(254, 254, 1), (minutes));
}
else
{
myLCD.gText(271, 15, Serial_LCD::rgb16(254, 254, 1), (minutes));
}

myLCD.gText(286, 15, Serial_LCD::rgb16(254, 254, 1), ":");

if (RTC.second < 10)
{
myLCD.gText(295, 15, Serial_LCD::rgb16(254, 254, 1), "0");
myLCD.gText(303, 15, Serial_LCD::rgb16(254, 254, 1), (secondes));
}
else
{
myLCD.gText(295, 15, Serial_LCD::rgb16(254, 254, 1), (secondes));
}

// Gestion/Récuperation/Affichage Temp

//sensorCuisine = sensors.getTempC(T1);
sensorTom = sensors.getTempC(T2);
sensorBureau = sensors.getTempC(T3);
sensorChambre = sensors.getTempC(T4);
sensorSalle = sensors.getTempC(T5);
//sensorEntree = sensors.getTempC(T6);
//sensorArduino = sensors.getTempC(T8);

il sera mis a jour quand j aurai fini, les possibilités de mise a jour à travers l écran
je rappelle que je suis débutant, donc il n est pas forcément optimisé mais fonctionnel

la suite

if ((heureJ<current) && (current<heureN)) {

myLCD.gText(58, 38, Serial_LCD::rgb16(254, 254, 1), "J");
// pour créer une espèce de délestage
if (((Temp2Jour-DeltaJ)>(sensorTom)) && ((sensorTom) != sensordefault) && (TomAnnule == Annule) && (RouteCuisine==0) && (RouteBureau==0) && (RouteChambre==0) && (RouteSAM==0) && (RouteEntree==0))
{
TTom=1; // pour afficher thermometre chaud
digitalWrite(PinTom, HIGH);
(RouteTom=1); // pour indiquer que le radiateur est en route
}

if ((sensorTom) > (Temp2Jour))
{
TTom=0; // pour afficher thermometre froid
digitalWrite(PinTom, LOW);
(RouteTom=0); // pour indiquer que le radiateur est en arrêté
}

if (((Temp3Jour-DeltaJ) > (sensorBureau)) && ((sensorBureau) != sensordefault) && (BureauAnnule == Annule) && (RouteCuisine==0) && (RouteTom==0) && (RouteChambre==0) && (RouteSAM==0) && (RouteEntree==0))
{
TBureau=1;
digitalWrite(PinBureau, HIGH);
(RouteBureau=1);
}

if ((sensorBureau) > (Temp3Jour))
{
TBureau=0;
digitalWrite(PinBureau, LOW);
(RouteBureau=0);
}

if (((Temp4Jour-DeltaJ)>(sensorChambre)) && ((sensorChambre) != sensordefault) && (ChambreAnnule == Annule) && (RouteCuisine==0) && (RouteTom==0) && (RouteBureau==0) && (RouteSAM==0) && (RouteEntree==0))
{
TChambre=1;
digitalWrite(PinChambre, HIGH);
(RouteChambre=1);
}

if ((sensorChambre) > (Temp4Jour))
{
TChambre=0;
digitalWrite(PinChambre, LOW);
(RouteChambre=0);
}

if (((Temp5Jour-DeltaJ)>(sensorSalle))&& ((sensorSalle) != sensordefault) && (SAMAnnule == Annule) && (RouteCuisine==0) && (RouteTom==0) && (RouteBureau==0) && (RouteChambre==0) && (RouteEntree==0))
{
TSAM=1;
digitalWrite(PinSalle, HIGH);
digitalWrite(PinSalle1, HIGH);
(RouteSAM=1);
}

if ((sensorSalle) > (Temp5Jour))
{
TSAM=0;
digitalWrite(PinSalle, LOW);
digitalWrite(PinSalle1, LOW);
(RouteSAM=0);
}

}

else {

myLCD.gText(58, 38, Serial_LCD::rgb16(254, 254, 1), "N");

if (((Temp2Nuit-DeltaN)>(sensorTom)) && ((sensorTom) != sensordefault) && (TomAnnule == Annule) && (RouteCuisine==0) && (RouteBureau==0) && (RouteChambre==0) && (RouteSAM==0) && (RouteEntree==0))
{
TTom=1;
digitalWrite(PinTom, HIGH);
(RouteTom=1);
}

if ((sensorTom) > (Temp2Nuit))
{
TTom=0;
digitalWrite(PinTom, LOW);
(RouteTom=0);
}

if (((Temp3Nuit-DeltaN)>(sensorBureau)) && ((sensorBureau) != sensordefault) && (BureauAnnule == Annule) && (RouteCuisine==0) && (RouteTom==0) && (RouteChambre==0) && (RouteSAM==0) && (RouteEntree==0))
{
TBureau=1;
digitalWrite(PinBureau, HIGH);
(RouteBureau=1);
}

if ((sensorBureau) > (Temp3Nuit))
{
TBureau=0;
digitalWrite(PinBureau, LOW);
(RouteBureau=0);
}

if (((Temp4Nuit-DeltaN) > (sensorChambre)) && ((sensorChambre) != sensordefault) && (ChambreAnnule == Annule) && (RouteCuisine==0) && (RouteTom==0) && (RouteBureau==0) && (RouteSAM==0) && (RouteEntree==0))
{
TChambre=1;
digitalWrite(PinChambre, HIGH);
(RouteChambre=1);
}

if ((sensorChambre) > (Temp4Nuit))
{
TChambre=0;
digitalWrite(PinChambre, LOW);
(RouteChambre=0);
}

if (((Temp5Nuit-DeltaN)>(sensorSalle)) && ((sensorSalle) != sensordefault) && (SAMAnnule == Annule) && (RouteCuisine==0) && (RouteTom==0) && (RouteBureau==0) && (RouteChambre==0) && (RouteEntree==0))
{
TSAM=1;
digitalWrite(PinSalle, HIGH);
digitalWrite(PinSalle1, HIGH);
(RouteSAM=1);
}

if ((sensorSalle) > (Temp5Nuit))
{
TSAM=0;
digitalWrite(PinSalle, LOW);
digitalWrite(PinSalle1, LOW);
(RouteSAM=0);
}

}
//---------------------------------------------------------------------------------

if ((c==1) || (c==3))
{

myLCD.getTouchXY(x, y);

if ((x>0 && x<30) && (y>0 && y<39)) // Affichage Menu
{
myLCD.clear();
Menu=1;
myLCD.readScreenFAT("Menu.gci", 0, 0);
MClear=1;
}

if ((x>0 && x<30) && (y>157 && y<196)) // Affichage Setup
{
myLCD.clear();
Menu=2;
myLCD.readScreenFAT("Setup.gci", 39, 34);
MClear=1;
}

if ((x>0 && x<30) && (y>201 && y<240)) // Affichage About
{
myLCD.clear();
myLCD.setFont(0);
myLCD.gText(130, 85, Serial_LCD::rgb16(254, 254, 1), "Controleur Radiateur");
myLCD.gText(100, 95, Serial_LCD::rgb16(254, 254, 1), "Developpe par Stephane EMLINGER");
}

if (((x>55 && x<140) && (y>35 && y<133)) && (Menu==1)) // met en route/arrete radiateur par ecran tactile
{
if (CuisineAnnule==0)
{
(CuisineAnnule=1);
currentCuisine=(current+(Remiseenroute*60L));
if(digitalRead(PinCuisine) == HIGH)
{
digitalWrite(PinCuisine, LOW);
(RouteCuisine=0);
}
}
else
{
MClear=1;
(CuisineAnnule=0);
}

}

if (((x>140 && x<225) && (y>35 && y<133)) && (Menu==1)) // met en route/arrete radiateur
{
if (TomAnnule==0)
{
(TomAnnule=1);
currentTom=(current+(Remiseenroute*60L));
if(digitalRead(PinTom) == HIGH)
{
digitalWrite(PinTom, LOW);
(RouteTom=0);
}
}
else
{
MClear=1;
(TomAnnule=0);
}
}

if (((x>225 && x<310) && (y>35 && y<133)) && (Menu==1)) // met en route/arrete radiateur
{
if (BureauAnnule==0)
{
(BureauAnnule=1);
currentBureau=(current+(Remiseenroute*60L));
if(digitalRead(PinBureau) == HIGH)
{
digitalWrite(PinBureau, LOW);
(RouteBureau=0);
}
}
else
{
MClear=1;
(BureauAnnule=0);
}
}

if (((x>55 && x<140) && (y>133 && y<230)) && (Menu==1)) // met en route/arrete radiateur
{
if (ChambreAnnule==0)
{
(ChambreAnnule=1);
currentChambre=(current+(Remiseenroute*60L));
if(digitalRead(PinChambre) == HIGH)
{
digitalWrite(PinChambre, LOW);
(RouteChambre=0);
}
}
else
{
MClear=1;
(ChambreAnnule=0);
}
}

if (((x>140 && x<225) && (y>133 && y<230)) && (Menu==1)) // met en route/arrete radiateur
{
if (SAMAnnule==0)
{
(SAMAnnule=1);
currentSAM=(current+(Remiseenroute*60L));
if (digitalRead(PinSalle) == HIGH)
{
digitalWrite(PinSalle, LOW);
digitalWrite(PinSalle1, LOW);
(RouteSAM=0);
}
}
else
{
MClear=1;
(SAMAnnule=0);
}
}

la fin

if (((x>225 && x<310) && (y>133 && y<230)) && (Menu==1)) // met en route/arrete radiateur
{
if (EntreeAnnule==0)
{
(EntreeAnnule=1);
currentEntree=(current+(Remiseenroute*60L));
if(digitalRead(PinEntree) == HIGH)
{
digitalWrite(PinEntree, LOW);
(RouteEntree=0);
}
}
else
{
MClear=1;
(EntreeAnnule=0);
}
}

}
//-----------------------------------------------------------------------------------

switch (Menu)
{
case 1: {
if (MClear==1)
{
myLCD.clear();
MClear=0;
}

myLCD.line(55, 35, 55, 230, Serial_LCD::rgb16(254, 254, 1));
myLCD.line(310, 35, 310, 230, Serial_LCD::rgb16(254, 254, 1));
myLCD.line(55, 35, 310, 35, Serial_LCD::rgb16(254, 254, 1));
myLCD.line(55, 230, 310, 230, Serial_LCD::rgb16(254, 254, 1));
myLCD.line(55, 133, 310, 133, Serial_LCD::rgb16(254, 254, 1));
myLCD.line(140, 35, 140, 230, Serial_LCD::rgb16(254, 254, 1));
myLCD.line(225, 35, 225, 230, Serial_LCD::rgb16(254, 254, 1));

if ((CuisineAnnule==1) && (currentCuisine>current)) // remet en route le radiateur au bout de 30 min quelque soit l option
{
myLCD.readScreenFAT("Interdit.gci", 56, 36);
}
else
{
memset(buffer, 0, 8 * sizeof(char));
dtostrf(sensorCuisine, 6, 2, buffer);
myLCD.gText(75, 105, Serial_LCD::rgb16(254, 254, 1), buffer);
}

if ((TomAnnule==1) && (currentTom>current))
{
myLCD.readScreenFAT("Interdit.gci", 141, 36);
}
else
{
memset(buffer, 0, 8 * sizeof(char));
dtostrf(sensorTom, 6, 2, buffer);
myLCD.gText(163, 105, Serial_LCD::rgb16(254, 254, 1), buffer);
}

if ((BureauAnnule==1) && (currentBureau>current))
{
myLCD.readScreenFAT("Interdit.gci", 226, 36);
}
else
{
memset(buffer, 0, 8 * sizeof(char));
dtostrf(sensorBureau, 6, 2, buffer);
myLCD.gText(248, 105, Serial_LCD::rgb16(254, 254, 1), buffer);
}

if ((ChambreAnnule==1) && (currentChambre>current))
{
myLCD.readScreenFAT("Interdit.gci", 56, 134);
}
else
{
memset(buffer, 0, 8 * sizeof(char));
dtostrf(sensorChambre, 6, 2, buffer);
myLCD.gText(75, 200, Serial_LCD::rgb16(254, 254, 1), buffer);
}

if ((SAMAnnule==1) && (currentSAM>current))
{
myLCD.readScreenFAT("Interdit.gci", 141, 134);
}
else
{
memset(buffer, 0, 8 * sizeof(char));
dtostrf(sensorSalle, 6, 2, buffer);
myLCD.gText(163, 200, Serial_LCD::rgb16(254, 254, 1), buffer);
}

if ((EntreeAnnule==1) && (currentEntree>current))
{
myLCD.readScreenFAT("Interdit.gci", 226, 134);
}
else
{
memset(buffer, 0, 8 * sizeof(char));
dtostrf(sensorEntree, 6, 2, buffer);
myLCD.gText(248, 200, Serial_LCD::rgb16(254, 254, 1), buffer);
}

if (CuisineAnnule == Annule)
{
if (TCuisine==0)
{
myLCD.readScreenFAT("TFroid.gci", 60, 95);
}
else
{
myLCD.readScreenFAT("TChaud.gci", 60, 95);
}
}

if (TomAnnule == Annule)
{
if (TTom==0)
{
myLCD.readScreenFAT("TFroid.gci", 145, 95);
}
else
{
myLCD.readScreenFAT("TChaud.gci", 145, 95);
}
}

if (BureauAnnule == Annule)
{
if (TBureau==0)
{
myLCD.readScreenFAT("TFroid.gci", 230, 95);
}
else
{
myLCD.readScreenFAT("TChaud.gci", 230, 95);
}
}

if (ChambreAnnule == Annule)
{
if (TChambre==0)
{
myLCD.readScreenFAT("TFroid.gci", 60, 190);
}
else
{
myLCD.readScreenFAT("TChaud.gci", 60, 190);
}
}

if (SAMAnnule == Annule)
{
if (TSAM==0)
{
myLCD.readScreenFAT("TFroid.gci", 145, 190);
}
else
{
myLCD.readScreenFAT("TChaud.gci", 145, 190);
}
}

if (EntreeAnnule == Annule)
{
if (TEntree==0)
{
myLCD.readScreenFAT("TFroid.gci", 230, 190);
}
else
{
myLCD.readScreenFAT("TChaud.gci", 230, 190);
}
}
}
}

//----------------------------------------------------------------------------------------

}

ce que je cherche à faire :

gérer les radiateurs avec un basculement jour/nuit, une température différente pour le jour/nuit, un delta différent jour/nuit
pouvoir les arrêter avec un redémarrage auto au bout de 30mins
pas de mise en route simultanée
un mode auto/nuit/jour/vacances
MAJ des paramètres date/heure, T°, Delta, Temps de pause à travers l'écran

Tout d'abord, il faudrait savoir quel type de radiateur tu as ?
Electrique, hydraulique... ???
Car le commande ne s'effectue forcément pas pareil.

Probablement des radiateur électriques, il utilise un carte relais.

oui tout a fait des radiateurs électriques