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

pour debugguer plus facilement grace au moniteur serie je vous conseille d ' ajouter le nom de la variable afficher dans votre code , pour l ' instant le programme est petit ca va a peu pres , mais plus tard ...

faites par exemple :

Serial.print("variable tempeau = ");
      Serial.println(tempeau);
      Serial.print("variable testRecupTempEau = ");
      Serial.println(testRecupTempEau);

comme ca vous etes sur de ce que vous affichez comme variable , c ' est plus facile pour s ' y retrouver . :wink:

Mon problème ne se situe pas au niveau des lignes 193 à 208, car j’arrivais déjà à mettre ma variable là ou je voulais.

Mon problème se situe lorsque je veux inscrire la variable tempeau doit etre ecrite dans OffHour:

Voici l’affichage série:
18:01:18.054 → RF24 Network Rx-DS18B20
18:06:06.547 → Sensor: 1 Temp: 25.2 C
18:06:06.547 → ext
18:06:06.547 → 25.25
18:06:22.333 → Sensor: 2 Temp: 22.0 C
18:06:22.333 → eau
18:06:22.333 → variable tempeau = 22
18:10:06.184 → OffHour=0

tempeau est de 22 et je devrais avoir OffHour=11.

A ce que j’ai compris, le resultat tempeau obtenu entre {} ne peut pas etre sorti, il y a certainement une solution mais je ne la connais pas.

#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;

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 = 18;//Heure pour prendre la temperature
const int OnMin = 10;//Minute pour prendre la temperature
int OffHour = 18;//Heure pour prendre la temperature
const int OffMin = 12;//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);
      int tempeau=ceil(payload.sens1);
      Serial.print("variable tempeau = ");
      Serial.println(tempeau); 
      }
}
}
if(Clock.getHour (h24,PM)== OnHour && Clock.getMinute ()== OnMin){
    int OffHour = tempeau/2;
    Serial.print("OffHour=");
    Serial.println(OffHour);
    digitalWrite(3, HIGH);
    delay (1000);
    }
    else if(Clock.getHour (h24,PM)== OffHour && Clock.getMinute ()== OffMin){
    digitalWrite(3, LOW);
    delay (1000);
      }
      }

ben je t ' ai deja tout expiqué dans les posts d' avant , la variable tempeau s ' affiche maintenant et tu peux l ' utiliser nimporte ou ( j ' ai modifié le code pour que la variable soit globale ) avant , non .

mais tu as deja une constante globale du meme nom ( Offhour ) declarée dans ton code , ca ne peut pas marcher !

essaie ca :

#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){    
    if (testRecupTempEau) {
      Serial.print("testRecupTempEau = ");
      Serial.println(testRecupTempEau);
      
      uint8_t tempsArretPompeSup = tempeau/2;
      Serial.print("tempsArretPompeSup = ");
      Serial.println(tempsArretPompeSup);
      
      digitalWrite(3, HIGH);
      delay (1000);
      }
    }
    else if(Clock.getHour (h24,PM)== OffHour && Clock.getMinute ()== OffMin){
      digitalWrite(3, LOW);
      delay (1000);
      }
    }

Ca fonctionne, peux tu m'expliquer ce que uint8_t a comme influence au lieu de float ou int?
Il me reste à ajouter 8 à testRecupTempEau et à mettre le resultat OffHour2 à la place de OffHour ci dessous:

else if(Clock.getHour (h24,PM)== OffHour && Clock.getMinute ()== OffMin)

uint8_t et byte sont 2 types de variables identiques l ' une pour le C++ et l ' autre pour l ' IDE , mais en realité c ' est la meme chose .
" u int 8 " ca veut dire unsigned integer code sur 8 bits . concretement c ' est un type de variable qui peut stocker uniquement des nombres entiers non signés de 0 a 255 a cause de la place qu ' elle occupe en memoire ( 8 bits )
un int prends 16 bits de memoire , mais peut stocker un nombre jusqu ' a 32000 et des brouettes .

float , c ' est un nombre flottant a virgule . pour plus de details sur les types de vriables : recherche types variables c++.

tu ne devrais pas attribuer une autre variable dans ton programme au contraire il y en a deja trop ! et il faut enlever celles qui ne sont pas indispensables .
lorsqu ' on cree une variable , c ' est pour s' en reservir plusieurs fois tout au long d' une partie du programme .

par exemple , la variable de test que j ' ai ajouté : tempsArretPompeSup n ' est pas indispensable si tu ne t ' en sers qu ' une fois . tu peux tres bien juste mettre a la place le calcul directement ( tempeau/2 ) là ou tu en as besoin , ca permet de ne pas gaspiller de memoire .

si ca va servir a plusieurs endroits , le mettre en memoire est une bonne idée .

Pour le noms des variables , n ' hesite pas a mettre des noms qui explique bien ce que c ' est et meme inclure le type dedans le nom , ensuite il faut abuser du copier coller , pour ne pas reecrire les noms a rallonge dans le code .

Autre chose , nettoyez votre code au niveau des variables, ne gardez que celles indispensables surtout si vous comptez ajouter des choses , sinon ca va vite devenir la cata et vous risquez de vous y perdre .
Ajoutez des commentaires qui expliquent ce que vous faites , ou essayer de faire , indentez votre code correctement :

if(Clock.getHour (h24,PM)== OnHour && Clock.getMinute ()== OnMin) {
	if (testRecupTempEau) {
		Serial.print("testRecupTempEau = ");
		Serial.println(testRecupTempEau);
     
		uint8_t tempsArretPompeSup = tempeau/2;
		Serial.print("tempsArretPompeSup = ");
		Serial.println(tempsArretPompeSup);
     
		digitalWrite(3, HIGH);
		delay (1000);
	}
}
else if(Clock.getHour (h24,PM)== OffHour && Clock.getMinute ()== OffMin) {
	digitalWrite(3, LOW);
	delay (1000);
	}
}

ici les differentes parties du code sont bien separées , on voit tout de suite dans quelle partie on est et c' est plus agreable a lire et a comprendre que :

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

iznobe:
uint8_t et byte sont 2 types de variables identiques l ' une pour le C++ et l ' autre pour l ' IDE , mais en realité c ' est la meme chose .
" u int 8 " ca veut dire unsigned integer code sur 8 bits . concretement c ' est un type de variable qui peut stocker uniquement des nombres entiers non signés de 0 a 255 a cause de la place qu ' elle occupe en memoire ( 8 bits )
un int prends 16 bits de memoire , mais peut stocker un nombre jusqu ' a 32000 et des brouettes .

float , c ' est un nombre flottant a virgule . pour plus de details sur les types de vriables : recherche types variables c++.

tu ne devrais pas attribuer une autre variable dans ton programme au contraire il y en a deja trop ! et il faut enlever celles qui ne sont pas indispensables .
lorsqu ' on cree une variable , c ' est pour s' en reservir plusieurs fois tout au long d' une partie du programme .

par exemple , la variable de test que j ' ai ajouté : tempsArretPompeSup n ' est pas indispensable si tu ne t ' en sers qu ' une fois . tu peux tres bien juste mettre a la place le calcul directement ( tempeau/2 ) là ou tu en as besoin , ca permet de ne pas gaspiller de memoire .

si ca va servir a plusieurs endroits , le mettre en memoire est une bonne idée .

Pour le noms des variables , n ' hesite pas a mettre des noms qui explique bien ce que c ' est et meme inclure le type dedans le nom , ensuite il faut abuser du copier coller , pour ne pas reecrire les noms a rallonge dans le code .

Autre chose , nettoyez votre code au niveau des variables, ne gardez que celles indispensables surtout si vous comptez ajouter des choses , sinon ca va vite devenir la cata et vous risquez de vous y perdre .
Ajoutez des commentaires qui expliquent ce que vous faites , ou essayer de faire , indentez votre code correctement :

if(Clock.getHour (h24,PM)== OnHour && Clock.getMinute ()== OnMin) {
if (testRecupTempEau) {
	Serial.print("testRecupTempEau = ");
	Serial.println(testRecupTempEau);

uint8_t tempsArretPompeSup = tempeau/2;
Serial.print("tempsArretPompeSup = ");
Serial.println(tempsArretPompeSup);
   
digitalWrite(3, HIGH);
delay (1000);
}
}
else if(Clock.getHour (h24,PM)== OffHour && Clock.getMinute ()== OffMin) {
digitalWrite(3, LOW);
delay (1000);
}
}




ici les differentes parties du code sont bien separées , on voit tout de suite dans quelle partie on est et c' est plus agreable a lire et a comprendre que :


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

La mise au propre sera fait à la fin :wink:

Alors c'est tout bon pour l'extraction de la température et le calcul.
Par contre OffHour (11(il est 22heure)+ (22/2)) ne coupe pas mon relais, je pense que OffHour garde la variable en entrée de programme lorsque je déclare la variable Offhour par int OffHour=21 (le 21 correspondait à 21 heure ce soir pour mes essais).

if(Clock.getHour (h24,PM)== OnHour && Clock.getMinute ()== OnMin){
if (testRecupTempEau) {
Serial.print("testRecupTempEau = ");
Serial.println(testRecupTempEau);

uint8_t tempsArretPompeSup = ceil((float)tempeau/2);
Serial.print("tempsArretPompeSup = ");
Serial.println(tempsArretPompeSup);
int b=tempsArretPompeSup;
int a=8;
int OffHour=0;
OffHour=a+b;
Serial.print("OffHour = ");
Serial.println(OffHour);
digitalWrite(3, HIGH);
//delay (1000);
}
}
else if(Clock.getHour (h24,PM)== OffHour && Clock.getMinute ()== OffMin){
Serial.print("Arret pompe = ");
Serial.println(OffHour);
digitalWrite(3, LOW);
delay (1000);
}
}

Bonsoir à vous,

Après pas mal d'essai, je ne comprends pas pourquoi mon code ne fonctionne pas:

if(Clock.getHour (h24,PM)== OnHour && Clock.getMinute ()== OnMin){   
    if (testRecupTempEau) {
      Serial.print("testRecupTempEau = ");
      Serial.println(testRecupTempEau);
      
      uint8_t tempsArretPompeSup = ceil((float)tempeau/2);
      Serial.print("tempsArretPompeSup = ");
      Serial.println(tempsArretPompeSup);
      int b=tempsArretPompeSup;
      int a=10;
      int OffHour=0;
      uint8_t OffHour1=a+b;
      Serial.print("OffHour1 = ");
      Serial.println(OffHour1);
      digitalWrite(3, HIGH);
      delay (1000);
      }
    }
    else if(Clock.getHour (h24,PM)== OffHour1 && Clock.getMinute ()== OffMin){    
      Serial.print("Arret pompe = ");
      digitalWrite(3, LOW);
      delay (1000);
      }

Mon relai s'active bien mais ne se coupe pas à l'heure voulu.

Voici le début du code où je mets les variables:

// définition des variables pour la mise en route de la pompe à heure fixe et arret à heure variable mais minute fixe
const int OnHour = 21;//Heure pour prendre la temperature
const int OnMin = 56;//Minute pour prendre la temperature
//int OffHour = 21;//Heure pour prendre la temperature
const int OffMin = 57;//Minute pour prendre la temperature
float testRecupTempEau;
int OffHour;
int OffHour1;

Lorsque le programme tourne, la variable OffHour1 = 21 (j'ai cette valeur pour tester avec l'heure réelle de mon DS3231) s'affiche bien grâce au code de Iznob.

Par contre, j'ai l'impression que cette variable ne fonctionne pas au niveau de else if(Clock.getHour (h24,PM)== OffHour1 && Clock.getMinute ()== OffMin), mon relai ne se coupe pas.

Par contre si je passe avec des horaires définies temps au niveau debut que fin, le relai fonctionne bien

Je comprends ce qui m'a été dit "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 .".
Mais je ne sais pas comment prendre la valur OffHour1, garder la valeur pour l'appliquer dans la ligne else if pour avoir mon heure de coupure.

Merci pour votre aide...et vos lanternes

Salut ,

il faut vraiment que vous regardiez le cours sur les variables de openclassroom par exemple , voici le lien

il est difficile de travaillez sur votre code , car les noms de variables sont confus , des variables locales et globales ont le meme nom , il y a trop de variables :
ceci n ' est pas bon et ne fait que compliquer les choses ( sans compter la redefinition de Offhour1 et de OffHour ) :

int b=tempsArretPompeSup;
      int a=10;
      int OffHour=0;
      uint8_t OffHour1=a+b;

simplement ca est suffisant :

    OffHour=0;
    Offhour1 = 10 + tempsArretPompeSup;

le code est plus facile a lire et a comprendre , il n ' y a pas de redefinition erreur de variable , on a pas de variable inutile .

Vous voulez faire du net plus tard OK , mais bon je vous conseille de le faire avant , ca vous facilitera les choses .
Si vous voulez avancé un tant soit peu , vous devez absolument comprendre le principe de la portée des variables , leurs types etc , c ' est la base meme de tout langage de programmation .

je vous conseille fortement le cours dont j' ai mis le lien plus dans ma premiere phrase , a lire et relire jusqu ' a comprehension integrale , faites les exercices , des tests , mettez des variables UNIQUEMENT quand c ' est necessaire , declarez les au bon endroit en fonction de la ou vous devez y acceder dans la suite de votre code et voous trouverez la solution .

PS : Dans le code que je vous ai donné j ' ai volontairement creer une variable locale a la place d ' une globale , pour voir si vous aviez fait l ' effort de comprendre , ca n ' a pas l ' air d ' etre le cas .

Bonjour à vous,

Merci pour vos explications et votre implication pour m'aider.
En faisant mes essais j'avais vu que la variable était locale car {}, j'ai donc fouillé le net pour pouvoir extraire ce resultat et j'ai trouvé cela :

Portée (visibilité) des variables

Selon l'endroit où on déclare une variable, celle-ci pourra être accessible (visible) de partout dans le code ou bien que dans une portion confinée de celui-ci (à l'intérieur d'une fonction par exemple), on parle de portée (ou visibilité) d'une variable.

Lorsqu'une variable est déclarée dans le code même, c'est-à-dire à l'extérieur de toute fonction ou de tout bloc d'instruction, elle est accessible de partout dans le code (n'importe quelle fonction du programme peut faire appel à cette variable). On parle alors de variable globale.

Lorsque l'on déclare une variable à l'intérieur d'un bloc d'instructions (entre des accolades), sa portée se confine à l'intérieur du bloc dans lequel elle est déclarée.

Une variable déclarée au début du code, c'est-à-dire avant tout bloc de donnée, sera globale, on pourra alors l'utiliser à partir de n'importe quel bloc d'instruction.
Une variable déclarée à l'intérieur d'un bloc d'instructions (dans une fonction ou une boucle par exemple) aura une portée limitée à ce seul bloc d'instruction, c'est-à-dire qu'elle est inutilisable ailleurs, on parle alors de variable locale.

En C++, il existe un opérateur, appelé opérateur de résolution de portée, qui permet d'accéder à des variables globales plutôt qu'à des variables locales, lorsqu'il en existe portant le même nom. Cet opérateur se note ::. Imaginons que l'on définisse plusieurs variables portant le même nom dans des blocs différents :

int i = 3;

void main(){
int i = 12;

::i = i + ::i;

}

L'opérateur de résolution de portée placé devant le nom de la variable indique qu'il s'agit de la variable globale. Ainsi, l'instruction ::i = i + ::i; permet d'ajouter à la variable globale i (celle située en dehors de la fonction main()) la valeur de la variable locale i.

D'une manière générale il est tout de même préférable de donner des noms différents aux variables locales et globales...

J'ai donc fait cela:
uint8_t tempsArretPompeSup = ceil((float)tempeau/2);
Serial.print("tempsArretPompeSup = ");
Serial.println(tempsArretPompeSup);
int b=tempsArretPompeSup;
int a=8;
int OffHour=0;
::OffHour1=a+b;

Les :: ont pour effet de mettre la valeur locale sur la valeur globale (si j'ai bien compris le texte ci dessus).
Ce qui fait que ma fonction est ok et que le relais fonctionne suivant les consignes données.

Maintenant, il faut que je mette mon code au propre après lecture de votre cours.
Je ne sais pas si je pourrai vous solliciter pour m'aider à la mise au propre de mon code (après lecture du sujet bien sur).

En tout cas merci pour votre patience.

Salut ,

la solution que vous avez trouvé prouve que vous avez pris le temps de cherchez !

Maintenant cette solution fonctionne , mais n ' est pas vraiment approprié dans le cas present de votre code car une simple variable globale suffit .
Avec votre solution , vous gerez donc une variable globale et locale , donc une qui ne sert a rien ! ( de plus ) .

Salut , repostez votre denier code en date svp , je vous mettrai en commentaire , les variables globales , locales , les declarations et les attributions de valeurs a certaine variables .

je vous ajouterai aussi en commentaire , les variables qui sont inutiles a mon avis .

par exemple vous avez une declaration de variable globale en faisant au tout debut de votre code :

 typedevariable nomdevariable;

il est aussi possible de declarez une variable et lui attribuer une valeur par defaut :

 typedevariable nomdevariable = 0;

une fois que la variable globale est declaree , on fait des trucs puis a un moment on a besoin de lui mettre la valeur que l ' on recupere d' une maniere ou d' une autre , on va partir sur une division par 2 par exemple .
on a donc une variable globale declaree et initialisée donc , tout en haut du code , on a :

 typedevariable nomdevariable = 0;

puis on fait des trucs et on stocke la valeur qu ' on recupere d' un capteur de temperature ( les nom que je met sont nimporte quoi mais , realiste et explique ce qu ' est la variable :
une temperature ne depassera pas 127 °C et ne descendra pas en dessous de - 127 °C .
on choisist donc un type int8_t ( signé sur 8 bits ) qui va de -127 a 127 .

son nom en francais pour pas se faire kaguer ! sera recupTemperatureCapteurDS18B20_int8 avec un nom comme ca , on est sur et certain de savoir ce que c' est et nimporte ou dans le code , ca donne donc :
int8_t recupTemperatureCapteurDS18B20_int8 = 0; pour la declaration de notre variable globale , et on lui met la valeur 0 dans ce cas , mais ce n ' est pas obligatoire , on peut tre bien la mettre vide et donc ne pas l ' initialiser avec une valeur par defaut .

plus tard dans le code, on veut recuperer la valeur de cette variable on fait donc :

recupTemperatureCapteurDS18B20_int8 = // le code qui permet de recuperer la temperature ;

ensuite on a 2 possibilités avec cette variable , soit on ne l ' utilise pas tel quel et on veut la diviser par 2 pour une autre utilisation , on pourrait declarer une autre variable puis division par 2 et stocker la nouvelle valeur mais si on stocke dans une autre variable encore apres , comme par exemple une durée avant d' arreter la pompe ca fait des variables pour rien car elles ne reservent pas dans le code => donc inutile et compliqué .

On va faire directement les calculs et stocker la valeur de temps on a besoin d ' un grand nombre qui ne sera jamais negatif donc on choisit un uint32_t et on la met globale aussi , comme ca on peut y faire appel n ' importe ou dans le code et on l ' initialise a zero car on sait que la valeur par defaut ne causera aucun probleme ce qui donne :

int8_t recupTemperatureCapteurDS18B20_int8 = 0;
uint32_t nombreDeMilliSecondesAvantArretPompe = 0;

plus bas dans la loop en general , on va retrouver la recuperation de temperature , puis juste apres on va faire notre calcul pour avoir le nombre de secondes et on programmera un arret par l' intermediare de millis () , ce qui donne donc :

recupTemperatureCapteurDS18B20_int8 = // le code qui permet de recuperer la temperature ;
nombreDeMilliSecondesAvantArretPompe = recupTemperatureCapteurDS18B20_int8 * 60 * 1000 / 2;
  • on fait d' abord les multiplications afin de conserver une meilleure precision .
  • c ' est des minutes que vous recuperez dans vos calculs ( pure supposition ) on multiplie donc par 60 pour avoir des secondes
  • si c ' est des heures que vous recuperez dans vos calcules on muliplie par 3600 a la place de 60 pour avoir des secondes
  • on muliplie ensuite par 1000 pour avoir des millisecondes .
  • la temperature diviser par 2 est un de vos criteres .

on obtient directement le resultat que l ' on stocke dans une variable avec un nom explicite et qu on reutilisera avec millis () pour arreter la pompe :

Bonsoir Iznobe,

Kaguer…ca vient du sud ca!!!

Merci pour ces explications, il va falloir que je bosse cela.
Pour milli, j’ai lu que cela peut amener à un dépassement de mémoire et bloquer le système au bout d’un certain nombre de jour et donc faire un reset.

Voici mon code un peu refait et commenté, j’y ai ajouté une meilleur configuration des relais car celle-ci était mauvaise et les relais ne fonctionnaient pas à cause du manque d’ampérage.

Je me suis battu avec mon ampèremètre, mon arduino uno et mes relais un petit bout de temps et tout ca à cause de 2 lignes de codes (ça fait vraiment progresser ces bêtises…).

Je passe aussi du temps sur riton duino pour optimiser l’autonomie des sondes de temperature sans fils.

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

#define PINRELAISHG 2                 // relai hors gel
#define PINRELAISF 3                 // relai filtration
#define ADRESSE_I2C_RTC 0x68        // adresse DS3231
LiquidCrystal_I2C lcd(0x27, 20, 4); //adresse et type d'ecran

RF24 radio(9,10);                   // adresse PIN com NRF24L01
RF24Network network(radio);
const uint16_t this_node = 000;     // adresse du node dans le reseau

struct payload_t                    // strucutre pour recevoir les temperatures des divers capteurs sans fils
{
  byte senderID;
  float sens1;
};


float tempref=2;                    // définition de la variable pour la mise en route du hors gel et le temps de fonctionnement de la pompe
float temprefmax=4;                 // définition de la variable pour l'arret du hors gel
float tempext;                      // définition de la variable pour recuperer la temp exterieur de l'emetteur node 1
float tempeau;                      // définition de la variable pour recuperer la temp eau de l'emetteur node 2
float testRecupTempEau;             // définition de la variable pour recuperer la temp eau lors de l'activation de l'heure voulue
//int OffHour;
int OffHour1;                       // définition de la variable pour l'heure de fin de filtration

DS3231 Clock;
// définition des variables pour le DS3231
bool Century=false;
bool h12;
bool h24;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits; // Alarm
bool ADy, A12h, Apm;  // Alarm
// définition des variables pour la mise en route de la pompe à heure fixe et arret à heure variable mais minute fixe
const int OnHour = 8;//Heure pour prendre la temperature et demarrer la pompe
const int OnMin = 30;//Minute pour prendre la temperature et demarrer la pompe
// int OffHour = 18;//Heure pour arreter la pompe en forcé (phase de test)
const int OffMin = 30;//Minute pour arreter la pompe

void setup(void)
{
  //définition de l'etat des relais au démarrage
  pinMode(PINRELAISHG,OUTPUT);
  pinMode(PINRELAISF,OUTPUT);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  Wire.begin();
  // On règle le DS3231
  //Clock.setSecond(0);//Set the second 
  //Clock.setMinute(34);//Set the minute 
  //Clock.setHour(21);  //Set the hour 
  //Clock.setDoW(3);    //Set the day of the week
  //Clock.setDate(5);  //Set the date of the month
  //Clock.setYear(20);  //Set the year (Last two digits of the year)

//  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("Automatique Pool");
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");

{
// on recupere la temp ext
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); 
lcd.print("G");

digitalWrite(2, HIGH);}

else
{
  // boucle antigel
  if (tempext > temprefmax) {
  digitalWrite(2, LOW); 
lcd.setCursor(10,1); 
lcd.print("N");
}
}
}
else
{
  // on recupere la temp eau
(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;
      Serial.print("variable tempeau = ");
      Serial.println(tempeau);
      Serial.print("variable testRecupTempEau = ");
      Serial.println(testRecupTempEau);     
}
}
}
// boucle temps d'utilisation filtration
if(Clock.getHour (h24,PM)== OnHour && Clock.getMinute ()== OnMin){   
    if (testRecupTempEau) {
      Serial.print("testRecupTempEau = ");
      Serial.println(testRecupTempEau);
      
      uint8_t tempsArretPompeSup = ceil((float)tempeau/2);
      Serial.print("tempsArretPompeSup = ");
      Serial.println(tempsArretPompeSup);
      int b=tempsArretPompeSup;
      int a=8;
      //int OffHour=0;
      ::OffHour1=a+b;
      Serial.print("OffHour1 = ");
      Serial.println(OffHour1);
      digitalWrite(3, HIGH);
      lcd.setCursor(10,3); 
      lcd.print("M");
      delay (1000);
      }
    }
    else if(Clock.getHour (h24,PM)== OffHour1 && Clock.getMinute ()== OffMin){ //remplacer Offhour1 par OffHour pour faire une phase de test
      Serial.print("Arret pompe = ");
      digitalWrite(3, LOW);
      lcd.setCursor(10,3); 
      lcd.print("A");
      delay (1000);
      }
    }

drefparadise:
Bonsoir Iznobe,

Kaguer...ca vient du sud ca!!!!

tout a fait !

drefparadise:
Pour millis, j'ai lu que cela peut amener à un dépassement de mémoire et bloquer le système au bout d'un certain nombre de jour et donc faire un reset.

ca peut etre le cas effectivement si on l ' utilise mal .
en fait , millis a un moment occupe toute la memoire attribué par la variable , il ne faut donc pas ajouter sous peine de depassement quelquechose a millis .

on fait toujours millis() - chrono >= monTimer; pour eviter ce probleme et tout roule !

il reste du travail de mise en forme , indentation , nettoyage a faire sur ton code !

essaie ca pour voir si ca marche deja :

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

#define PINRELAISHG 2                 // relai hors gel
#define PINRELAISF 3                 // relai filtration
#define ADRESSE_I2C_RTC 0x68        // adresse DS3231
LiquidCrystal_I2C lcd(0x27, 20, 4); //adresse et type d'ecran

RF24 radio(9,10);                   // adresse PIN com NRF24L01
RF24Network network(radio);
const uint16_t this_node = 000;     // adresse du node dans le reseau

struct payload_t                    // strucutre pour recevoir les temperatures des divers capteurs sans fils
{
  byte senderID;
  float sens1;
};

/* declarations de variables globales */
float tempref=2;                    // définition de la variable pour la mise en route du hors gel et le temps de fonctionnement de la pompe
float temprefmax=4;                 // définition de la variable pour l'arret du hors gel
float tempext;                      // définition de la variable pour recuperer la temp exterieur de l'emetteur node 1
float tempeau;                      // définition de la variable pour recuperer la temp eau de l'emetteur node 2
float testRecupTempEau;             // définition de la variable pour recuperer la temp eau lors de l'activation de l'heure voulue
//int OffHour;
//int OffHour1;                       // définition de la variable pour l'heure de fin de filtration
uint8_t tempsArretPompeSup;

DS3231 Clock;
// définition des variables pour le DS3231
bool Century=false;
bool h12;
bool h24;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits; // Alarm
bool ADy, A12h, Apm;  // Alarm
// définition des variables pour la mise en route de la pompe à heure fixe et arret à heure variable mais minute fixe
const int OnHour = 8;//Heure pour prendre la temperature et demarrer la pompe
const int OnMin = 30;//Minute pour prendre la temperature et demarrer la pompe
// int OffHour = 18;//Heure pour arreter la pompe en forcé (phase de test)
const int OffMin = 30;//Minute pour arreter la pompe

/* fin des declarations de variables globales */

void setup(void)
{
  //définition de l'etat des relais au démarrage
  pinMode(PINRELAISHG,OUTPUT);
  pinMode(PINRELAISF,OUTPUT);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  Wire.begin();
  // On règle le DS3231
  //Clock.setSecond(0);//Set the second
  //Clock.setMinute(34);//Set the minute
  //Clock.setHour(21);  //Set the hour
  //Clock.setDoW(3);    //Set the day of the week
  //Clock.setDate(5);  //Set the date of the month
  //Clock.setYear(20);  //Set the year (Last two digits of the year)

//  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("Automatique Pool");
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");

{
// on recupere la temp ext
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);

// ci dessous , on est entre des { } , on declare ( a nouveau ) une variable mais elle est locale elle ne peut donc pas sortir des { } !
float tempext=payload.sens1;
// si on veut utiliser la variable globale , il suffit d' enlever float ( qui sert a donner le type et donc a declarer la variable )

Serial.println(tempext);
 if (tempext < tempref) {

lcd.setCursor(10,1);
lcd.print("G");

digitalWrite(2, HIGH);}

else
{
  // boucle antigel
  if (tempext > temprefmax) {
  digitalWrite(2, LOW);
lcd.setCursor(10,1);
lcd.print("N");
}
}
}
else
{
  // on recupere la temp eau
(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;
      Serial.print("variable tempeau = ");
      Serial.println(tempeau);
      Serial.print("variable testRecupTempEau = ");
      Serial.println(testRecupTempEau);     
}
}
}
// boucle temps d'utilisation filtration
if(Clock.getHour (h24,PM)== OnHour && Clock.getMinute ()== OnMin){
    if (testRecupTempEau) {
	  tempsArretPompeSup = ceil((float)tempeau/2);
      Serial.print("testRecupTempEau = ");
      Serial.println(testRecupTempEau);
     // declaration variable locale 
      
      Serial.print("tempsArretPompeSup = ");
      Serial.println(tempsArretPompeSup);
      int b=tempsArretPompeSup;
	  // declaration variable locale 
      int a=8;
	  // declaration variable locale 
	  // si  les 3 variables ne sont utilisées qu ' une fois dans le programme  , ce qui est le cas ici puisqu ' elle sont locales , elles sont inutiles !
	  /* autant faire directement : 
	  ::OffHour1=8+tempsArretPompeSup;
	  comme cette methode " ::OffHour1 " n ' est pas aproprié ici et qu ' elle ajoute une variable pour rien , autant utiliser une simple variable globale !
	  on va meme conserver le meme nom ( tempsArretPompeSup )qui est deja bien pour ne pas avoir une variable en plus , ca donne :
	  tempsArretPompeSup = 8+tempsArretPompeSup;
	  */
	  tempsArretPompeSup = 8+tempsArretPompeSup;
	  tempsArretPompeSup = tempsArretPompeSup * 3600 * 1000;// je transforme les heures en millisecondes pour utiliser en comparaison avec la fonction millis ()
	  
      //int OffHour=0;
      //::OffHour1=a+b;
      //Serial.print("OffHour1 = ");
      //Serial.println(OffHour1);
	  Serial.print("tempsArretPompeSup = ");
      Serial.println(tempsArretPompeSup);
      digitalWrite(3, HIGH);
      lcd.setCursor(10,3);
      lcd.print("M");
      delay (1000);
	  
	  chrono = millis();
      }
    }
	
	if ( millis() - chrono >= tempsArretPompeSup ) {
	  Serial.print("Arret pompe = ");
      digitalWrite(3, LOW);
      lcd.setCursor(10,3);
      lcd.print("A");
      delay (1000);
      }
	}
    /*else if(Clock.getHour (h24,PM)== OffHour1 && Clock.getMinute ()== OffMin){ //remplacer Offhour1 par OffHour pour faire une phase de test
      Serial.print("Arret pompe = ");
      digitalWrite(3, LOW);
      lcd.setCursor(10,3);
      lcd.print("A");
      delay (1000);
      }
    }*/

Bonjour Iznobe,

Merci pour le code.
Je vais tester cela sur ma base essai mais il me manque une pile pour l'horloge que je vais commander de ce pas.
Je vous tiens au courant une fois testé.
Par contre que veut dire indentation?

l ’ indentation c ’ est la façon de " ranger le code " que l’ on ecrit de façon a ce que ca soit plus facile de reperer les blocs et autre trucs .

si tu utilises l’ IDE arduino tu fais la touche CTRL+T et le code se rangera tout seul de maniere optimale .

tout sur l ’ indentation : Style d'indentation — Wikipédia

Ca facilite la comprehension et la visibilité des differents blocs , tres important surtout quand tu donnes le code a quelqu ’ un d’ autre …

Bonsoir Iznobe,

J'ai reçu mon horloge et je vais me lancer dans l'essai de ton code.
Merci pour l'explication de l'indentation ; c'est top.

Deux petites questions :

// on recupere la temp ext
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);

// ci dessous , on est entre des { } , on declare ( a nouveau ) une variable mais elle est locale elle ne peut donc pas sortir des { } !
float tempext=payload.sens1;
// si on veut utiliser la variable globale , il suffit d' enlever float ( qui sert a donner le type et donc a declarer la variable )

Si je résume, je peux la mettre en locale car ma boucle logique qui suit est dans la même {} mais pas pour la partie temp eau

    Serial.print("tempsArretPompeSup = ");
      Serial.println(tempsArretPompeSup);
      digitalWrite(3, HIGH);
      lcd.setCursor(10,3);
      lcd.print("M");
      delay (1000);
   
    chrono = millis();
      }
    }
  
  if ( millis() - chrono >= tempsArretPompeSup ) {
    Serial.print("Arret pompe = ");
      digitalWrite(3, LOW);
      lcd.setCursor(10,3);
      lcd.print("A");
      delay (1000);
      }
  }

si je resume, on lance le chrono et lorsqu'il atteint tempsArretPompeSup la pompe s'arrete, mais je ne comprends pas le chrono=millis() pourquoi declarer chrono= millis()

Je n'ai pas encore réussi à formater mon cerveau pour lachose suivante (que je comprends mais que j'ai du mal à appliquer):
/* autant faire directement :
::OffHour1=8+tempsArretPompeSup;
comme cette methode " ::OffHour1 " n ' est pas aproprié ici et qu ' elle ajoute une variable pour rien , autant utiliser une simple variable globale !
on va meme conserver le meme nom ( tempsArretPompeSup )qui est deja bien pour ne pas avoir une variable en plus , ca donne :
tempsArretPompeSup = 8+tempsArretPompeSup;

J'ai un peu de mal à admettre que x=8+X :wink:

En tout cas merci

Je vais avancer en ajoutant un clavier pour régler l'horloge et le setup d'heure de début, ajouter une fonction pour on/off manuel... et me casser les dents sur les forums de hbachetti pour optimiser l'autonomie de mes sondes sans fils.

En tout cas merci.

1°) si une variable doit etre utilisée en dehors des { } ou elle est declarée , il faut changer la declaration de place afin de rendre la variable globale ( et utilisable partout ) .

essayez ce code :

byte maVariableGlobale = 69; // DECLARATION GLOBALE

void test ()
{
  int maVariableLocale; // DECLARATION LOCALE
  maVariableLocale = 12; // Attribution d' une valeur 
  Serial.print("maVariableLocale = ");
  Serial.println(maVariableLocale);
  Serial.print("maVariableGlobale = ");
  Serial.println(maVariableGlobale);
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  test ();
  // decommentez la ligne ci-dessous pour voir ce que ca donne avec une variable locale hors de portée ...
  //Serial.println(maVariableLocale);
  Serial.println(maVariableGlobale);
}

void loop() {
  // put your main code here, to run repeatedly:

}

2°) chrono est une variable qui a pour nom chrono :stuck_out_tongue: ce n ' est pas un chronometre a part entiere ( comme on a l ' heebitude d ' en voir dans la vie de tous les jours ) , la valeur qu ' on lui attribu ( avec le signe = ) c ' est millis() ,
millis est un nombre de millisecondes qui change au fil du temps , on ne connait sa valeur exacte a un moment precis que parcequ ' on a pu l ' attribuer a une variable a ce moment precis .
bien sur une milliseconde apres sa valeur a deja changé .

3°)

J'ai un peu de mal à admettre que x=8+x

le egal en math et en langage de programmation (arduino ou autres ) ne veut pas dire la meme chose .
quand on programme on ne fait pas des maths ...

et je ne sais pas pourquoi , mais ceux qui ont inventés les langages de programmation sont des grosse feignasses , au lieu de reinventer tout , ils se sont servis de lettre , de chiffres , et de signes qui servait deja a autre chose ... a ecrire , a compter et a faire operations :stuck_out_tongue:

Bref , le signe = aplique a une variable , en programmation ca veut dire , " prend pour valeur " .
Du coup quand on ecrit : tempsArretPompeSup = 8+tempsArretPompeSup;

ca veut precisement dire : je veux que la variable " tempsArretPompeSup prenne la valeur 8 + la valeur de tempsArretPompeSup " .

un exemple simple :

si x vaut 92 avant cette ligne : x=8+x; apres , la nouvelle valeur de x est 100 , rajoute 8 a la valeur de x et x prend la nouvelle valeur .

Pour regler l ' horloge , il n ' y a pas besoin de clavier !

J-M-L , t ' as poster un code dans lequel il a mis ce qu ' il faut pour mettre a jour l ' horloge Ou l ' utiliser en lisant les commentaire tout y est indiqué .

Bonnes bidouilles :slight_smile: