Du rythme sans delay

Comment exécuter des tâches à intervalle de temps régulier, sans bloquer le reste du programme principal ?

Pourquoi delay bloque-t-il ?

On souhaite faire clignoter un LED toute les secondes.

Soit le programme simple suivant :

const int LED_PIN = 13; // LED intégrée
byte ETAT_LED = LOW;
const unsigned long PERIODE = 500; // ms

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

void loop() {
    // On allume/éteint la LED
    digitalWrite(LED_PIN, ETAT_LED);

    // Affichage du temps écoulé (en ms) et lde l'état de la LED
    Serial.print(millis());
    Serial.print("\t");
    Serial.println(ETAT_LED);
    // On change l'état de la LED
    ETAT_LED = !ETAT_LED ;
    
    // On attend ...
    delay(PERIODE);
}

Téléverser ce programme dans l’Arduino

Ouvrir le Moniteur Série

Observer les lignes Temps-État qui s’affichent dans le moniteur série et décrire le phénomène qui se produit au bout d’une certaine durée d’exécution.

 

Pour éviter cela, on utilise deux variables :

  • t pour relever le temps écoulé depuis le démarrage de l’Arduino avec la fonction millis() :
    • On fait ce relevé le plus fréquemment possible, à chaque exécution de la boucle principale loop().
  • t0 pour mémoriser le dernier instant où la LED a changé d’état :
    • On compare t0 à t pour savoir s’il est temps de réaliser la tâche,
    • On initialise cette variable (on lui affecte la valeur de t) dès que la tâche est réalisée.

 

const int LED_PIN = 13;
byte ETAT_LED = LOW;
const unsigned long PERIODE = 500; // ms
unsigned long t0 = 0;

void setup() {
  pinMode(LED_PIN , OUTPUT);
  Serial.begin(9600);
}

void loop() {
  unsigned long t = millis();
  if (t-t0 >= PERIODE) {
    t0 = t;
    // On allume.éteint la LED
    digitalWrite(LED_PIN, ETAT_LED);

    // Affichage du temps écoulé (en ms) et lde l'état de la LED 
    Serial.print(millis()); 
    Serial.print("\t"); 
    Serial.println(ETAT_LED);
    
    // On change l'état de la LED
    ETAT_LED = !ETAT_LED ;
  }
}

 

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *