Salut,
J’ai pas eu de retours de comment a procédé mon pote, mais à partir de quelques tutos trouvés sur le net, j’aurais proposé le code suivant, qui ne fait pas appel à la fonction delay() ce qui évite de figer le programme.
C’est un exemple pour traiter les changements d’état du bit 0 du byte relayLo.
Je pense que ça fonctionne, mais j’ai pas le matos nécessaire pour vérifier.
Si ça fonctionne, à décliner pour tous les bits du byte relayLo.
void SetRelays(void) {
static boolean bit0Status, bit0MemoryState = 0; // Déclaration des variable booléennes qui vont permettre de détecter un front montant ou descendant du bit 0 du byte relayLo:
static char bit0Counter = 0; // Un compteur pour conmpter le temps d'activation du des pins
bit0Status = bitRead(relayLo,0); // Lecture de l'état du bit 0 du byte relayLo et stockage dans la variable bit0Status
if (( bit0Status != bit0MemoryState) && (bit0Status == 1)) // Si le bit0Status est différent de son état mémoire & qu'il est à 1, c'est qu'on a eu un changement de 0 à 1 de la part d'AOG
{
/*Description du if else qui suit :
* Si le bit0Counter est inférieur à 5, la fonction SetRelays a été appellée moins de 5 fois depuis que le AOG a changé l'état du bit 0 du byte relayLo
* Si le résultat est supérieur, c'est que la fonction a été appelée plus de 5 fois
* La boucle principale qui appelle la fonction SetRelays est exécuté toutes les 200ms (voir le début de la boucle void loop () avec le currentTime
* Donc pour activer la sortie 1 seconde, il faut que la fonction setRelays soit appelée 5 fois.
* Pour ajuster le temps d'activation de la sortie, ajuster le compteur qui permet d'ajuster par pas de 200ms
*/
if (bit0Counter <= 5)
{
bitSet(PORTD, 5); // On active digital pin 5
bit0Counter++; // On incrémente de 1 bit0Counter
}
else
{
bitClear(PORD, 5); // On désactive digital pin 5
bit0MemoryState = bit0Status; // On met en mémoire l'étant du bit 0 fournis par AOG pour ne plus activer la sortie tant qu'on a pas eu de changement d'état du bit 0 de la part d'AOG
bit0Counter == 0; // On remet le compteur à 0 pour le prochain coup
}
}
if (( bit0Status != bit0MemoryState) && (bit0Status == 0)) // Si le bit0Status est différent de son état mémoire & qu'il est à 0, c'est qu'on a eu un changement de 1 à 0 de la part d'AOG
{
if (bit0Counter <= 5)
{
/* bitSet(PORTD, ??) activer ici le pin qui t'interesse */
bit0Counter++; // On incrémente de 1 bit0Counter
bit0Counter == 0; // On remet le compteur à 0 pour le prochain coup
}
else
{
/* bitClear(PORD, ??); désactiver ici le pin qui t'interesse */
bit0MemoryState = bit0Status; // On met en mémoire l'étant du bit 0 fournis par AOG pour ne plus activer la sortie tant qu'on a pas eu de changement d'état du bit 0 de la part d'AOG
}
}
}
Attention, j’ai pas la carte relays, j’ai peut-être inversé l’état des sorties pour l’activation / désactivation des relais.
En espérant que ça puisse t’aider.
Math