/* Claude EMERY - 07/08/2026
Arduino Uno + 2 relais (Relais 1 et Relais 2) pour piloter le moteur
Un module RTC DS3231 pour conserver l’heure après une coupure électrique
millis() pour gérer les temporisations sans bloquer le programme avec delay()
Une variable qui s’incrémente toutes les heures pendant 24h
Heures 0 à 11 : relais 1 ON pendant X minutes, relais 2 OFF
Heures 12 à 23 : relais 2 ON pendant X minutes, relais 1 OFF
Reprise correcte après coupure grâce à l’heure RTC
*/
#include <Wire.h> // Librairie pour I2C
#include <RTClib.h> // Librairie pour le module RTC
RTC_DS3231 rtc; // Définition du module RTC
const int Rouge = 6; // Pin Led Rouge
const int Verte = 7; // Pin Led Verte
const int Relais1 = 8; // Pin Relais 1
const int Relais2 = 9; // Pin Relais 2
bool cycleActif = false; // Etat des relais
unsigned long tempsRelais = 0; // Gestion millis()
const unsigned long Duree_Relais = 12000UL; // 2 minutes=120000UL / 1 minute=60000UL
int compteurHeure = 0; // Compteur horaire au démarrage = 0
int derniereHeure = -1; // Variable horaire -1
int relaisActif = 0; // Etat du relais en cours
void setup() {
pinMode(Relais1, OUTPUT); // Déclaration en sortie de la pin Relais1
pinMode(Relais2, OUTPUT); // Déclaration en sortie de la pin Relais2
pinMode(Rouge, OUTPUT); // Déclaration en sortie de la pin led Rouge
pinMode(Verte, OUTPUT); // Déclaration en sortie de la pin led Verte
digitalWrite(Relais1, LOW); // Relais1 OFF au démarrage
digitalWrite(Relais2, LOW); // Relais2 OFF au démarrage
Serial.begin(9600); // Activation du moniteur série
Wire.begin(); // Activation Wire pour I2C
if (!rtc.begin()) { // Détection du modure RTC
Serial.println("RTC non détecté !");
while (1);
}
// Décommenter une seule fois pour régler l'heure :
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
DateTime maintenant = rtc.now(); // Recupétation de la date actuelle
derniereHeure = maintenant.hour(); // Recupération de l'heure actuelle
compteurHeure = maintenant.hour(); // Position dans le cycle de 24h - Heure actuelle
Serial.println("Systeme demarre ...");
}
void loop() {
DateTime maintenant = rtc.now(); // Recupération date actuelle
int heure = maintenant.hour(); // Récupération de l'heure actuelle
if (heure != derniereHeure) { // Vérifie le changement d'heure
derniereHeure = heure;
compteurHeure++; // Incrémentation du compteur heure
if (compteurHeure >= 24) { // Si erreur => heure suppérieure à 24
compteurHeure = 0; // Mise à 0 du compteur heure
}
Serial.print("Nouvelle heure : ");
Serial.println(compteurHeure); // Affichage nouvelle heure
digitalWrite(Relais1, LOW); // Arrêt sécurité
digitalWrite(Relais2, LOW); // Arrêt sécurité
// Détermination du relais
compteurHeure++;
if (compteurHeure < 12) {
relaisActif = 1; // Relais 1 actif entre 00h00 et 12h00
digitalWrite(Relais1, HIGH); // Active Relais 1
digitalWrite(Relais2, LOW); // Désactive Relais 2
Serial.println("Relais 1 ON");
digitalWrite(Rouge, HIGH); // Eteint led Rouge
digitalWrite(Verte, LOW); // Allume led Verte
}
else {
relaisActif = 2; // Relais 2 actif entre 12h00 et 24h00
digitalWrite(Relais1, LOW); // Désactive Relais 1
digitalWrite(Relais2, HIGH); // Active Relais 2
Serial.println("Relais 2 ON");
digitalWrite(Rouge, LOW); // Eteint led Rouge
digitalWrite(Verte, HIGH); // Allume led Verte
}
tempsRelais = millis(); // tempsRelais = heure de millis()
cycleActif = true;
}
if (cycleActif) { // Gestion des 2 minutes avec millis()
if (millis() - tempsRelais >= Duree_Relais) { // Si millis() - tempsRelais est supérieur à Duree_Relais
digitalWrite(Relais1, LOW); // Alors arret Relais 1
digitalWrite(Relais2, LOW); // Alors arret Relais 2
digitalWrite(Rouge, LOW);
digitalWrite(Verte, LOW);
cycleActif = false;
Serial.println("Fin temporisation relais");
}
}
}
Relais 1
Relais 2
Leds Jaune = Simulation moteur
Module RTC
00h00 => 12h00
12h00 => 24h00