/* Claude EMERY - 10/08/2026 - Version 05
**************************************************************************************************
RETOUR EN 11 FOIS DE 2.5 secondes DE 21H00 A 08h00
**************************************************************************************************
Code Arduino pour piloter deux relais avec un module RTC et deux led
pour indiquer le relais qui est en fonctionnement.
Le relais 1 commute toutes les heures pendant 2.5 secondes de 09h00 à 20h00, le relais 2 OFF
Le relais 2 commute toutes les heures pendant 2.5 secondes de 21h00 à 08h00 du matin, le relais 1 OFF
**************************************************************************************************
Relais 1 :
de 09:00 à 20:00
déclenchement toutes les heures : 09:00, 10:00, …, 20:00 -> ON pendant 2,5 secondes
Relais 2 forcé OFF
LED 1 allumée pendant l'activation
Relais 2 :
déclenchement toutes les heures : 21:00, 22:00, …, 08:00 -> ON pendant 2,5 secondes
Relais 1 forcé OFF
LED 2 allumée pendant l'activation
Les temporisations sont réalisées avec millis()
Le RTC est ici un DS3231 avec la bibliothèque RTClib
*/
// =====================================================
// LIBRAIRIES
// =====================================================
#include <Wire.h> // Pour la gestion I2C (SDA/SCL)
#include <RTClib.h> // Pour la gestion du module RTC
// =====================================================
// CONFIGURATION DES PINS
// =====================================================
const byte LED1 = 6; // Pin Led Rouge
const byte LED2 = 7; // Pin Led Verte
const byte RELAIS1 = 8; // Pin Relais 1 pour la journée
const byte RELAIS2 = 9; // Pin Relais 2 pour la nuit
// ------------------------------------------------------------
// Certains modules relais sont actifs à LOW et d'autre à HIGH.
// ------------------------------------------------------------
const byte RELAIS_ON = HIGH;
const byte RELAIS_OFF = LOW;
// =====================================================
// RTC
// =====================================================
RTC_DS3231 rtc; // Initialisation du RTC
// =====================================================
// GESTION DES IMPULSIONS 2500UL = 2.5 secondes
// =====================================================
const unsigned long DUREE_IMPULSION = 2500UL; // 2,5 secondes // TEMPS DE MISE EN MARCHE DU MOTEUR
bool impulsionEnCours = false;
byte relaisActif = 0;
unsigned long debutImpulsion = 0;
// =====================================================
// MÉMORISATION DU DERNIER DÉCLENCHEMENT
// =====================================================
// Permet d'éviter plusieurs déclenchements pendant la même heure.
int derniereAnnee = -1;
int dernierMois = -1;
int dernierJour = -1;
int derniereHeure = -1;
// =====================================================
// FONCTIONS
// =====================================================
void arreterTousLesRelais() // Mise à OFF des Relais et Led
{
digitalWrite(RELAIS1, RELAIS_OFF);
digitalWrite(RELAIS2, RELAIS_OFF);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
impulsionEnCours = false;
relaisActif = 0;
}
// -----------------------------------------------------
// Démarrage d'une impulsion
// -----------------------------------------------------
void demarrerRelais(byte numeroRelais)
{
// Sécurité : on coupe toujours les deux relais avant d'en activer un
arreterTousLesRelais();
if (numeroRelais == 1) // Pour relais 1
{
digitalWrite(RELAIS1, RELAIS_ON);
digitalWrite(LED1, HIGH);
}
else if (numeroRelais == 2) // Pour relais 2
{
digitalWrite(RELAIS2, RELAIS_ON);
digitalWrite(LED2, HIGH);
}
else
{
return;
}
relaisActif = numeroRelais;
impulsionEnCours = true;
debutImpulsion = millis();
}
// -----------------------------------------------------
// Gestion du temps d'impulsion avec millis()
// -----------------------------------------------------
void gererImpulsion()
{
if (!impulsionEnCours)
return;
if (millis() - debutImpulsion >= DUREE_IMPULSION)
{
arreterTousLesRelais();
}
}
// -----------------------------------------------------
// Vérification de l'heure
// -----------------------------------------------------
void verifierHoraire(const DateTime &now)
{
int heure = now.hour();
int minute = now.minute();
int seconde = now.second();
// On ne déclenche qu'à HH:00:xx.
//
// La fenêtre de 5 secondes permet de ne pas rater
// le déclenchement si la boucle Arduino n'est pas
// exactement sur la seconde 00.
if (minute != 0 || seconde >= 5)
return;
// ---------------------------------------------------
// Empêcher un deuxième déclenchement dans la même
// heure.
// ---------------------------------------------------
if (now.year() == derniereAnnee &&
now.month() == dernierMois &&
now.day() == dernierJour &&
heure == derniereHeure)
{
return;
}
// Mémorisation de cette heure
derniereAnnee = now.year();
dernierMois = now.month();
dernierJour = now.day();
derniereHeure = heure;
// ---------------------------------------------------
// 09h00 -> 20h00 : RELAIS 1
// ---------------------------------------------------
if (heure >= 9 && heure <= 20)
{
demarrerRelais(1);
}
// ---------------------------------------------------
// 21h00 -> 23h00 + 00h00 -> 08h00 : RELAIS 2
// ---------------------------------------------------
else if (heure >= 21 || heure <= 8)
{
demarrerRelais(2);
}
}
// =====================================================
// SETUP
// =====================================================
void setup()
{
pinMode(RELAIS1, OUTPUT); // Pin 8 - Relais 1 en OUTPUT
pinMode(RELAIS2, OUTPUT); // Pin 9 - Relais 2 en OUTPUT
pinMode(LED1, OUTPUT); // Pin 7 - Led 1 Rouge en OUTPUT
pinMode(LED2, OUTPUT); // Pin 8 - Led 2 Verte en OUTPUT
arreterTousLesRelais(); // Tout couper au démarrage
Serial.begin(9600); // Initialisation Moniteur série
Wire.begin(); // Initialisation I2C (Pour le RTC)
if (!rtc.begin()) // Si RTC non détecté
{
Serial.println("ERREUR : RTC DS3231 non detectee !");
// On reste ici avec les relais coupés
while (1)
{
arreterTousLesRelais();
}
}
// ---------------------------------------------------
// À utiliser UNE SEULE FOIS si le RTC n'est pas
// correctement réglé.
//
// Décommentez la ligne suivante, téléversez le code,
// puis RECOMmentez-la et téléversez à nouveau.
// ---------------------------------------------------
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
if (rtc.lostPower()) // Si RTC non détecté !
{
Serial.println("ATTENTION : le RTC a perdu son alimentation.");
// Réglage automatique avec la date/heure de compilation
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Si RTC détecté => Message Systeme demarre ...
Serial.println("Systeme demarre.");
}
// =====================================================
// LOOP
// =====================================================
void loop()
{
// Lecture du RTC
DateTime now = rtc.now();
// Gestion de la fin des 2,5 secondes
gererImpulsion();
// Vérification d'un nouvel horaire
verifierHoraire(now);
// ---------------------------------------------------
// Affichage Horaire et Relais actif pour contrôle
// ---------------------------------------------------
static int derniereSecondeAffichee = -1;
if (now.second() != derniereSecondeAffichee)
{
derniereSecondeAffichee = now.second();
Serial.print(now.day());
Serial.print("/");
Serial.print(now.month());
Serial.print("/");
Serial.print(now.year());
Serial.print(" ");
if (now.hour() < 10)
Serial.print("0");
Serial.print(now.hour());
Serial.print(":");
if (now.minute() < 10)
Serial.print("0");
Serial.print(now.minute());
Serial.print(":");
if (now.second() < 10)
Serial.print("0");
Serial.print(now.second());
Serial.print(" Relais actif : ");
if (relaisActif == 1)
Serial.println("1");
else if (relaisActif == 2)
Serial.println("2");
else
Serial.println("aucun");
}
}Relais 1 - Journée
Relais 2 - Soir
Leds Jaune = Simulation moteur
Module RTC
09h00 => 20h00
21h00 => 08h00
Retour: 11 x 2.5 secondes
Déplacement: 11 x 2.5 secondes