Bonjour , en enlevant les evenements : gel , pluie ca donne ceci :
Maintenant , si j ' enleve aussi les evenements d' activation et d' arret , je me retrouve avec :
cela parait il mieux ?
A noter que finalement , initial auto , ne me parait pas etre un etat mais plutot un evenement de la consequence de l ' initialisation de l' arrosage automatique ...
sauf que je suis toujours autant perdu , quand a comment mettre en place tout cela .
Vis a vis du code ci dessus , ne peut on pas gerer les evenements avec une machine a etats ?
car cela semble finalement correspondre a ca non ?
Si oui , dans ce cas , ne faudrait il pas que j' integre la fonction gererUn_A_A(t_arrosage* unArrosage) dans la fonction gererUnArrosage(t_arrosage* unArrosage) dans le case AUTO ? ca me parait en fait assez logique .
ce qui donnerait alors :
void gererUnArrosage(t_arrosage* unArrosage) {
switch (unArrosage->etat) { // INCONNU, ACTIF, INACTIF, TIMER, AUTO
case INCONNU:
for (uint8_t a = 0; a < NOMBREDARROSAGE; a++) initialiserUnArrosage(&(lesArrosages[a]));
break;
case ACTIF: // MARCHE, ARRET, NULL_A, MARCHE_TOUT, ARRET_TOUT
if ((commandeWeb.active) && (commandeWeb.arrosage == unArrosage)) {
if (commandeWeb.actionCMD_A == ARRET) {
if (DEBUG) {
Serial.print(F("* gererUnArrosage => case actif => unArrosage-> zone : "));
Serial.print(unArrosage->zone);
Serial.print(F(", unArrosage->pinRelais : "));
Serial.println(unArrosage->pinRelais);
}
desactiverUnArrosageEtUnTimer(unArrosage);
commandeWeb.active = false;
}
}
break;
case INACTIF:
if ((commandeWeb.active) && (commandeWeb.arrosage == unArrosage)) {
if (commandeWeb.actionCMD_A == MARCHE) {
if (DEBUG) {
Serial.print(F("* gererUnArrosage => case inactif => unArrosage-> zone : "));
Serial.print(unArrosage->zone);
Serial.print(F(", unArrosage->pinRelais : "));
Serial.println(unArrosage->pinRelais);
}
activerUnArrosageEtUnTimer(unArrosage);
commandeWeb.active = false;
}
}
break;
case TIMER:
if ((commandeWeb.active) && (commandeWeb.arrosage == unArrosage)) {
if (commandeWeb.actionCMD_A == TIMERR_A) {
inverserUnArrosageEtUnTimer(unArrosage);
commandeWeb.active = false;
if (DEBUG) {
Serial.print(F("* gererUnArrosage => case TIMER => unArrosage-> zone : "));
Serial.print(unArrosage->zone);
Serial.print(F(", unArrosage->pinRelais : "));
Serial.println(unArrosage->pinRelais);
}
}
}
break;
case AUTO :
if (arrosageAutoON) for (uint8_t a = 0; a < NOMBREDARROSAGE; a++) gererUn_A_A(&(lesArrosages[a]));
break;
default:
if (DEBUG) Serial.println(F("* gererUnArrosage => probleme = case non reconnu !"));
commandeWeb.active = false;
break;
} // fin switch
// comme cette fonction est appellé en permanence , il vaut mieux eviter de mettre quoi que ce soit ici
}
void gererLesArrosages() {
if (commandeWeb.active && commandeWeb.arrosage == NULL && commandeWeb.volet == NULL && commandeWeb.actionCMD_V == NULL_V) {
if (commandeWeb.actionCMD_A == MARCHE_TOUT) for (uint8_t a = 0; a < NOMBREDARROSAGE; a++) activerUnArrosage(&(lesArrosages[a]));
else if (commandeWeb.actionCMD_A == ARRET_TOUT) for (uint8_t a = 0; a < NOMBREDARROSAGE; a++) desactiverUnArrosage(&(lesArrosages[a]));
else if (commandeWeb.actionCMD_A == A_A_ON) for (uint8_t a=0; a < NOMBREDARROSAGE; a++) initialArrosageAuto(&(lesArrosages[a]));
else if (commandeWeb.actionCMD_A == A_A_OFF) for (uint8_t a=0; a < NOMBREDARROSAGE; a++) desactiverUnArrosageAuto(lesArrosages[a].pinRelais);
commandeWeb.active = false;
}
else {
for (uint8_t a = 0; a < NOMBREDARROSAGE; a++) gererUnArrosage(&(lesArrosages[a]));
}
}
/***************************************************************************************************************/
/* mode auto */
void gererUn_A_A(t_arrosage* unArrosage) {
switch (unArrosage->etat_auto) { // ON, OFF, INITIAL, EN_ATTENTE, A_ACTIVER, EN_ARROSAGE, ARROSE
case EN_ATTENTE:
attenteUnArrosageAuto(unArrosage);
break;
case A_ACTIVER:
marcheArrosageAuto(unArrosage);
break;
case EN_ARROSAGE:
break;
case ARROSE:
retourEnAttenteAuto(unArrosage);
break;
default:
if (DEBUG) Serial.println(F("* gererUn_A_A => probleme = case non reconnu !"));
break;
}
}
l ' idée , c ' est de pouvoir conserver un arrosage manuel avec un arret apres un temps donné en permanence , et disposer d ' un arrosage entierement automatisé activable / desactivable .
En esperant que je sois relativement clair avec mes explications 
est il possible de regrouper tout dans une fonction de gestion , ca serait certainement plus simple a gerer , par exemple comme cela :
void gererUnArrosage_TEST(t_arrosage* unArrosage) {
switch (unArrosage->etat) { // INCONNU, EN_ARROSAGE, EN_ATTENTE, TIMER, A_ACTIVER, ARROSE
case INCONNU:
for (uint8_t a = 0; a < NOMBREDARROSAGE; a++) initialiserUnArrosage(&(lesArrosages[a]));
break;
case EN_ARROSAGE:
if ((commandeWeb.active) && (commandeWeb.arrosage == unArrosage)) { // mode manuel
if (commandeWeb.actionCMD_A == ARRET) {
if (DEBUG) {
Serial.print(F("* gererUnArrosage => case actif => unArrosage-> zone : "));
Serial.print(unArrosage->zone);
Serial.print(F(", unArrosage->pinRelais : "));
Serial.println(unArrosage->pinRelais);
}
desactiverUnArrosageEtUnTimer(unArrosage);
commandeWeb.active = false;
}
}
else if (arrosageAutoON) { // mode auto
}
// inclure les evenements de capteur pour la pluie et le gel
break;
case EN_ATTENTE:
if ((commandeWeb.active) && (commandeWeb.arrosage == unArrosage)) {
if (commandeWeb.actionCMD_A == MARCHE) {
if (DEBUG) {
Serial.print(F("* gererUnArrosage => case inactif => unArrosage-> zone : "));
Serial.print(unArrosage->zone);
Serial.print(F(", unArrosage->pinRelais : "));
Serial.println(unArrosage->pinRelais);
}
activerUnArrosageEtUnTimer(unArrosage);
commandeWeb.active = false;
}
}
else if (arrosageAutoON) {
attenteUnArrosageAuto(unArrosage);
}
// inclure les evenements de capteur pour la pluie et le gel
break;
case TIMER:
if ((commandeWeb.active) && (commandeWeb.arrosage == unArrosage)) {
if (commandeWeb.actionCMD_A == TIMERR_A) {
inverserUnArrosageEtUnTimer(unArrosage);
commandeWeb.active = false;
if (DEBUG) {
Serial.print(F("* gererUnArrosage => case TIMER => unArrosage-> zone : "));
Serial.print(unArrosage->zone);
Serial.print(F(", unArrosage->pinRelais : "));
Serial.println(unArrosage->pinRelais);
}
}
}
break;
case A_ACTIVER:
if (arrosageAutoON) {
marcheArrosageAuto(unArrosage);
}
break;
case ARROSE :
if (arrosageAutoON) {
retourEnAttenteAuto(unArrosage);
}
break;
default:
if (DEBUG) Serial.println(F("* gererUnArrosage => probleme = case non reconnu !"));
commandeWeb.active = false;
break;
} // fin switch
}
EDIT , j ' ai tenté la modification pour n' avoir qu ' une seule fonction de gestion , ce qui evite de faire 2 boucles distinctes sur arrosage , mais je ne sais pas si c ' est une bonne idée ou pas ...
voilà ce que ca donne :
serveur_machine_etats_7.337_un_seul_gestion.zip (40.6 KB)