/* Claude EMERY - 10/08/2026 - Version 04
Code Arduino pour piloter deux relais avec un module RTC, deux led et un afficheur LCD1602-i2c
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.
*****************************
Relais 1 : activation pendant 1 minute, au début de chaque heure :
09:00 → 09:01
10:00 → 10:01
11:00 → 11:01
12:00 → 12:01
13:00 → 13:01
14:00 → 14:01
Relais 2 :
15:00 → 15:01
16:00 → 16:01
17:00 → 17:01
18:00 → 18:01
19:00 → 19:01
20:00 → 20:01
Pendant le fonctionnement du relais 1, relais 2 = OFF.
Pendant le fonctionnement du relais 2, relais 1 = OFF.
Les LED indiquent quel relais est actif.
Le LCD affiche l'heure, la date et l'état des relais.
*/
// =====================================================
// CONFIGURATION
// =====================================================
// Librairies
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
// Broches
const byte LED1 = 6;
const byte LED2 = 7;
const byte RELAY1 = 8;
const byte RELAY2 = 9;
// Beaucoup de modules relais sont actifs à LOW
//const byte RELAY_ON = LOW; // LOW
//const byte RELAY_OFF = HIGH; // HIGH
// Si ton relais est actif à HIGH, utiliser :
const byte RELAY_ON = HIGH;
const byte RELAY_OFF = LOW;
// =====================================================
// OBJETS
// =====================================================
RTC_DS3231 rtc;
// Adresse I2C généralement 0x27 ou 0x3F
LiquidCrystal_I2C lcd(0x27, 16, 2);
// =====================================================
// VARIABLES
// =====================================================
unsigned long lastDisplay = 0;
// =====================================================
// SETUP
// =====================================================
void setup()
{
Serial.begin(9600);
// Configuration des sorties
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
// Tout éteindre au démarrage
digitalWrite(RELAY1, RELAY_OFF);
digitalWrite(RELAY2, RELAY_OFF);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
// Initialisation I2C
Wire.begin();
// Initialisation LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Systeme RTC");
lcd.setCursor(0, 1);
lcd.print("Initialisation");
delay(1500);
// Initialisation RTC
if (!rtc.begin())
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ERREUR RTC !");
Serial.println("Erreur : RTC non detectee");
while (1)
{
// Arrêt du programme
}
}
// Si le RTC a perdu son alimentation,
// on regle l'heure avec la date/heure de compilation.
if (rtc.lostPower())
{
Serial.println("RTC a perdu l'alimentation.");
Serial.println("Reglage avec la date/heure de compilation.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
lcd.clear();
}
// =====================================================
// LOOP
// =====================================================
void loop()
{
DateTime now = rtc.now();
// Recupération Heure, Minute et Seconde
int heure = now.hour();
int minute = now.minute();
int seconde = now.second();
// ===================================================
// COMMANDE DES RELAIS
// ===================================================
bool relais1Actif = false;
bool relais2Actif = false;
// ---------------------------------------------------
// RELAIS 1
// De 09:00 à 14:01
// Activation pendant la première minute de chaque heure
// ---------------------------------------------------
if (heure >= 9 && heure <= 14)
{
//if (minute == 0) // Durée activation du Relais 1 = 1 minute
if (minute == 0 && seconde < 20) // Durée activation du relais = 1 minute et 20 secondes
//if (minute < 5) // Durée activation du relais = 5 minutes
{
relais1Actif = true;
}
}
// ---------------------------------------------------
// RELAIS 2
// De 15:00 à 20:01
// Activation pendant la première minute de chaque heure
// ---------------------------------------------------
if (heure >= 15 && heure <= 20)
{
if (minute == 0) // Durée activation du Relais 2 = 1 minute
//if (minute == 0 && seconde < 20) // Durée activation du relais = 1 minute et 20 secondes
//if (minute < 5) // Durée activation du relais = 5 minutes
{
relais2Actif = true;
}
}
// ===================================================
// SECURITE :
// UN SEUL RELAIS PEUT ETRE ACTIF
// ===================================================
if (relais1Actif)
{
relais2Actif = false;
}
if (relais2Actif)
{
relais1Actif = false;
}
// ===================================================
// COMMANDE RELAIS 1
// ===================================================
if (relais1Actif)
{
digitalWrite(RELAY1, RELAY_ON);
digitalWrite(LED1, HIGH);
}
else
{
digitalWrite(RELAY1, RELAY_OFF);
digitalWrite(LED1, LOW);
}
// ===================================================
// COMMANDE RELAIS 2
// ===================================================
if (relais2Actif)
{
digitalWrite(RELAY2, RELAY_ON);
digitalWrite(LED2, HIGH);
}
else
{
digitalWrite(RELAY2, RELAY_OFF);
digitalWrite(LED2, LOW);
}
//**********************************************************************************
/*
// ===================================================
// RETOUR POSITION DE DEPART
// ===================================================
if (heure >= 21){ RETOUR POSITION DEPART AVEC RELAIS 2}
*/
//**********************************************************************************
// ===================================================
// AFFICHAGE LCD
// ===================================================
if (millis() - lastDisplay >= 500)
{
lastDisplay = millis();
// Ligne 1 : heure
lcd.setCursor(4, 0);
if (heure < 10)
lcd.print("0");
lcd.print(heure);
lcd.print(":");
if (minute < 10)
lcd.print("0");
lcd.print(minute);
lcd.print(":");
if (now.second() < 10)
lcd.print("0");
lcd.print(now.second());
lcd.print(" ");
// Ligne 2 : état relais
lcd.setCursor(0, 1);
if (relais1Actif)
{
lcd.print("R1 ON | R2 OFF ");
}
else if (relais2Actif)
{
lcd.print("R1 OFF | R2 ON ");
}
else
{
lcd.print("R1 OFF | R2 OFF ");
}
}
delay(100);
}
// Fin du code
Relais 1
Relais 2
Leds Jaune = Simulation moteur
Module RTC
09h00 => 14h00
14h00 => 20h00
Affichage HH:MM:SS
Etat Relais R1/R2 ON/OFF