/* Claude EMERY - 07/08/2026 - Version 03
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 1 minute de 09h00 à 14h00 avec le relais 2 OFF,
puis le relais 2 commute toutes les heures pendant 1 minute de 15h00 à 20h00 avec le relais 1 OFF
*****************************
Fonctionnement
Relais 1 :
actif à 09:00, 10:00, 11:00, 12:00, 13:00 et 14:00 et reste activé pendant 1 minute
relais 2 toujours OFF pendant cette période.
Relais 2 :
actif à 15:00, 16:00, 17:00, 18:00, 19:00 et 20:00 et reste activé pendant 1 minute
relais 1 toujours OFF.
LED 1 = relais 1 en fonctionnement.
LED 2 = relais 2 en fonctionnement.
En dehors des périodes prévues, les deux relais sont OFF.
Le RTC permet au programme de conserver l'heure même après une coupure d'alimentation.
*/
#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// ============ // OLED // ================
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDRESS 0x3C
Adafruit_SSD1306 display( SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET );
RTC_DS3231 rtc;
// -------------------------
// Broches
// -------------------------
const byte LED1 = 6;
const byte LED2 = 7;
const byte RELAIS1 = 8;
const byte RELAIS2 = 9;
// -------------------------
// Relais actif à LOW
// -------------------------
const byte RELAIS_ON = HIGH; // LOW
const byte RELAIS_OFF = LOW; //HIGH
// -------------------------
// Durée de fonctionnement
// -------------------------
const unsigned long DUREE_RELAIS = 60000UL; // 1 minute
// Mémorise le début de l'activation
unsigned long debutRelais = 0;
// Relais actuellement en fonctionnement
byte relaisActif = 0;
// Dernière minute traitée
int derniereMinute = -1;
// --------------------------------------------------
// Fonction : arrêt des deux relais
// --------------------------------------------------
void arretRelais()
{
digitalWrite(RELAIS1, RELAIS_OFF);
digitalWrite(RELAIS2, RELAIS_OFF);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
relaisActif = 0;
}
// --------------------------------------------------
// Fonction : démarrer le relais 1
// --------------------------------------------------
void demarrerRelais1()
{
arretRelais();
digitalWrite(RELAIS1, RELAIS_ON);
digitalWrite(LED1, HIGH);
relaisActif = 1;
debutRelais = millis();
Serial.println("Relais 1 ON");
}
// --------------------------------------------------
// Fonction : démarrer le relais 2
// --------------------------------------------------
void demarrerRelais2()
{
arretRelais();
digitalWrite(RELAIS2, RELAIS_ON);
digitalWrite(LED2, HIGH);
relaisActif = 2;
debutRelais = millis();
Serial.println("Relais 2 ON");
}
// --------------------------------------------------
// SETUP
// --------------------------------------------------
void setup()
{
Serial.begin(9600);
pinMode(RELAIS1, OUTPUT);
pinMode(RELAIS2, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
// Sécurité au démarrage
arretRelais();
// Initialisation du RTC
if (!rtc.begin())
{
Serial.println("Erreur : RTC non detecte !");
while (1);
}
// Si le RTC a perdu son alimentation,
// régler automatiquement l'heure avec la date/heure
// de compilation du programme.
if (rtc.lostPower())
{
Serial.println("RTC a perdu l'heure.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Serial.println("Systeme demarre.");
}
// --------------------------------------------------
// LOOP
// --------------------------------------------------
void loop()
{
DateTime maintenant = rtc.now();
int heure = maintenant.hour();
int minute = maintenant.minute();
int seconde = maintenant.second();
// Affichage de l'heure
Serial.print(heure);
Serial.print(":");
if (minute < 10)
Serial.print("0");
Serial.print(minute);
Serial.print(":");
if (seconde < 10)
Serial.print("0");
Serial.println(seconde);
// ------------------------------------------------
// Si un relais est déjà actif
// ------------------------------------------------
if (relaisActif != 0)
{
// Arrêt après 1 minute
if (millis() - debutRelais >= DUREE_RELAIS)
{
Serial.println("Fin des 1 minute.");
arretRelais();
}
return;
}
// ------------------------------------------------
// Évite de déclencher plusieurs fois pendant
// la même minute
// ------------------------------------------------
if (minute == derniereMinute)
{
return;
}
derniereMinute = minute;
// ------------------------------------------------
// RELAIS 1
// 09:00 à 14:00
// ------------------------------------------------
if (minute == 0 && heure >= 9 && heure <= 14)
{
demarrerRelais1();
return;
}
// ------------------------------------------------
// RELAIS 2
// 15:00 à 20:00
// ------------------------------------------------
if (minute == 0 && heure >= 15 && heure <= 20)
{
demarrerRelais2();
return;
}
}
Relais 1
Relais 2
Leds Jaune = Simulation moteur
Module RTC
09h00 => 14h00
14h00 => 20h00