programmateur horaire avec interval

Bonjour,

Est-il possible de simplifier ce code, il fonctionne plutôt bien, mais comme je débute, il n'est pas du tout optimiser. Il est pour 1 relai et je dois le modifier pour 3 relais, à part le copier/coller, je ne vois pas trop de solution plus élégante.
Merci par avance pour votre aide.

//  le but final est de pouvoir déclencher 3 relais à des heures programmés et suivant un nbr de déclenchements choisi et une durée programmée.
//ex: R1_Relai sera déclenché 3 fois pendant 20 secondes à un interval de 3 heures. Le premier déclenchement aura lieu à 11h00
//ex: P2_Relai sera déclenché 2 fois pendant 3 minutes à un interval de 2h20. Le premier déclenchement aura lieu à 07h00
//ex: P3_Relai sera déclenché 6 fois pendant 1 minute à un interval de 1 heure. Le premier déclenchement aura lieu à 15h00
//voici ou je souhaiterai arriver.

#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};

const int R1_Relai  = 48;
const int R2_Relai  = 50;
const int R3_Relai  = 52;

unsigned long R1_H_Start    = 11;                             //Heure de déclenchements du relai
unsigned long R2_H_Start    = 13;
unsigned long R3_H_Start    = 15;

unsigned long R1_FoisJour   = 2;                              //Nbr de déclenchement par 24h
unsigned long R1_Interval   = 86400 / (R1_FoisJour * 2000);   //Supprimer le * XXXX qui sert aux tests //Interval de déclenchement par 24h(86400s)
unsigned long R1_Duree      = 16;                             //Durée d'activation en secondes


//---------------------------------------- Initialisation des pompes Terminer Reglage
void initialiserRelais()
{
  pinMode(R1_Relai, OUTPUT);
  pinMode(R2_Relai, OUTPUT);
  pinMode(R3_Relai, OUTPUT);
  digitalWrite (R1_Relai, HIGH);
  digitalWrite (R2_Relai, HIGH);
  digitalWrite (R3_Relai, HIGH);
}

//---------------------------------------- SETUP
void setup() {
  Serial.begin(9600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    Serial.println("PROGRAMME DECLENCHEMENT DE RELAI");
  }

  initialiserRelais();
}

//---------------------------------------- LOOP
void loop() {

  DateTime now = rtc.now();
  Serial.println();

  DateTime H_EnCours(2000, 01, 01, now.hour(), now.minute(), now.second());        //Heure actuelle
  DateTime H_Ref(2000, 01, 01, 0, 52, 0);                                          //Heure de Référence pour les calculs 00:00:00 //Après les tests, remplacer les minutes par 0

  unsigned long J_Actuel          = now.dayOfTheWeek();
  unsigned long H_Actuelle        = H_EnCours.unixtime();
  unsigned long H_RefCalcul       = H_Ref.unixtime();
  unsigned long R1_H_ReglerStart  = H_RefCalcul + (R1_H_Start * 3600);
  unsigned long R1_H_StartDans    = R1_H_ReglerStart - H_Actuelle ;

  unsigned long R1_Start00 = (R1_H_ReglerStart + R1_Duree);
  unsigned long R1_Start01 = (R1_Start00 + R1_Interval + R1_Duree);
  unsigned long R1_Start02 = (R1_Start01 + R1_Interval + R1_Duree);
  unsigned long R1_Start03 = (R1_Start02 + R1_Interval + R1_Duree);
  unsigned long R1_Start04 = (R1_Start03 + R1_Interval + R1_Duree);
  unsigned long R1_Start05 = (R1_Start04 + R1_Interval + R1_Duree);
  unsigned long R1_Start06 = (R1_Start05 + R1_Interval + R1_Duree);
  unsigned long R1_Start07 = (R1_Start06 + R1_Interval + R1_Duree);
  unsigned long R1_Start08 = (R1_Start07 + R1_Interval + R1_Duree);
  unsigned long R1_Start09 = (R1_Start08 + R1_Interval + R1_Duree);
  unsigned long R1_Start10 = (R1_Start09 + R1_Interval + R1_Duree);
  unsigned long R1_Start11 = (R1_Start10 + R1_Interval + R1_Duree);
  unsigned long R1_Start12 = (R1_Start11 + R1_Interval + R1_Duree);



  if (R1_FoisJour >= 1 )        //Start 1
  { if ((H_Actuelle >= R1_H_ReglerStart) && (H_Actuelle < R1_Start00))  digitalWrite (R1_Relai, LOW);
    if ((H_Actuelle >= R1_Start00) && (H_Actuelle < R1_Start01))        digitalWrite (R1_Relai, HIGH);
  }

  if (R1_FoisJour >= 2 )       //Start 2
  { if ((H_Actuelle >= R1_Start01) && (H_Actuelle < (R1_Start01 + R1_Duree))) digitalWrite (R1_Relai, LOW);
    if ((H_Actuelle >= (R1_Start01 + R1_Duree)) && (H_Actuelle < R1_Start02)) digitalWrite (R1_Relai, HIGH);
  }

  if (R1_FoisJour >= 3 )       //Start 3
  { if ((H_Actuelle >= R1_Start02) && (H_Actuelle < (R1_Start02 + R1_Duree))) digitalWrite (R1_Relai, LOW);
    if ((H_Actuelle >= (R1_Start02 + R1_Duree)) && (H_Actuelle < R1_Start03)) digitalWrite (R1_Relai, HIGH);
  }

  if (R1_FoisJour >= 4 )       //Start 4
  { if ((H_Actuelle >= R1_Start03) && (H_Actuelle < (R1_Start03 + R1_Duree))) digitalWrite (R1_Relai, LOW);
    if ((H_Actuelle >= (R1_Start03 + R1_Duree)) && (H_Actuelle < R1_Start04)) digitalWrite (R1_Relai, HIGH);
  }

  if (R1_FoisJour >= 5 )       //Start 5
  { if ((H_Actuelle >= R1_Start04) && (H_Actuelle < (R1_Start04 + R1_Duree))) digitalWrite (R1_Relai, LOW);
    if ((H_Actuelle >= (R1_Start04 + R1_Duree)) && (H_Actuelle < R1_Start05)) digitalWrite (R1_Relai, HIGH);
  }

  if (R1_FoisJour >= 6 )       //Start 6
  { if ((H_Actuelle >= R1_Start05) && (H_Actuelle < (R1_Start05 + R1_Duree))) digitalWrite (R1_Relai, LOW);
    if ((H_Actuelle >= (R1_Start05 + R1_Duree)) && (H_Actuelle < R1_Start06)) digitalWrite (R1_Relai, HIGH);
  }

  if (R1_FoisJour >= 7 )       //Start 7
  { if ((H_Actuelle >= R1_Start06) && (H_Actuelle < (R1_Start06 + R1_Duree))) digitalWrite (R1_Relai, LOW);
    if ((H_Actuelle >= (R1_Start06 + R1_Duree)) && (H_Actuelle < R1_Start07)) digitalWrite (R1_Relai, HIGH);
  }

  if (R1_FoisJour >= 8 )       //Start 8
  { if ((H_Actuelle >= R1_Start07) && (H_Actuelle < (R1_Start07 + R1_Duree))) digitalWrite (R1_Relai, LOW);
    if ((H_Actuelle >= (R1_Start07 + R1_Duree)) && (H_Actuelle < R1_Start08)) digitalWrite (R1_Relai, HIGH);
  }

  if (R1_FoisJour >= 9 )       //Start 9
  { if ((H_Actuelle >= R1_Start08) && (H_Actuelle < (R1_Start08 + R1_Duree))) digitalWrite (R1_Relai, LOW);
    if ((H_Actuelle >= (R1_Start08 + R1_Duree)) && (H_Actuelle < R1_Start09)) digitalWrite (R1_Relai, HIGH);
  }

  if (R1_FoisJour >= 10 )       //Start 10
  { if ((H_Actuelle >= R1_Start09) && (H_Actuelle < (R1_Start09 + R1_Duree))) digitalWrite (R1_Relai, LOW);
    if ((H_Actuelle >= (R1_Start09 + R1_Duree)) && (H_Actuelle < R1_Start10)) digitalWrite (R1_Relai, HIGH);
  }

  if (R1_FoisJour >= 11 )       //Start 11
  { if ((H_Actuelle >= R1_Start10) && (H_Actuelle < (R1_Start10 + R1_Duree))) digitalWrite (R1_Relai, LOW);
    if ((H_Actuelle >= (R1_Start10 + R1_Duree)) && (H_Actuelle < R1_Start11)) digitalWrite (R1_Relai, HIGH);
  }

  if (R1_FoisJour >= 12 )       //Start 12
  { if ((H_Actuelle >= R1_Start11) && (H_Actuelle < (R1_Start11 + R1_Duree))) digitalWrite (R1_Relai, LOW);
    if  (H_Actuelle >= (R1_Start11 + R1_Duree)) digitalWrite (R1_Relai, HIGH);
  }

    delay(1000);                                                                 // Mettre la valeur a 1000 pour 1 seconde
}