Site icon AranaCorp

Utilisation de la fonction millis() de l’IDE Arduino

Pour pallier aux problèmes générés par l’utilisation de la fonction delay(), une solution possible est d’utiliser la fonction millis(). Dès la première utilisation de l’Arduino, la fonction delay() est utilisée afin de gérer les instructions en fonction du temps. Le problème majeur de la fonction delay() est qu’elle bloque l’exécution de la suite du code. Ceci devient très limitant lorsqu’on travaille avec plusieurs composants (gestions de plusieurs LEDs ou capteurs). Nous allons voir dans ce tutoriel comment utiliser la fonction millis() pour remplacer la fonction delay().

Description de la fonction millis()

La fonction millis() ne prend aucun paramètre et renvoie une valeur qui représente le nombre de millisecondes écoulées depuis la mise en tension de l’Arduino. La valeur est de type long non-signé (unsigned long, 4-bytes ou 32-bits). La valeur maximale qu’elle peut prendre est de 4,294,967,295 soit 49 jours.

N.B.: Il existe aussi la fonction micros() qui fonctionne sur le même principe mais renvoie des microsecondes.

void setup() {}

void loop() {
  Serial.print("Milliseconds since ignition: ");
  Serial.println(millis())
  delay(200);
}

Remplacer delay()

Dans les premiers exemples d’Arduino, on utilise la fonction delay() pour exécuter un bloc de code périodiquement mais ce n’est pas sa fonction propre puisqu’elle bloque l’exécution du code. La fonction millis() est bien plus adaptée pour cette fonction.

Reprenons l’exemple Blink. Nous utilisons la fonction delay pour faire clignoter une LED toutes les 200 millisecondes.

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

void loop() {
  digitalWrite(13,HIGH);
  delay(200);
  digitalWrite(13,LOW);
  delay(200);
}

Pour remplacer ce code par un structure avec millis(), l’idée est de créer une variable afin de conserver en mémoire à chaque itération la valeur de temps écoulé puis de la comparer à la valeur de temps actuelle. A chaque intervalle, nous inversons l’état de la led avec l’opérateur « ! ».

unsigned long currentTime=0;
unsigned long previousTime=0;
bool ledState=LOW;

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

void loop() {
  currentTime=millis();
  if((currentTime-previousTime)>200){
    previousTime=currentTime;
    ledState=!ledState;
    digitalWrite(13,ledState);
    Serial.print(F("LED State : "));Serial.println(ledState);
  }
}

Nous recréons l’exemple blink avec, en plus, la possibilité d’exécuter du code même si l’intervalle de temps n’est pas écoulé. Dans ce code, la led vas s’allumer et s’éteindre toutes les 200ms.

Définir différents intervalles de temps

Dans le cas où vous voudriez avoir des cycles ON et OFF de la LED avec des temps différents, il est possible de modifier l’intervalle de temps en fonction de l’état de la LED.

unsigned long currentTime=0;
unsigned long previousTime=0;
unsigned long interval,interval1=200, interval2=1000;
bool ledState=LOW;
void setup() {
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}

void loop() {
  currentTime=millis();
  if(ledState){
    interval=interval2;
  }else{
    interval=interval1;
  }
  if((currentTime-previousTime)>interval){
    previousTime=currentTime;
    ledState=!ledState;
    digitalWrite(13,
ledState);
    Serial.print(F("LED State : "));Serial.println(ledState);
  }
}

Ce code permet de ‘allumer la LED pendant 200ms toutes les secondes.

Aller plus loin

Il est important de noter que la fonction millis() utilise des timers internes du microcontrôleur et peut être perturbée par l’utilisation d’interruption ou d’autres librairies.

Pour aller vers une programmation d’un niveau plus avancé, il est possible d’utiliser les librairies de gestion de timer (Timer.h,Timer2.h, TimerOne.h, etc.)

Il est aussi possible de venir jouer avec les registres du microcontrôleur pour configurer les timers internes

Sources

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Quitter la version mobile