Coupure de tronçons

Salut,

Voici le code final, suite aux tests et debugs de Tooki, au cas où certains soient intéressés.

Ce code est un exemple avec les hypothèses suivantes:

  • Quand AOG commande la section piloté par le bit 0 du byte relayLo:
    • On doit générer une pulsation (simule l’appuie sur un bouton physique) sur le relais branché sur la pin Digital pin 5, quand AOG commande la section de 0 à 1
    • On doit générer une pulsation sur le relais branché sur la pin Digital pin 13 quand AOG commande la section de 1 à 0
    • La pulsation doit être de 1 seconde

Le code est pour une section. Il est à copier et a adapter pour les autres sections à piloter : autres bits du byte relayLo à aller lire et adapter les sorties à piloter en conséquence.
Seule la variable globale pulseCounter n’a pas besoin d’être dupliquée.

Globalement, ce que fait le code, c’est qu’il détecte un front montant ou descendant sur le bit0 du byte relayLo et va générer en fonction du front une pulsation l’une ou l’autre des sorties Digital pin 5 ou 13.

Variables à déclarer en début de programme, avant la boucle “void setup ()”:

// Paramètres pour generateur de pulse sur sorties relais
#define pulseCounter 5 // Compteur qui défini le temps du pulse par pas de 200ms (ici 5*200ms = 1s)
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:
char bit0Counter = 0; // Un compteur pour compter le temps d'activation du/des sorties commandées par le bit 0 du byte relayLo

Modifications de la fonction void “SetRelays(void)”:

void SetRelays(void) {

  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 sur le bit 0 du byte relayLo
  {
    /*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" et le "if" sur le "currentTime")
     * Donc pour activer la sortie 1 seconde, il faut que la fonction setRelays soit appelée 5 fois
     * Cette logique va permettre d'activer la sortie qui pilote le relais avec un échellon d'un durée de 1s quand on a une commande de section de la part d'AGO
     * Pour ajuster le temps d'activation de la sortie, ajuster le compteur (pulseCounter) qui permet d'ajuster par pas de 200ms
     */
    if (bit0Counter <= pulseCounter)
    {
      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 sur le bit 0 du byte relayLo
  {
    if (bit0Counter <= pulseCounter) // Boucle if else idem que précédente, mais sur un autre relais, pour le cas du changement du bit 0 byte relayLo de 1 à 0 par AOG
    {
      bitSet(PORTB, 5); // On active le digital pin 13
      bit0Counter++; // On incrémente de 1 bit0Counter
    }
    else
    {
      bitClear(PORDB, 5); // On désactive le digital pin 13
      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
    }
   }
}

Math

2 Likes