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

Bonsoir Iznobe

Enfin un peu de temps pour me casser les dents sur millis().
J'ai fait des tests avec le led avec des tutos très simples.
J"ai essayé le code et j'ai fait une version allégée pour fonctionner avec la fonction millis().
Cela reste sans succès car le relais se met bien en route à l’heure voulue mais ne s'arrête plus...(j'ai mis 13000 ms pour eviter d'attendre).
J'ai l'impression qu'il manque quelque chose à ma boucle.
J'ai essayé d'isolé la fin avec des { if ( millis() - chrono >= tempsArretPompeSup)...... } mais cela a pour effet d'arrêter tout de suite le relai.

voici mon code:

#include <DS3231.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.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

/* declarations de variables globales */
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
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 = 21;//Heure pour prendre la temperature et demarrer la pompe
const int OnMin = 48;//Minute pour prendre la temperature et demarrer la pompe
const int Onss = 0; //Seconde pour prendre la temperature et demarrer 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);

  lcd.begin();
  lcd.clear();
  lcd.backlight();
  lcd.display();

  Serial.begin(9600);
  Serial.println("Automatique Pool");
}

void loop(void)
{
  //jour
  lcd.setCursor(0, 1);
  if (Clock.getDate() < 10) {
    lcd.print("0");
  }

  lcd.print(Clock.getDate(), DEC);
  lcd.print("/");

  lcd.setCursor(3, 1);
  if (Clock.getMonth(Century) < 10) {
    lcd.print("0");
  }
  lcd.print(Clock.getMonth(Century), DEC);
  lcd.print("/");

  lcd.setCursor(6, 1);
  //lcd.print("/");
  lcd.print(Clock.getYear(), DEC);

  // Heure
  lcd.setCursor(10, 1);
  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);

  // boucle temps d'utilisation filtration
  if (Clock.getHour (h24, PM) == OnHour && Clock.getMinute () == OnMin && Clock.getSecond () == Onss) {
    digitalWrite(3, HIGH);

    Serial.println(chrono);
    ::tempeau = 27;
    Serial.print("testRecupTempEau = ");
    Serial.println(testRecupTempEau);

    // declaration variable locale
    long tempsArretPompeSup = ceil((int)tempeau / 2);
    Serial.print("tempsArretPompeSup1 = ");
    Serial.println(tempsArretPompeSup);

    tempsArretPompeSup = tempsArretPompeSup * 1000; // je transforme les heures en millisecondes pour utiliser en comparaison avec la fonction millis ()

    Serial.print("tempsArretPompeSup2 = ");
    Serial.println(tempsArretPompeSup);
    Serial.println("pompe on");
    delay (1000);


    unsigned long chrono = millis();
    Serial.println(chrono);

    if ( millis() - chrono >= tempsArretPompeSup) {
      chrono = millis();
      Serial.println("Arret pompe = ");
      digitalWrite(3, LOW);

    }
  }
}

Par avance merci de tes lumières