Utiliser la LED de l'Arduino pour "monitorer" les boucles actives/passives

Bonjour,

Ceci est un post de partage, voici une petit code que je viens de faire pour moi, et je me demande si ça peut aider quelqu’un, mais aussi ce que vous en pensez (optimisation ?)

Le but est d’utiliser la LED pour renseigner un peu l’utilisateur sur l’activité de la LOOP, dans le cas ou est elle contient principalement une grosse condition.

La fonction Activity ressemble à “BlinkWithoutDelay”, elle fait principalement clignoter la LED, mais elle sert aussi à relever les compteurs de boucles.

#define LED_PIN 13
#define MONIT_PERIOD 1000        // délai en millisecondes pour relever les compteurs de boulces
#define BLINK_PERIOD 300         // délai en millisecondes de la période de clignotement de la LED (On+off)

unsigned int durationOn,durationOff;    // Dutées allumée et durée éteinte (le total est égal à refreshPeriod)
unsigned int loopAct,loopPas;           // Compteurs de boucles actives et passives
unsigned long lastMonit,lastBlink;      // timeStamp du dernier relevé des compteur et du dernier clignotement
boolean ledState;                       // Statut de la LED

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {

  if (loopAct<18000) {
    loopAct++;                       // Incrémente le compteur de boucles actives
  }
  else loopPas++;                    // Incrémente le compteur de boucles passives
 
  activity();                        // Lance la fonction de de "monitoring"

}

void activity() {
    if (ledState)          // SI la LED est allumée...
  {
    if (millis()>lastBlink+durationOn)  // ...et SI la durée d'allumage est ateinte...
    {
      lastBlink=millis();               // ...timestamp du clignotement actuel...
      ledState = false;                 // ...extinction du flag et de la LED...
      digitalWrite(LED_PIN,LOW);    
    }

  }
  else                    // mais SI la LED est eteinte...
  {
    if (millis()>lastBlink+durationOff) // ...et SI la durée d'extinction est ateinte...
    {
      lastBlink=millis();               // ...timestamp du clignotement actuel...
      ledState = true;                  // ...allumage du flag et de la LED.
      digitalWrite(LED_PIN,HIGH);     
    }
  }
  
  if (millis()>lastMonit+MONIT_PERIOD)  // Si la période de relevé des compteur est atteinte...
  {
    lastMonit=millis();
    durationOn=map(loopAct,0,loopAct+loopPas,0,BLINK_PERIOD);    // ...Calcul de la durée allumée de la LED...
    durationOff=BLINK_PERIOD-durationOn;                         // ...déduction de la durée éteinte de la LED...
    loopAct=0;                            // ...remise à 0 des compteurs de boucles
    loopPas=0;
  }
}

Les informations fournies en fonction des cas :

  • Ma LED clignote ON/OFF avec aucune prédominance très marquée

  • J’ai passé le “setup” et je suis dans la “loop”

  • Ma condition n’est pas toujours vraie, ni toujours fausse et il reste des ressources dispo

  • Ma LED s’allume très peu

  • La condition n’est jamais remplie (très léger flash)

  • la boucle active consomme très peu de ressources

  • Ma LED s’allume beaucoup

  • La boucle active est gourmande

  • La condition est toujours vraie (allumage fixe, sans clignotement)

Heuuuu personne n'a jamais tenté un truc de ce genre ?
:roll_eyes:

Bonjour,

Je pense qu'on préfère plutôt passer par Serial pour obtenir des informations de débogage :wink:

Mon Serial est pris par ma liaison MIDI (mais vive le Leonardo !!)
Et puis le Serial Debug c'est pas pérenne, alors que j'aime bien l'idée de la LED qui te dis si ton sketch tourne "correctement"... mais bon je dois être le seul.

En tout cas merci pour ta réponse :wink:

J’avais un code bourré d’ISR, et histoire de savoir où j’en étais au niveau du temps restant pour loop(), j’avais utilisé un truc plus simple :

#define debugg 1  // à commenter pour ne plus débugger

(...)

ISR (event){
#ifdef debugg
    digitalwrite (led_pin, HIGH);
#end if

// traitement de l'ISR


#ifdef debugg
  digitalwrite (led_pin, LOW);
#end if

}

(...)

ce qui marche très bien et permet en une simple modif de virer le code de débugg… on regarde soit l’intensité de la led (plus elle s’allume, plus les ISR sont gourmandes), soit sur un oscillo, soit avec un bon voltmetre qui donne la valeur moyenne de la pin (0V → il reste un max de temps; 5V → il faut alléger!)

Effectivement, c'est du même tonneau que mon "machin".

Mon code m'a été utile pour la première fois hier, avec un MPU6050 (Gyro-Accéléro) qui faisait varier une LED RVB, j'avais des accros dans les changements de couleurs.
Au départ j'avais pensé à des erreurs de calcul dans mon code, mais la LED de l'Arduino restait quasi allumée pendant que le RVB "laggait"... donc problème de perf. :smiley:

Après avoir fait quelque calcul, j'envoyais en fait trop de données sur ma liaison Série à 38400...

Je suis convaincu de l'utilité de mon code, mais j'aimerai bien le simplifier...

un exemple de ce que j'avais fait : (pour une led sur la pin D7)

#define led_test   // debugg

boolean led_state = false;

(...)

ISR(WDT_vect) {    // scanne toutes les entrées  (via Watch Dog Timer)

#if defined(led_test)
  push(led_state);
  led_state = true;
  PORTD |= 0x80;         // allume la led D7
#endif  

  if (ad_waiting == FF) {         // aucune conversion en cours
    ad_waiting = 0;
    ad_flag &= 0xFE;
    ADMUX &= 0xE0;    //  conversion de Ain0
    ADCSRA |= 0x40;  // démarrer le train de conversion
  }  

#if defined(led_test)
  pop(led_state);
  if(!led_state) PORTD &= 0x7F;         // éteind la led D7 si elle n'était pas allumée avant l'isr
#endif  

}

à suivre...

Yep!

Personnellement, les cartes arduino n'étant pas avares en broches digitales, j'utilisais sur un de mes proto 3 leds de couleurs différentes pour donner l'état de fonctionnement de l'ensemble (le principe du feu tricolore en bref). Je n'ai jamais songé à pousser cette méthode de renseignement à ce genre d'extrémité. Mais l'idée est intéressante.

A creuser donc.

@+

Zoroastre.

C'est tout à fait le principe du feu tricolore mais avec une seule LED, qui est déjà installée :wink:

J'avais bien compris :wink:

Sauf que pour mon cas, je fabrique mes propres cartes et leur fonctionnement doit être accessible/compréhensible à une faible femme...(Ce qui n'est pas une mince affaire :grin: )

@+

Zoroastre.

PS : Tu ne serais pas "debianiste" par hasard :wink:

zoroastre:
accessible/compréhensible à une faible femme...(Ce qui n'est pas une mince affaire :grin: )

J'espère qu'elle ne te lit pas, une femme, faible ou forte, prend en général assez mal ce genre de compliment...

Mais en effet, (faible ou forte), c'est pas gagné...

une petite librairie "debugg.h" serait au top...