Voici, j'en suis là, ça a l'air de fonctionner.
Maintenant je souhaiterai faire mon interval et déclencher suivant la durée de l'interval sur 24h.
Ex: P1_nbrDeclenchement = 3 sur 24h cela fait un 1er déclenchement à l'heure de réf, un 2e 8h après et un 3e 8h après.
Donc pour l'interval je pense faire:
unsigned long P1_interval = 86400 / P1_nbrDeclenchement ;
Et là je sèche ![]()
Pourriez vous m'aiguiller?
Merci par avance.
// 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: P1_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
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 rtc;
const int P1_Relai = 48;
const int P2_Relai = 50;
const int P3_Relai = 52;
unsigned long heure_ActuelleEnSeconde;
//Start de référence pour le calcul des déclenchements suivant
//il est souvent pratique de représenter un moment de la journée par le nombre de secondes écoulées depuis minuit.
// par exemple pour 11h20 et 30 secondes, on écrirait: unsigned long t = 11*3600ul + 20*60 + 30; // le ul pour quel le calcul se fasse bien en unsigned long
unsigned long P1_RefStart = 19 * 3600ul + 10 * 60 + 0; //18h 32m 30sec. le ul pour quel le calcul se fasse bien en unsigned long
unsigned long P2_RefStart = 11 * 3600ul + 15 * 60 + 20; //11h 15m 20sec. le ul pour quel le calcul se fasse bien en unsigned long
unsigned long P3_RefStart = 15 * 3600ul + 25 * 60 + 35; //15h 15m 35sec. le ul pour quel le calcul se fasse bien en unsigned long
// Durée du déclenchement en secondes.
unsigned long P1_Duree = 10;
unsigned long P2_Duree = 15;
unsigned long P3_Duree = 20;
// Arrêt de référence calculé.
unsigned long P1_RefStop = P1_RefStart + P1_Duree;
unsigned long P2_RefStop = P2_RefStart + P2_Duree;
unsigned long P3_RefStop = P3_RefStart + P3_Duree;
// nbr_declenchement_Px sera modifier suivant les besoins.
// ex: si nbr_declenchement_Px = 3, 1 déclenchement à Px_RefHeure puis le 2e et le 3e déclenchement après interval de x minutes (là aussi modifiable)
uint16_t P1_nbrDeclenchement = 2; //valeur modifiable suivant les besoins
uint16_t P2_nbrDeclenchement = 3; //valeur modifiable suivant les besoins
uint16_t P3_nbrDeclenchement = 4; //valeur modifiable suivant les besoins
// interval en secondes entre 2 déclenchements sur la base de 24h.
unsigned long P1_interval = 86400 / P1_nbrDeclenchement ;
unsigned long P2_interval = 86400 / P2_nbrDeclenchement ;
unsigned long P3_interval = 86400 / P3_nbrDeclenchement ;
//Verif si relai actif Oui/Non
boolean P1_Actif;
boolean P2_Actif;
boolean P3_Actif;
//---------------------------------------- SETUP
void setup() {
//Wire.begin();
Serial.begin(9600);
Serial.println("Programme Test declenchement de relai");
if (! rtc.begin()) {
Serial.println("RTC non présent");
while (1);
}
if (! rtc.isrunning()) {
Serial.println("RTC n'est pas actif!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));// Reglage du RTC à la date & heure de la compilation du sketch
}
initialisation();
}
//---------------------------------------- LOOP
void loop() {
heureActuelleEnseconde();
P1_Start();
delay(1000);
}
//---------------------------------------- Initialisation
void initialisation()
{
pinMode(P1_Relai, OUTPUT);
pinMode(P2_Relai, OUTPUT);
pinMode(P3_Relai, OUTPUT);
digitalWrite (P1_Relai, HIGH);
digitalWrite (P2_Relai, HIGH);
digitalWrite (P3_Relai, HIGH);
P1_Actif = false; //Variable pour voir l'état du relai
P2_Actif = false;
P3_Actif = false;
}
//---------------------------------------- Heure actuelle en Seconde depuis Minuit
void heureActuelleEnseconde()
{
DateTime now = rtc.now();
Serial.println("");
Serial.print("Heure actuelle: ");
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(":");
Serial.println(now.second());
// on mets l'heure actuelle en nbr de secondes depuis minuit
heure_ActuelleEnSeconde = (now.hour() * 3600ul) + (now.minute() * 60) + (now.second());
Serial.print("En secondes: ");
Serial.print(heure_ActuelleEnSeconde);
Serial.println("");
}
//---------------------------------------- P1 Déclenchement
void P1_Start()
{
Serial.print("P1 Start à: ");
Serial.println(P1_RefStart);
Serial.print("P1 Durée: ");
Serial.println(P1_Duree);
Serial.print("P1 Stop à: ");
Serial.println(P1_RefStop);
Serial.print("P1 Actif: ");
Serial.println(P1_Actif);
if ((heure_ActuelleEnSeconde >= P1_RefStart) && (heure_ActuelleEnSeconde < P1_RefStop))
{
P1_Actif = true;
Serial.print("dbg_001");
digitalWrite (P1_Relai, LOW);
}
if (heure_ActuelleEnSeconde >= P1_RefStop)
{
P1_Actif = false;
Serial.print("dbg_002");
digitalWrite (P1_Relai, HIGH);
}
}