Ce n'est pas encore parfait.
le but est qu'une condition réalisée ne doit pas être répétée pour ne pas créer d'évènements parasites comme tu as eu.
if (!relais1 && !digitalRead(VictronNO)) {
// la condition n'est plus lu dès que le relais1 est activé
chrono1 = millis();
digitalWrite(OnanSTART, LOW);// active le relais
relais1 = true;
relais2 = false;
chrono2 = 0; // est inutile
}
Cette condition détecte le basculement de l'interrupteur sur on
Quand la condition !digitalRead(VictronNO)) est réalisée, passer relais1 = true fait qu'à la prochaine boucle loop(), la condition ne peut plus être répétée.
C'est le principe d'inclure une variable dans la condition pour la changer dès la condition est réalisée.
if (millis() - chrono1 > dureeSTART) {
digitalWrite(OnanSTART, HIGH);// relais1 remis au repos
}
Va être exécutée par la suite à chaque boucle loop(). ce n'est pas génant puisque ça confirme la fermeture du relais1, mais ça pourrait créer un problème dans certaine conditions.
Pour l'exécuter qu'un fois, il faut aussi une variable bool supplémentaire, arretRelais1 me semble adéquate :
if (! arretRelais1 && millis() - chrono1 > dureeSTART) {
digitalWrite(OnanSTART, HIGH);// relais1 remis au repos
arretRelais1 = true;
}
Il faudra la déclarer en entête.
J'espère que c'est plus clair pour toi ![]()