DS3231 activer un relais pendant un temps donné - gestion pompe piscine

Bonsoir à vous,

J’arrive au bout de mon projet, à savoir une gestion de ma pompe de piscine pour lh’iver et pour l’été.
A ce jour, je déclenche la pompe en mode hors gel lorsque la température est inférieur à 2°.
J’arrive à récupérer mes températures d’eau et d’air en NRF24L01 et DS18B20.
Pour le DS3231, j’arrive à régler l’heure et l’afficher sur mon ecran en I2C.
Il me reste une chose.
Tous les matins à heure fixe (8h30), je dois récupérer la température de l’eau (j’arrive à récupérer ma variable float de ma structure correspondant à la température de l’eau).
Une fois que celle-ci est récupérée, je la divise par 2.
Le résultat doit être ajouté à l’heure fixe du matin pour déterminer le temps de fonctionnement de la pompe pour la journée.
Et là je patauge.
Je viens de faire des recherches sur le net pour avancer, mais je n’arrive pas à trouver de bons tutos sur le sujet.
Je trouve des exemples pour DS1307 mais j’ai bien peur que cela n’aille pas avec ma bibliothèquenDS3231.h.
J’ai mis mon code en pièce jointe.
Bonne soirée à vous.

PS : un grand merci à hbachetti qui me fait progresser

DS18_RX_20141220_Uno_v4_relai_horloge.ino (4.16 KB)

Si tu veux avoir une chance d'avoir des réponses, met ton code entre balises

Moi je ne peux pas y avoir accès depuis ma tablette ou mon téléphone....

C'est peut être le confinement qui me tape sur la tête mais je ne comprends pas la démarche .
Si j'ai bien lu, tu divises une température par 2 et tu l'ajoutes à un temps pour avoir une nouvelle durée ...

C'est empirique ? Tu cherches à réguler la température de ta piscine en alimentant ou non la pompe ?

pour ceux qui cherchent aussi , voici le code :

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h> 
#include <Wire.h>
#include <DS3231.h>



#define PINRELAIS 2
#define ADRESSE_I2C_RTC 0x68

LiquidCrystal_I2C lcd(0x27, 20, 4);  

RF24 radio(9,10); 
RF24Network network(radio);
const uint16_t this_node = 000;

struct payload_t
{
  byte senderID;
  float sens1;
};

float tempref=2;
float tempext;
float tempeau;

DS3231 Clock;

bool Century=false;
bool h12;
bool h24;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits; // Alarm
bool ADy, A12h, Apm;  // Alarm


void setup(void)
{
  digitalWrite(2, LOW);
  Wire.begin();
  lcd.begin();
  lcd.clear();
  lcd.backlight();
  lcd.display(); 
  lcd.setCursor(2,0);  
  lcd.print("Automatique Pool"); 
  lcd.setCursor(0,1);  
  lcd.print("TExt:");   
  lcd.setCursor(0,2);  
  lcd.print("TEau:");
  
Serial.begin(9600);
Serial.println("RF24 Network Rx-DS18B20");
SPI.begin();
radio.setPALevel(RF24_PA_MAX);
radio.begin();
network.begin(/*channel*/ 88, /*node address*/ this_node); 
}
void loop(void)
{
{
  lcd.setCursor(12,1);
  // nom du jour
  switch (Clock.getDoW())
  { case 1: lcd.print("Lundi   "); break;
    case 2: lcd.print("Mardi   "); break;
    case 3: lcd.print("Mercredi"); break;
    case 4: lcd.print("Jeudi   "); break;
    case 5: lcd.print("Vendredi"); break;
    case 6: lcd.print("Samedi  "); break;
    case 7: lcd.print("Dimanche"); break;
    }

   // jour
   lcd.setCursor(12,2);
    if (Clock.getDate() <10){
    lcd.print("0");
    } 
     
  lcd.print(Clock.getDate(), DEC);
  lcd.print("/");

  lcd.print(Clock.getMonth(Century), DEC);
  //lcd.print("/");
  // mois
  //switch (Clock.getMonth(Century))
   //{ case 1:  lcd.print("Janvier"); break;
   // case 2:  lcd.print("Fevrier"); break;
   // case 3:  lcd.print("Mars"); break;
   // case 4:  lcd.print("Avril"); break;
   // case 5:  lcd.print("Mai"); break;
   // case 6:  lcd.print("Juin"); break;
   // case 7:  lcd.print("Juillet"); break;
   // case 8:  lcd.print("Aout"); break;
   // case 9:  lcd.print("Septembre"); break;
   // case 10: lcd.print("Octobre"); break;
   // case 11: lcd.print("Novembre"); break;
   // case 12: lcd.print("Decembre");
   // }
   
  
  lcd.setCursor(17,2);
  lcd.print("/");
  lcd.print(Clock.getYear(), DEC);

   // Heure
   lcd.setCursor(12,3);
    if (Clock.getHour(h24,PM) <10){
    lcd.print("0");
     } 
   lcd.print(Clock.getHour(h24,PM), DEC);
   lcd.print(":");
   
    // Minute
    if (Clock.getMinute() <10){
    lcd.print("0");
    } 
    lcd.print(Clock.getMinute(), DEC);
    lcd.print(":");

    // Seconde
    if (Clock.getSecond() <10){
    lcd.print("0");
    }
    lcd.print(Clock.getSecond(), DEC);

    // Temperature en degré celsius
   lcd.setCursor(0,3);
   lcd.print("TInt:");
   lcd.setCursor(5,3);
   lcd.print(Clock.getTemperature(), 1);
   
    
    }
network.update();
while ( network.available())
{
//lcd.clear();
RF24NetworkHeader header;
payload_t payload;
network.read(header,&payload,sizeof(payload)); 
Serial.print("Sensor: ");
Serial.print(payload.senderID);
Serial.print(" ");
Serial.print("Temp: "); 
Serial.print(payload.sens1,1);
Serial.println(" C");

{
if (payload.senderID==1){

lcd.setCursor(0,1);  
lcd.print("TExt:");
lcd.setCursor(5,1);
lcd.print("      ");
lcd.setCursor(5,1);
Serial.println("ext"); 
lcd.print(payload.sens1,1);
float tempext=payload.sens1;
Serial.println(tempext); 
 if (tempext < tempref) {

lcd.setCursor(10,1); //on place le curseur de l'écran LCD au début de la 1ère ligne
lcd.print("G"); 

digitalWrite(2, HIGH);}

else
{
  digitalWrite(2, LOW); // le relais est bas si la consigne de temperature n'est pas atteinte
lcd.setCursor(10,1); //on place le curseur de l'écran LCD au début de la 1ère ligne
lcd.print("N");
}
}
else
{
(payload.senderID==2);
      lcd.setCursor(0,2);
      lcd.print("TEau:");
      lcd.setCursor(5,2);
      lcd.print("      ");
      Serial.println("eau"); 
      lcd.setCursor(5,2);
      lcd.print(payload.sens1,1);
      float tempeau=payload.sens1;
      Serial.println(tempeau);       
}
}
}
}

drefparadise:
Il me reste une chose.
Tous les matins à heure fixe (8h30), je dois récupérer la température de l’eau (j’arrive à récupérer ma variable float de ma structure correspondant à la température de l’eau).
Une fois que celle-ci est récupérée, je la divise par 2.
Le résultat doit être ajouté à l’heure fixe du matin pour déterminer le temps de fonctionnement de la pompe pour la journée.

ca n ’ a pas l’ air tres compliqué a faire .

il faut convertir ( temperatureEau / 2 ) en temps puis l ’ ajouter a tempsDuMatin ( 8 H 30 ? )

certainement qu ’ une conversion en temps unix simplifiera les choses .

Reflexion faite , ce n’ est pas si clair que ca , que veux tu faire exactement ?

obtenir une durée de fonctionnement de la pompe pour chaque jour en fonction de la temperature divisee par 2 ?

je ne vois pas trop l ’ interet , si la temperature est de 0 , ca devrait faire quoi ?
si la temperature est de 10 ° , ca devrait faire quoi ?
si la temperature est de - 10 ° , ca devrait faire quoi ?

Je ne suis pas le seul à ne pas comprendre le but de la manœuvre :smiley: !

Il y a la volonté de commander la pompe suivant la température mais la régulation me semble bizarre …

Un début d'explication concernant cette fameuse formule vue sur le post#46 du Domogarden de @Tartiflette:

Le temps de filtration quotidien en heures de votre piscine doit-être égal à la moitié de la température de l'eau en dégrées celcius.

Me coucherais moins bête ce soir ...

Dans le code que vous avez posté il n'y a rien qui a trait à 8h30 du matin.

--> Qu'est-ce que vous n'arrivez pas à faire, déclencher la lecture tous les jours à une heure donnée avec un DS3231 ou les maths sur le temps ? (en supposant que cela ait un sens)

Bonjour à tous,

J’avance dans mes essais.
Et oui le temps de filtration d’une piscine doit être la moitié de la température pour obtenir un bon résultat.

Alors j’arrive à démarrer mon relais à 8h30 mais lorsque je fais l’acquisition de la temperature le serial.print me retourne une valeur à zero.

Et j’arrive à éteindre mon relais à heure définie (c’est déjà un début).

Je mets mon code actuel, mais je me prends les pieds dans le tapis avec les variables.

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h> 
#include <Wire.h>
#include <DS3231.h>
#include <math.h>

#define PINRELAIS 2
#define ADRESSE_I2C_RTC 0x68

LiquidCrystal_I2C lcd(0x27, 20, 4);  

RF24 radio(9,10); 
RF24Network network(radio);
const uint16_t this_node = 000;

struct payload_t
{
  byte senderID;
  float sens1;
};


float tempref=2;
float temprefmax=4;
float tempext;
float tempeau;
float tempeauref;
float tempeauref1;

DS3231 Clock;

bool Century=false;
bool h12;
bool h24;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits; // Alarm
bool ADy, A12h, Apm;  // Alarm

const int OnHour = 9;//Heure pour prendre la temperature
const int OnMin = 19;//Minute pour prendre la temperature
const int OffHour = 9;//Heure pour prendre la temperature
const int OffMin = 21;//Minute pour prendre la temperature

void setup(void)
{
  digitalWrite(2, LOW);
  Wire.begin();
  lcd.begin();
  lcd.clear();
  lcd.backlight();
  lcd.display(); 
  lcd.setCursor(2,0);  
  lcd.print("Automatique Pool"); 
  lcd.setCursor(0,1);  
  lcd.print("TExt:");   
  lcd.setCursor(0,2);  
  lcd.print("TEau:");
  
Serial.begin(9600);
Serial.println("RF24 Network Rx-DS18B20");
SPI.begin();
radio.setPALevel(RF24_PA_MAX);
radio.begin();
network.begin(/*channel*/ 88, /*node address*/ this_node); 
}
void loop(void)
{
{
  lcd.setCursor(2,0);  
  lcd.print("Automatique Pool");
  lcd.setCursor(12,1);
  // nom du jour
  switch (Clock.getDoW())
  { case 1: lcd.print("Lundi   "); break;
    case 2: lcd.print("Mardi   "); break;
    case 3: lcd.print("Mercredi"); break;
    case 4: lcd.print("Jeudi   "); break;
    case 5: lcd.print("Vendredi"); break;
    case 6: lcd.print("Samedi  "); break;
    case 7: lcd.print("Dimanche"); break;
    }

   // jour
   lcd.setCursor(12,2);
    if (Clock.getDate() <10){
    lcd.print("0");
    } 
     
  lcd.print(Clock.getDate(), DEC);
  lcd.print("/");

lcd.setCursor(16,2);
  lcd.print(Clock.getMonth(Century), DEC);
  //lcd.print("/");
  // mois
  switch (Clock.getMonth(Century))
   { case 1:  lcd.print("01"); break;
    case 2:  lcd.print("02"); break;
    case 3:  lcd.print("03"); break;
    case 4:  lcd.print("04"); break;
    case 5:  lcd.print("05"); break;
    case 6:  lcd.print("06"); break;
    case 7:  lcd.print("07"); break;
    case 8:  lcd.print("08"); break;
    case 9:  lcd.print("09"); break;
    case 10: lcd.print("10"); break;
    case 11: lcd.print("11"); break;
    case 12: lcd.print("12");
   }
     
  lcd.setCursor(17,2);
  lcd.print("/");
  lcd.print(Clock.getYear(), DEC);

   // Heure
   lcd.setCursor(12,3);
    if (Clock.getHour(h24,PM) <10){
    lcd.print("0");
     } 
   lcd.print(Clock.getHour(h24,PM), DEC);
   lcd.print(":");
   
    // Minute
    if (Clock.getMinute() <10){
    lcd.print("0");
    } 
    lcd.print(Clock.getMinute(), DEC);
    lcd.print(":");

    // Seconde
    if (Clock.getSecond() <10){
    lcd.print("0");
    }
    lcd.print(Clock.getSecond(), DEC);

    // Temperature en degré celsius
   lcd.setCursor(0,3);
   lcd.print("TInt:");
   lcd.setCursor(5,3);
   lcd.print(Clock.getTemperature(), 1);
   
    
    }
network.update();
while ( network.available())
{
//lcd.clear();
RF24NetworkHeader header;
payload_t payload;
network.read(header,&payload,sizeof(payload)); 
Serial.print("Sensor: ");
Serial.print(payload.senderID);
Serial.print(" ");
Serial.print("Temp: "); 
Serial.print(payload.sens1,1);
Serial.println(" C");

{
if (payload.senderID==1){

lcd.setCursor(0,1);  
lcd.print("TExt:");
lcd.setCursor(5,1);
lcd.print("      ");
lcd.setCursor(5,1);
Serial.println("ext"); 
lcd.print(payload.sens1,1);
float tempext=payload.sens1;
Serial.println(tempext); 
 if (tempext < tempref) {

lcd.setCursor(10,1); //on place le curseur de l'écran LCD au début de la 1ère ligne
lcd.print("G"); 

digitalWrite(2, HIGH);}

else
{
  if (tempext > temprefmax) {
  digitalWrite(2, LOW); // le relais est bas si la consigne de temperature n'est pas atteinte
lcd.setCursor(10,1); //on place le curseur de l'écran LCD au début de la 1ère ligne
lcd.print("N");
}
}
}
else
{
(payload.senderID==2);
      lcd.setCursor(0,2);
      lcd.print("TEau:");
      lcd.setCursor(5,2);
      lcd.print("      ");
      Serial.println("eau"); 
      lcd.setCursor(5,2);
      lcd.print(payload.sens1,1);
      float tempeau=payload.sens1;
      int tempeau1 = ceil(tempeau);
      float tempeauref=tempeau1;
      Serial.println(tempeau); 
      Serial.println(tempeauref);      
}
}
}
if(Clock.getHour (h24,PM)== OnHour && Clock.getMinute ()== OnMin){
    Serial.println(tempeauref);
    //float tempeauref=tempeau;
    digitalWrite(2, HIGH);
    delay (1000);
    }
    else if(Clock.getHour (h24,PM)== OffHour && Clock.getMinute ()== OffMin){
    Serial.println(tempeauref1);
    digitalWrite(2, LOW);
    delay (1000);
      }
      }

BrUnO14200:
C'est peut être le confinement qui me tape sur la tête mais je ne comprends pas la démarche .
Si j'ai bien lu, tu divises une température par 2 et tu l'ajoutes à un temps pour avoir une nouvelle durée ...

C'est empirique ? Tu cherches à réguler la température de ta piscine en alimentant ou non la pompe ?

Je cherche à optimiser le temps de filtration.
Pour cela, le temps de filtration = la moitié de la température de l'eau.
Sachant que la pompe démarre à heure fixe, il faut que j'ajoute ce temps pour avoir l'heure d'extinction de la pompe.

iznobe:
pour ceux qui cherchent aussi , voici le code :

#include <RF24Network.h>

#include <RF24.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <DS3231.h>

#define PINRELAIS 2
#define ADRESSE_I2C_RTC 0x68

LiquidCrystal_I2C lcd(0x27, 20, 4);

RF24 radio(9,10);
RF24Network network(radio);
const uint16_t this_node = 000;

struct payload_t
{
 byte senderID;
 float sens1;
};

float tempref=2;
float tempext;
float tempeau;

DS3231 Clock;

bool Century=false;
bool h12;
bool h24;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits; // Alarm
bool ADy, A12h, Apm;  // Alarm

void setup(void)
{
 digitalWrite(2, LOW);
 Wire.begin();
 lcd.begin();
 lcd.clear();
 lcd.backlight();
 lcd.display();
 lcd.setCursor(2,0);  
 lcd.print(“Automatique Pool”);
 lcd.setCursor(0,1);  
 lcd.print(“TExt:”);  
 lcd.setCursor(0,2);  
 lcd.print(“TEau:”);
 
Serial.begin(9600);
Serial.println(“RF24 Network Rx-DS18B20”);
SPI.begin();
radio.setPALevel(RF24_PA_MAX);
radio.begin();
network.begin(/channel/ 88, /node address/ this_node);
}
void loop(void)
{
{
 lcd.setCursor(12,1);
 // nom du jour
 switch (Clock.getDoW())
 { case 1: lcd.print("Lundi   "); break;
   case 2: lcd.print("Mardi   "); break;
   case 3: lcd.print(“Mercredi”); break;
   case 4: lcd.print("Jeudi   "); break;
   case 5: lcd.print(“Vendredi”); break;
   case 6: lcd.print("Samedi  "); break;
   case 7: lcd.print(“Dimanche”); break;
   }

// jour
  lcd.setCursor(12,2);
   if (Clock.getDate() <10){
   lcd.print(“0”);
   }
   
 lcd.print(Clock.getDate(), DEC);
 lcd.print("/");

lcd.print(Clock.getMonth(Century), DEC);
 //lcd.print("/");
 // mois
 //switch (Clock.getMonth(Century))
  //{ case 1:  lcd.print(“Janvier”); break;
  // case 2:  lcd.print(“Fevrier”); break;
  // case 3:  lcd.print(“Mars”); break;
  // case 4:  lcd.print(“Avril”); break;
  // case 5:  lcd.print(“Mai”); break;
  // case 6:  lcd.print(“Juin”); break;
  // case 7:  lcd.print(“Juillet”); break;
  // case 8:  lcd.print(“Aout”); break;
  // case 9:  lcd.print(“Septembre”); break;
  // case 10: lcd.print(“Octobre”); break;
  // case 11: lcd.print(“Novembre”); break;
  // case 12: lcd.print(“Decembre”);
  // }
 
 
 lcd.setCursor(17,2);
 lcd.print("/");
 lcd.print(Clock.getYear(), DEC);

// Heure
  lcd.setCursor(12,3);
   if (Clock.getHour(h24,PM) <10){
   lcd.print(“0”);
    }
  lcd.print(Clock.getHour(h24,PM), DEC);
  lcd.print(":");
 
   // Minute
   if (Clock.getMinute() <10){
   lcd.print(“0”);
   }
   lcd.print(Clock.getMinute(), DEC);
   lcd.print(":");

// Seconde
   if (Clock.getSecond() <10){
   lcd.print(“0”);
   }
   lcd.print(Clock.getSecond(), DEC);

// Temperature en degré celsius
  lcd.setCursor(0,3);
  lcd.print(“TInt:”);
  lcd.setCursor(5,3);
  lcd.print(Clock.getTemperature(), 1);
 
   
   }
network.update();
while ( network.available())
{
//lcd.clear();
RF24NetworkHeader header;
payload_t payload;
network.read(header,&payload,sizeof(payload));
Serial.print("Sensor: “);
Serial.print(payload.senderID);
Serial.print(” ");
Serial.print(“Temp: “);
Serial.print(payload.sens1,1);
Serial.println(” C”);

{
if (payload.senderID==1){

lcd.setCursor(0,1);  
lcd.print(“TExt:”);
lcd.setCursor(5,1);
lcd.print("      ");
lcd.setCursor(5,1);
Serial.println(“ext”);
lcd.print(payload.sens1,1);
float tempext=payload.sens1;
Serial.println(tempext);
if (tempext < tempref) {

lcd.setCursor(10,1); //on place le curseur de l’écran LCD au début de la 1ère ligne
lcd.print(“G”);

digitalWrite(2, HIGH);}

else
{
 digitalWrite(2, LOW); // le relais est bas si la consigne de temperature n’est pas atteinte
lcd.setCursor(10,1); //on place le curseur de l’écran LCD au début de la 1ère ligne
lcd.print(“N”);
}
}
else
{
(payload.senderID==2);
     lcd.setCursor(0,2);
     lcd.print(“TEau:”);
     lcd.setCursor(5,2);
     lcd.print("      ");
     Serial.println(“eau”);
     lcd.setCursor(5,2);
     lcd.print(payload.sens1,1);
     float tempeau=payload.sens1;
     Serial.println(tempeau);      
}
}
}
}



ca n ' a pas l' air tres compliqué a faire .

il faut convertir ( temperatureEau / 2 ) en temps puis l ' ajouter a tempsDuMatin ( 8 H 30 ? )

certainement qu ' une conversion en temps unix simplifiera les choses .

Reflexion faite , ce n' est pas si clair que ca , que veux tu faire exactement ?

obtenir une durée de fonctionnement de la pompe pour chaque jour en fonction de la temperature divisee par 2 ?

je ne vois pas trop l ' interet , si la temperature est de 0 , ca devrait faire quoi ?
si la temperature est de 10 ° , ca devrait faire quoi ?
si la temperature est de **- 10 °** , ca devrait faire quoi ?

L’hiver, le système fonctionnera de 2h00 à 7h00 avec un système antigel (Pas de sujet de 0° à 10°…)
Autrement une fois la piscine en mode d’utilisation normale, le système doit réguler le temps de fonctionnement de la pompe (en général de fin avril à octobre et l’eau est au minimum à 17°)

J-M-L:
Dans le code que vous avez posté il n'y a rien qui a trait à 8h30 du matin.

--> Qu'est-ce que vous n'arrivez pas à faire, déclencher la lecture tous les jours à une heure donnée avec un DS3231 ou les maths sur le temps ? (en supposant que cela ait un sens)

Effectivement, il n'y avait rien sur le sujet dans mon premier code car je ne savais pas comment commencer.

tenez regardez ce petit code

/*
    Copyright (c) 2020 J-M-L  https://forum.arduino.cc/index.php?action=profile;u=438300
    Author        :   J-M-L
    Create Time   :   May 2020
    Change Log    :

    The MIT License (MIT)
    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:
    The above copyright notice and this permission notice shall be included in
    all copies or substantial portions of the Software.
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    THE SOFTWARE.

    USING LIBRARIES (c) their own authors. See their terms and conditions
    RTClib.h                https://github.com/adafruit/RTClib
    LiquidCrystal_I2C.h     https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
    
*/

/* L'HORLOGE DS3231 */
#include <RTClib.h>   // https://github.com/adafruit/RTClib
RTC_DS3231 rtc;

void prepareRTC()
{
  if (! rtc.begin()) {
    Serial.println(F("Horloge introuvable"));
    while (true);
  }

  // si on doit mettre à l'heure
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));   // pour dire à l'heure de la compilation
  // rtc.adjust(DateTime(2020, 5, 6, 8, 30, 0));      //  pour dire 6 mai 2020 à 8h30
}


/* LE LCD */
#include <LiquidCrystal_I2C.h>    // https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
const byte LCD_A = 0x3F;   // adresse du LCD en 0x3F
const byte LCD_L = 4;      // 4 Lignes
const byte LCD_C = 20;     // de 20 caractères
LiquidCrystal_I2C lcd(LCD_A , LCD_C, LCD_L);

void prepareLCD()
{
  lcd.begin();
  lcd.backlight();
}

// -------
void imprimeSur2Digits(Print& flux, uint8_t v, char remplissage = '0')
{
  if (v < 10) flux.write(remplissage);
  flux.print(v);
}

void afficheHeure(Print& flux, uint8_t h,  uint8_t m,  uint8_t s)
{
  imprimeSur2Digits(flux, h, ' ');
  flux.write(':');
  imprimeSur2Digits(flux, m);
  flux.write(':');
  imprimeSur2Digits(flux, s);
}

void afficheDate(Print& flux, uint8_t j,  uint8_t m,  uint8_t a)
{
  imprimeSur2Digits(flux, j, ' ');
  flux.write('/');
  imprimeSur2Digits(flux, m);
  flux.write('/');
  imprimeSur2Digits(flux, a);
}

void horloge(DateTime& quand)
{
  static uint32_t chrono = 0;
  if (millis() - chrono >= 1000UL) {
    lcd.setCursor(2, 0);
    afficheHeure(lcd, quand.hour(), quand.minute(), quand.second());
    lcd.write(' ');
    afficheDate(lcd, quand.day(), quand.month(), quand.year() - 2000);
    chrono = millis();
  }
}


void afficherAlarme(DateTime& quand)
{
  lcd.setCursor(0, 2);
  lcd.print(F("Prochaine Alarme:"));
  lcd.setCursor(0, 3);
  afficheHeure(lcd, quand.hour(), quand.minute(), quand.second());
  lcd.write(' ');
  afficheDate(lcd, quand.day(), quand.month(), quand.year() - 2000);
}

// -------------
const uint8_t heureAlarme = 10;
const uint8_t minuteAlarme = 1;
const uint8_t secondeAlarme = 40;

DateTime alarmeJournaliere;
const TimeSpan vingtQuatreHeures(24 * 3600UL);

void setup()
{
  Serial.begin(115200);
  prepareRTC();
  prepareLCD();
  DateTime maintenant = rtc.now();
  alarmeJournaliere = DateTime(maintenant.year(), maintenant.month(), maintenant.day(), heureAlarme, minuteAlarme, secondeAlarme);
  afficherAlarme(alarmeJournaliere);
}

void loop()
{
  DateTime maintenant = rtc.now();
  horloge(maintenant);

  // a-t-on atteint l'heur de l'alarme ?
  if (maintenant >= alarmeJournaliere) {
    lcd.clear();
    lcd.setCursor(5, 2);
    lcd.print(F("ALARME !!!"));
    
    // *******************
    // traiter l'alarme
    delay(5000); // ici on ne fait rien pendant 5 secondes 
    // *******************

    alarmeJournaliere = alarmeJournaliere + vingtQuatreHeures; // demain même heure
    afficherAlarme(alarmeJournaliere);
  }
}

il faut régler l'heure de l'alarme dans ces trois constantes ici 10h01 et 40 secondes

const uint8_t heureAlarme = 10;
const uint8_t minuteAlarme = 1;
const uint8_t secondeAlarme = 40;

j'utilise la bibliothèque RTClib.h qui a les classes DateTime et TimeSpan bien pratiques et qui simplifient la lecture du code (mais on pourrait faire pareil en passant le temps en secondes et traitant tout à la main).

bien sûr il ne faut pas garder la ligne

 rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));   // pour dire à l'heure de la compilation

si votre horloge est à l'heure.

j'utilise un écran 20 x 4 mais en changeant juste les setCursor() et la création du LCD vous pouvez passer sur un 16 x 2 facilement

lcd.png

lcd.png

Merci pour le code, je vais l'essayer tout à l’heure pour comprendre comment cela fonctionne.

Je reposte mon code car il y avait un seul relais qui gérait la partie antigel et la partie fonctionnement normal de la pompe.
Ce qui provoquait un arret de la pompe.
J’ai donc ajouter un relais qui fonctionne en parallèle du premier.
Par la suite j’ajouterai un bouton pour passer en mode hivernage ou normal.
Donc ma tempo fonctionne mais je n’arrive pas à prendre ma variable Offour et la diviser par deux et ainsi obtenir mon heure, enfin si je n’ai pas d’autres buggs dans mon code.

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h> 
#include <Wire.h>
#include <DS3231.h>
#include <math.h>

#define PINRELAIS 2
#define PINRELAIS 3
#define ADRESSE_I2C_RTC 0x68

LiquidCrystal_I2C lcd(0x27, 20, 4);  

RF24 radio(9,10); 
RF24Network network(radio);
const uint16_t this_node = 000;

struct payload_t
{
  byte senderID;
  float sens1;
};


float tempref=2;
float temprefmax=4;
float tempext;
float tempeau;
float tempeauref;
float tempeauref1;

DS3231 Clock;

bool Century=false;
bool h12;
bool h24;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits; // Alarm
bool ADy, A12h, Apm;  // Alarm

const int OnHour = 11;//Heure pour prendre la temperature
const int OnMin = 35;//Minute pour prendre la temperature
const int OffHour = 11;//Heure pour prendre la temperature
const int OffMin = 50;//Minute pour prendre la temperature

void setup(void)
{
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  Wire.begin();
  lcd.begin();
  lcd.clear();
  lcd.backlight();
  lcd.display(); 
  lcd.setCursor(2,0);  
  lcd.print("Automatique Pool"); 
  lcd.setCursor(0,1);  
  lcd.print("TExt:");   
  lcd.setCursor(0,2);  
  lcd.print("TEau:");
  
Serial.begin(9600);
Serial.println("RF24 Network Rx-DS18B20");
SPI.begin();
radio.setPALevel(RF24_PA_MAX);
radio.begin();
network.begin(/*channel*/ 88, /*node address*/ this_node); 
}
void loop(void)
{
{
  lcd.setCursor(2,0);  
  lcd.print("Automatique Pool");
  lcd.setCursor(12,1);
  // nom du jour
  switch (Clock.getDoW())
  { case 1: lcd.print("Lundi   "); break;
    case 2: lcd.print("Mardi   "); break;
    case 3: lcd.print("Mercredi"); break;
    case 4: lcd.print("Jeudi   "); break;
    case 5: lcd.print("Vendredi"); break;
    case 6: lcd.print("Samedi  "); break;
    case 7: lcd.print("Dimanche"); break;
    }

   // jour
   lcd.setCursor(12,2);
    if (Clock.getDate() <10){
    lcd.print("0");
    } 
     
  lcd.print(Clock.getDate(), DEC);
  lcd.print("/");

lcd.setCursor(16,2);
  lcd.print(Clock.getMonth(Century), DEC);
  //lcd.print("/");
  // mois
  switch (Clock.getMonth(Century))
   { case 1:  lcd.print("01"); break;
    case 2:  lcd.print("02"); break;
    case 3:  lcd.print("03"); break;
    case 4:  lcd.print("04"); break;
    case 5:  lcd.print("05"); break;
    case 6:  lcd.print("06"); break;
    case 7:  lcd.print("07"); break;
    case 8:  lcd.print("08"); break;
    case 9:  lcd.print("09"); break;
    case 10: lcd.print("10"); break;
    case 11: lcd.print("11"); break;
    case 12: lcd.print("12");
   }
     
  lcd.setCursor(17,2);
  lcd.print("/");
  lcd.print(Clock.getYear(), DEC);

   // Heure
   lcd.setCursor(12,3);
    if (Clock.getHour(h24,PM) <10){
    lcd.print("0");
     } 
   lcd.print(Clock.getHour(h24,PM), DEC);
   lcd.print(":");
   
    // Minute
    if (Clock.getMinute() <10){
    lcd.print("0");
    } 
    lcd.print(Clock.getMinute(), DEC);
    lcd.print(":");

    // Seconde
    if (Clock.getSecond() <10){
    lcd.print("0");
    }
    lcd.print(Clock.getSecond(), DEC);

    // Temperature en degré celsius
   lcd.setCursor(0,3);
   lcd.print("TInt:");
   lcd.setCursor(5,3);
   lcd.print(Clock.getTemperature(), 1);
   
    
    }
network.update();
while ( network.available())
{
//lcd.clear();
RF24NetworkHeader header;
payload_t payload;
network.read(header,&payload,sizeof(payload)); 
Serial.print("Sensor: ");
Serial.print(payload.senderID);
Serial.print(" ");
Serial.print("Temp: "); 
Serial.print(payload.sens1,1);
Serial.println(" C");

{
if (payload.senderID==1){

lcd.setCursor(0,1);  
lcd.print("TExt:");
lcd.setCursor(5,1);
lcd.print("      ");
lcd.setCursor(5,1);
Serial.println("ext"); 
lcd.print(payload.sens1,1);
float tempext=payload.sens1;
Serial.println(tempext); 
 if (tempext < tempref) {

lcd.setCursor(10,1); //on place le curseur de l'écran LCD au début de la 1ère ligne
lcd.print("G"); 

digitalWrite(2, HIGH);}

else
{
  if (tempext > temprefmax) {
  digitalWrite(2, LOW); // le relais est bas si la consigne de temperature n'est pas atteinte
lcd.setCursor(10,1); //on place le curseur de l'écran LCD au début de la 1ère ligne
lcd.print("N");
}
}
}
else
{
(payload.senderID==2);
      lcd.setCursor(0,2);
      lcd.print("TEau:");
      lcd.setCursor(5,2);
      lcd.print("      ");
      Serial.println("eau"); 
      lcd.setCursor(5,2);
      lcd.print(payload.sens1,1);
      float tempeau=payload.sens1;
      int tempeau1 = ceil(tempeau);
      int tempeauref=tempeau1;
      Serial.println(tempeau); 
      Serial.println(tempeauref);      
}
}
}
if(Clock.getHour (h24,PM)== OnHour && Clock.getMinute ()== OnMin){
    const int OffHour = tempeauref;
    Serial.println(OffHour);
    digitalWrite(3, HIGH);
    delay (1000);
    }
    else if(Clock.getHour (h24,PM)== OffHour && Clock.getMinute ()== OffMin){
    digitalWrite(3, LOW);
    delay (1000);
      }
      }

if(Clock.getHour (h24,PM)== OnHour && Clock.getMinute ()== OnMin){
int OffHour = tempeauref/2; -> partie du code qui ne fonctionne pas
Serial.println(OffHour);
digitalWrite(3, HIGH);
delay (1000);

Alors cela me declanche bien mon relais à l'heure voulu par contre OffHour me retourne 0 (c'est ce que m'affiche le serial.print) au lieu de la moitié de tempauref

ligne 210 de votre code , si vous remplacez const int OffHour = tempeauref;
par : int OffHour = ceil(tempeau);

obtenez vous bien une temperature adequate a celle que vous cherchez ?

iznobe:
ligne 210 de votre code , si vous remplacez const int OffHour = tempeauref;
par : int OffHour = ceil(tempeau);

obtenez vous bien une temperature adequate a celle que vous cherchez ?

Pas mieux, voici le retour de la variable à 14:10:06 (heure de l’activation du relais et normalement de l’ecriture de la temperature):

14:03:13.816 → RF24 Network Rx-DS18B20
14:04:32.349 → Sensor: 1 Temp: 27.6 C
14:04:32.349 → ext
14:04:32.395 → 27.62
14:08:27.037 → Sensor: 2 Temp: 21.1 C
14:08:27.037 → eau
14:08:27.084 → 21.06
14:08:27.084 → 22
14:09:47.587 → Sensor: 1 Temp: 27.4 C
14:09:47.634 → ext
14:09:47.634 → 27.44
14:10:06.515 → 0 → Serial.println(OffHour)
14:10:07.594 → 0 → Serial.println(OffHour)
14:10:08.673 → 0 → Serial.println(OffHour)
14:10:09.797 → 0 → Serial.println(OffHour)

Le code actuel:

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h> 
#include <Wire.h>
#include <DS3231.h>
#include <math.h>

#define PINRELAIS 2
#define PINRELAIS 3
#define ADRESSE_I2C_RTC 0x68

LiquidCrystal_I2C lcd(0x27, 20, 4);  

RF24 radio(9,10); 
RF24Network network(radio);
const uint16_t this_node = 000;

struct payload_t
{
  byte senderID;
  float sens1;
};


float tempref=2;
float temprefmax=4;
float tempext;
float tempeau;
float tempeauref;
float tempeauref1;

DS3231 Clock;

bool Century=false;
bool h12;
bool h24;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits; // Alarm
bool ADy, A12h, Apm;  // Alarm

const int OnHour = 14;//Heure pour prendre la temperature
const int OnMin = 10;//Minute pour prendre la temperature
int OffHour = 14;//Heure pour prendre la temperature
const int OffMin = 20;//Minute pour prendre la temperature

void setup(void)
{
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  Wire.begin();
  lcd.begin();
  lcd.clear();
  lcd.backlight();
  lcd.display(); 
  lcd.setCursor(2,0);  
  lcd.print("Automatique Pool"); 
  lcd.setCursor(0,1);  
  lcd.print("TExt:");   
  lcd.setCursor(0,2);  
  lcd.print("TEau:");
  
Serial.begin(9600);
Serial.println("RF24 Network Rx-DS18B20");
SPI.begin();
radio.setPALevel(RF24_PA_MAX);
radio.begin();
network.begin(/*channel*/ 88, /*node address*/ this_node); 
}
void loop(void)
{
{
  lcd.setCursor(2,0);  
  lcd.print("Automatique Pool");
  lcd.setCursor(12,1);
  // nom du jour
  switch (Clock.getDoW())
  { case 1: lcd.print("Lundi   "); break;
    case 2: lcd.print("Mardi   "); break;
    case 3: lcd.print("Mercredi"); break;
    case 4: lcd.print("Jeudi   "); break;
    case 5: lcd.print("Vendredi"); break;
    case 6: lcd.print("Samedi  "); break;
    case 7: lcd.print("Dimanche"); break;
    }

   // jour
   lcd.setCursor(12,2);
    if (Clock.getDate() <10){
    lcd.print("0");
    } 
     
  lcd.print(Clock.getDate(), DEC);
  lcd.print("/");

lcd.setCursor(16,2);
  lcd.print(Clock.getMonth(Century), DEC);
  //lcd.print("/");
  // mois
  switch (Clock.getMonth(Century))
   { case 1:  lcd.print("01"); break;
    case 2:  lcd.print("02"); break;
    case 3:  lcd.print("03"); break;
    case 4:  lcd.print("04"); break;
    case 5:  lcd.print("05"); break;
    case 6:  lcd.print("06"); break;
    case 7:  lcd.print("07"); break;
    case 8:  lcd.print("08"); break;
    case 9:  lcd.print("09"); break;
    case 10: lcd.print("10"); break;
    case 11: lcd.print("11"); break;
    case 12: lcd.print("12");
   }
     
  lcd.setCursor(17,2);
  lcd.print("/");
  lcd.print(Clock.getYear(), DEC);

   // Heure
   lcd.setCursor(12,3);
    if (Clock.getHour(h24,PM) <10){
    lcd.print("0");
     } 
   lcd.print(Clock.getHour(h24,PM), DEC);
   lcd.print(":");
   
    // Minute
    if (Clock.getMinute() <10){
    lcd.print("0");
    } 
    lcd.print(Clock.getMinute(), DEC);
    lcd.print(":");

    // Seconde
    if (Clock.getSecond() <10){
    lcd.print("0");
    }
    lcd.print(Clock.getSecond(), DEC);

    // Temperature en degré celsius
   lcd.setCursor(0,3);
   lcd.print("TInt:");
   lcd.setCursor(5,3);
   lcd.print(Clock.getTemperature(), 1);
   
    
    }
network.update();
while ( network.available())
{
//lcd.clear();
RF24NetworkHeader header;
payload_t payload;
network.read(header,&payload,sizeof(payload)); 
Serial.print("Sensor: ");
Serial.print(payload.senderID);
Serial.print(" ");
Serial.print("Temp: "); 
Serial.print(payload.sens1,1);
Serial.println(" C");

{
if (payload.senderID==1){

lcd.setCursor(0,1);  
lcd.print("TExt:");
lcd.setCursor(5,1);
lcd.print("      ");
lcd.setCursor(5,1);
Serial.println("ext"); 
lcd.print(payload.sens1,1);
float tempext=payload.sens1;
Serial.println(tempext); 
 if (tempext < tempref) {

lcd.setCursor(10,1); //on place le curseur de l'écran LCD au début de la 1ère ligne
lcd.print("G"); 

digitalWrite(2, HIGH);}

else
{
  if (tempext > temprefmax) {
  digitalWrite(2, LOW); // le relais est bas si la consigne de temperature n'est pas atteinte
lcd.setCursor(10,1); //on place le curseur de l'écran LCD au début de la 1ère ligne
lcd.print("N");
}
}
}
else
{
(payload.senderID==2);
      lcd.setCursor(0,2);
      lcd.print("TEau:");
      lcd.setCursor(5,2);
      lcd.print("      ");
      Serial.println("eau"); 
      lcd.setCursor(5,2);
      lcd.print(payload.sens1,1);
      float tempeau=payload.sens1;
      int tempeau1 = ceil(tempeau);
      int tempeauref=tempeau1;
      Serial.println(tempeau); 
      Serial.println(tempeauref);      
}
}
}
if(Clock.getHour (h24,PM)== OnHour && Clock.getMinute ()== OnMin){
    int OffHour = ceil(tempeau);
    Serial.println(OffHour);
    digitalWrite(3, HIGH);
    delay (1000);
    }
    else if(Clock.getHour (h24,PM)== OffHour && Clock.getMinute ()== OffMin){
    digitalWrite(3, LOW);
    delay (1000);
      }
      }

le truc c ' est que votre code est un peu " brouillon " , il y a des variables qui sont declarées localement et globales et qui portent le meme nom .

Ca n' est pas possible de gerer cela !

donner des noms unique a vos variables et plus explicites , ca sera plus facile de se reperer dans votre code .

Par exemple , ligne 27 a 32 vous avez une serie de vraiables globales :

float tempref=2;
float temprefmax=4;
float tempext;
float tempeau;
float tempeauref;
float tempeauref1;

puis , ligne 173 :

float tempext=payload.sens1;

ca ne peut pas etre comme ca , on ne sait plus si c ' est la variable globale ou pas plus tard dans le code !

soit vous y donnez un nom different si ce n' est pas la meme , soit vous lui attribuez une valeur , et dans ce cas vous devez ecrire :

tempext=payload.sens1;

idem pour tempeau et tempeau ref !
et par la suite vous pouvez l' utilisez ou vous en avez envie partout dans le code .

dans google , recherchez et lisez " portée des variables en C++ " .

vu comment votre code est ecrit et le nombre de variables que vous declarez , je pense que ca vous sera tres utiles , de plus lorsque vous aurez assimilez la portée des variables en fonction d ' ou on les declare , vous pourrez facilement corrigez votre code et resoudre votre probleme :slight_smile:

lorsque vous avez corrigé votre code , ou des questions dites nous , je pense que vous allez y arrivés sans difficulté , car c ' est un concept tres simple a comprendre .

Si je resume , quand vous faites une declaration de variable ( locale ) a l ' interieur de " { " et " } " , la variable que vous declarez est bloquée par les accolades , on ne peut pas recuperez sa valeur en dehors de ses memes accolades .

les variables globales , ne sont pas entre accolades .

Si c ' est pour convertir les floats en int ne mettez pas 2 variables , preferez plutot un resultat tronqué avec : printf("%.2f",ton_float);

iznobe:
le truc c ' est que votre code est un peu " brouillon " , il y a des variables qui sont declarées localement et globales et qui portent le meme nom .

Ca n' est pas possible de gerer cela !

donner des noms unique a vos variables et plus explicites , ca sera plus facile de se reperer dans votre code .

Par exemple , ligne 27 a 32 vous avez une serie de vraiables globales :

float tempref=2;

float temprefmax=4;
float tempext;
float tempeau;
float tempeauref;
float tempeauref1;



puis , ligne 173 :


float tempext=payload.sens1;




ca ne peut pas etre comme ca , on ne sait plus si c ' est la variable globale ou pas plus tard dans le code !

soit vous y donnez un nom different si ce n' est pas la meme , soit vous lui attribuez une valeur , et dans ce cas vous devez ecrire :


tempext=payload.sens1;



idem pour tempeau et tempeau ref !
et par la suite vous pouvez l' utilisez ou vous en avez envie partout dans le code .

dans google , recherchez et lisez " portée des variables en C++ " .

vu comment votre code est ecrit et le nombre de variables que vous declarez , je pense que ca vous sera tres utiles , de plus lorsque vous aurez assimilez la portée des variables en fonction d ' ou on les declare , vous pourrez facilement corrigez votre code et resoudre votre probleme :) 

lorsque vous avez corrigé votre code , ou des questions dites nous , je pense que vous allez y arrivés sans difficulté , car c ' est un concept tres simple a comprendre .

Si je resume , quand vous faites une declaration de variable ( locale ) a l ' interieur de " { " et " } " , la variable que vous declarez est bloquée par les accolades , on ne peut pas récupérez sa valeur en dehors de ses memes accolades .

les variables globales , ne sont pas entre accolades .

Effectivement, je vais remettre de l'ordre dans mes variables.
Sauf que payload.sens1 est issu d'une structure et prend deux valeurs (température et ensuite température de l'eau suivant l'ordre d'arrivé).
Donc cela va être compliqué pour faire tempext=payload.sens1, par contre comment pérenniser cette variable que j'arrive à avoir à ce niveau?(promis après je nettoie mes variables):

(payload.senderID==2);
lcd.setCursor(0,2);
lcd.print("TEau:");
lcd.setCursor(5,2);
lcd.print(" ");
Serial.println("eau");
lcd.setCursor(5,2);
lcd.print(payload.sens1,1);
float tempeau=payload.sens1;
int tempeau1 = ceil(tempeau); -> essai pour récupérer la variable
int tempeauref=tempeau1; -> essai pour récupérer la variable
Serial.println(tempeau); -> essai pour récupérer la variable
Serial.println(tempeauref) -> essai pour récupérer la variable

Dans vos essais pour recuperer la variable , cela ne marchera pas , a cause de la portée des variables , sauf si vous utilisez ( ou declarez une nouvelle ) variable globale .

par exemple dans la ligne 33 si vous ajoutez une variable globale et que vous stockez la valeur dedans :

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <DS3231.h>
#include <math.h>

#define PINRELAIS 2
#define PINRELAIS 3
#define ADRESSE_I2C_RTC 0x68

LiquidCrystal_I2C lcd(0x27, 20, 4);  

RF24 radio(9,10);
RF24Network network(radio);
const uint16_t this_node = 000;

struct payload_t
{
  byte senderID;
  float sens1;
};


float tempref=2;
float temprefmax=4;
float tempext;
float tempeau;
float tempeauref;
float tempeauref1;
float testRecupTempEau;

DS3231 Clock;

bool Century=false;
bool h12;
bool h24;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits; // Alarm
bool ADy, A12h, Apm;  // Alarm

const int OnHour = 11;//Heure pour prendre la temperature
const int OnMin = 35;//Minute pour prendre la temperature
const int OffHour = 11;//Heure pour prendre la temperature
const int OffMin = 50;//Minute pour prendre la temperature

void setup(void)
{
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  Wire.begin();
  lcd.begin();
  lcd.clear();
  lcd.backlight();
  lcd.display();
  lcd.setCursor(2,0);  
  lcd.print("Automatique Pool");
  lcd.setCursor(0,1);  
  lcd.print("TExt:");  
  lcd.setCursor(0,2);  
  lcd.print("TEau:");
  
Serial.begin(9600);
Serial.println("RF24 Network Rx-DS18B20");
SPI.begin();
radio.setPALevel(RF24_PA_MAX);
radio.begin();
network.begin(/*channel*/ 88, /*node address*/ this_node);
}
void loop(void)
{
{
  lcd.setCursor(2,0);  
  lcd.print("Automatique Pool");
  lcd.setCursor(12,1);
  // nom du jour
  switch (Clock.getDoW())
  { case 1: lcd.print("Lundi   "); break;
    case 2: lcd.print("Mardi   "); break;
    case 3: lcd.print("Mercredi"); break;
    case 4: lcd.print("Jeudi   "); break;
    case 5: lcd.print("Vendredi"); break;
    case 6: lcd.print("Samedi  "); break;
    case 7: lcd.print("Dimanche"); break;
    }

   // jour
   lcd.setCursor(12,2);
    if (Clock.getDate() <10){
    lcd.print("0");
    }
    
  lcd.print(Clock.getDate(), DEC);
  lcd.print("/");

lcd.setCursor(16,2);
  lcd.print(Clock.getMonth(Century), DEC);
  //lcd.print("/");
  // mois
  switch (Clock.getMonth(Century))
   { case 1:  lcd.print("01"); break;
    case 2:  lcd.print("02"); break;
    case 3:  lcd.print("03"); break;
    case 4:  lcd.print("04"); break;
    case 5:  lcd.print("05"); break;
    case 6:  lcd.print("06"); break;
    case 7:  lcd.print("07"); break;
    case 8:  lcd.print("08"); break;
    case 9:  lcd.print("09"); break;
    case 10: lcd.print("10"); break;
    case 11: lcd.print("11"); break;
    case 12: lcd.print("12");
   }
    
  lcd.setCursor(17,2);
  lcd.print("/");
  lcd.print(Clock.getYear(), DEC);

   // Heure
   lcd.setCursor(12,3);
    if (Clock.getHour(h24,PM) <10){
    lcd.print("0");
     }
   lcd.print(Clock.getHour(h24,PM), DEC);
   lcd.print(":");
  
    // Minute
    if (Clock.getMinute() <10){
    lcd.print("0");
    }
    lcd.print(Clock.getMinute(), DEC);
    lcd.print(":");

    // Seconde
    if (Clock.getSecond() <10){
    lcd.print("0");
    }
    lcd.print(Clock.getSecond(), DEC);

    // Temperature en degré celsius
   lcd.setCursor(0,3);
   lcd.print("TInt:");
   lcd.setCursor(5,3);
   lcd.print(Clock.getTemperature(), 1);
  
    
    }
network.update();
while ( network.available())
{
//lcd.clear();
RF24NetworkHeader header;
payload_t payload;
network.read(header,&payload,sizeof(payload));
Serial.print("Sensor: ");
Serial.print(payload.senderID);
Serial.print(" ");
Serial.print("Temp: ");
Serial.print(payload.sens1,1);
Serial.println(" C");

{
if (payload.senderID==1){

lcd.setCursor(0,1);  
lcd.print("TExt:");
lcd.setCursor(5,1);
lcd.print("      ");
lcd.setCursor(5,1);
Serial.println("ext");
lcd.print(payload.sens1,1);
float tempext=payload.sens1;
Serial.println(tempext);
 if (tempext < tempref) {

lcd.setCursor(10,1); //on place le curseur de l'écran LCD au début de la 1ère ligne
lcd.print("G");

digitalWrite(2, HIGH);}

else
{
  if (tempext > temprefmax) {
  digitalWrite(2, LOW); // le relais est bas si la consigne de temperature n'est pas atteinte
lcd.setCursor(10,1); //on place le curseur de l'écran LCD au début de la 1ère ligne
lcd.print("N");
}
}
}
else
{
(payload.senderID==2);
      lcd.setCursor(0,2);
      lcd.print("TEau:");
      lcd.setCursor(5,2);
      lcd.print("      ");
      Serial.println("eau");
      lcd.setCursor(5,2);
      lcd.print(payload.sens1,1);
      testRecupTempEau=payload.sens1,1;
      tempeau=payload.sens1;
      int tempeau1 = ceil(tempeau);
      int tempeauref=tempeau1;
      Serial.print("variable tempeau = ");
      Serial.println(tempeau);
      Serial.print("variable testRecupTempEau = ");
      Serial.println(testRecupTempEau);      
}
}
}
if(Clock.getHour (h24,PM)== OnHour && Clock.getMinute ()== OnMin){
    //const int OffHour = tempeauref;
    Serial.println(testRecupTempEau);
    if (testRecupTempEau) {
      digitalWrite(3, HIGH);
      delay (1000);
      }
    }
    else if(Clock.getHour (h24,PM)== OffHour && Clock.getMinute ()== OffMin){
      digitalWrite(3, LOW);
      delay (1000);
      }
    }