J-M-L:
ben faut pas mettre le tableau à deux dimensions: j'ai proposé 1 seule dimension
const char* daysOfTheWeek[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
et il ne devrait pas y avoir de souci avec cette approche (et vous gagnez de la mémoire)
Pour le code d'une manière générale j'évite de tester un moment "exact" pour déclencher quelque chose comme vous le faites avec
if ( 0 == now.hour() && 0 == now.minute()) { // si on est a 0 h et 0 min => en heures creuse .
dans l'absolu ici vous avez une minute pour que le test soit valide, donc il y a de fortes chances pour que vous ne ratiez pas le moment, mais de manière générale je préfère mémoriser le fait que je n'ai pas encore déclenché et tester avec une inégalité "si nous sommes après tel moment et que je n'ai pas encore fait le job, alors....". Comme cela vous pouvez régler un déclenchement à la milliseconde si vous voulez, quand le code fait le test c'est pris en compte même si vous aviez eu des délais par ailleurs.
sinon d'un point de vue syntaxique, un booléen est une valeur de vérité en soi, donc pas besoin de == dans un if, on n'écrit pas
if (Pluie() == false) {
mais
if (! Pluie()) {
De même on essaye d'éviter les constantes magiques, donc je déclarerais un
enum : uint8_t {DIMA?CHE, LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI};
de façon à pouvoir faire dans le switch
switch (now.dayOfTheWeek()) {
case DIMACHE:
MarcheArretArrosage ( tempsOFF , 0 ); // arrose la zone Arbres
break;
case LUNDI:
MarcheArretArrosage ( tempsOFF , 1 ); // arrose la zone Bordures
MarcheArretArrosage ( tempsOFF , 5 ); // arrose la zone Potager
break;
case MARDI:
MarcheArretArrosage ( tempsOFF , 2 ); // arrose la zone Fruitiers
break;
...
j ' ai suivi vos conseils pour les modifications , ca rend le code plus leger , plus agreable et aussi plus facile a lire ,
pour le tableau a 2 dimensions , ca ne veut pas marcher , mais le code c ' est pas moi qui l' ai ecrit , il est tiré de l' example de la bibliotheque RTClib.h
J ' ai du ajouter un tableau de booleens pour marquer les zones arrosées , et eviter les repetitions , j ' ai aussi supprimer le flag arrosageON , j ' utilise a la place l' etat du relais haut bas comme un booleen dans les comparaisons .
voilà ce que ca donne maintenant :
//// Fonctions d ' arrosage : ////
void MarcheArretArrosage ( const unsigned long tempsOFF , byte zone ) { // met en route et arrete en fonction de tempsON et tempsOFF .
byte numRelais = RELAY_NUMBER_V + zone; // pour faire correspondre la zone d' arrosage aux numeros de relais correspondants
if ( tableau_Etat_Relais [numRelais] && ! zoneArrosee[zone] ) { // si l ' arrosage est arrete pour la zone
chrono = millis(); // demarrage du chrono pour l' arret
activeRelais (numRelais); // met en route l ' arrosage de la zone concernée
//tableau_Etat_Relais[numRelais] = LOW; // TEST l ' affichage sur le serveur sans activer le relais
//MsTimer2::start();
}
if ( ! zoneArrosee[zone] && ! tableau_Etat_Relais [numRelais] && millis() - chrono > tempsOFF) { // on arrete l ' arrosage
zoneArrosee[zone] = 1; // la zone correspondante est marquee comme arosee
reInitRelais (numRelais); // on descative le relais et l ' affichage correspondant
//tableau_Etat_Relais[numRelais] = HIGH; // TEST l ' affichage sur le serveur sans activer le relais
//MsTimer2::stop();
}
}
void arrosage_autonome () { // gere l ' arrosage automatiquement
// l ' objectif est de verifier a minuit , si il est neccessaire d' arroser ou pas , donc verification de la pluie , si il ne pleut pas , on verifie l ' humidité du sol .
// si il est necessaire , en fonction du jour de la semaine on active une ou plusieurs zones pendant un temps donné .
// Arbres= 0, Bordures = 1, Fruitiers = 2, Haies = 3, Jardin = 4, Potager = 5 .
// tempsOFF et tempsON sont a 1 minute ! utiliser des multiples => tempsOFF*60 = 1 heure .
DateTime now = rtc.now(); // recupere toutes les infos du RTC .
const byte FIN_HEURE_CREUSE = 6;
enum : uint8_t {DIMANCHE, LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI};
enum : uint8_t {Arbres, Bordures, Fruitiers, Haies, Jardin, Potager};
// reset le tableau chaque jour , afin de pouvoir arroser 2 jours desuite la meme zone si besoin
if ( now.hour() > FIN_HEURE_CREUSE + 14 ) {
for ( byte i = 0; i < RELAY_NUMBER_A; i++ ) {
zoneArrosee [i] = 0;
}
}
//if ( ! Pluie() && read_Humidity_sensor() >= 50 && now.hour() < FIN_HEURE_CREUSE) { // si l ' humidité du sol , qu ' il ne pleut pas et qu on est en heure creuse
if ( 1 ) { // pour tester seulement si le reste fonctionne sans toucher aux autres conditions
switch (now.dayOfTheWeek()) {
case DIMANCHE :
if ( ! zoneArrosee [ Arbres ] ) MarcheArretArrosage ( tempsOFF , Arbres );
break;
case LUNDI :
if ( ! zoneArrosee [ Bordures ] ) MarcheArretArrosage ( tempsOFF , Bordures );
break;
case MARDI :
if ( ! zoneArrosee [ Fruitiers ] ) MarcheArretArrosage ( tempsOFF , Fruitiers );
break;
case MERCREDI :
if ( ! zoneArrosee [ Haies ] ) MarcheArretArrosage ( tempsOFF , Haies );
break;
case JEUDI :
if ( ! zoneArrosee [ Jardin ] ) MarcheArretArrosage ( tempsOFF , Jardin );
break;
case VENDREDI :
if ( ! zoneArrosee [ Potager ] ) MarcheArretArrosage ( tempsOFF , Potager );
break;
case SAMEDI :
if ( ! zoneArrosee [ Haies ] ) MarcheArretArrosage ( tempsOFF , Haies );
break;
default:
break;
} // fin du switch
}
}
//// FIN des Fonctions d ' arrosage : ////
j ' ai poussé le vice avec un enum de + pour les zones , ca fait desuite plus humain pour lire ce switch ;D
Merci beaucoup pour vos conseils toujours avises ! 8)
je met le code en PJ , a peu pres nettoyé et revu aux conseils de J-M-L .
PS : une interruption sert generalement a quoi ? et dans quel cas on l ' utilise ?
serveur_volet_arrosage_RTC.v6.1.ino (29.5 KB)