Accueil Arduino Arduino Cours : Timing avec delay() et millis() – Tutoriel débutant

Arduino Cours : Timing avec delay() et millis() – Tutoriel débutant

Aujourd’hui nous allons voir la notion du temps avec arduino en utilisant des delay et calculer le temps avec millis.

On va compléter notre code de feu tricolore pour voir les effet de delay et millis.

Il nous faut 2 led , 2 résistances adaptées aux led (150 Ω) , 2 boutons avec 2 résistance pour un montage pull-down et un arduino pour comprendre tout ça.

Ps : j’ai utilisé des résistances de 220Ω pour les led car je n’ai pas plus petit et des 1kΩ pour les boutons.

Niveau câblage on se base sur le tutoriel précédent, donc on utilise les pin 7 et 10 pour les deux led, ainsi que 2 boutons pin 3 et 4.

Matériel & montage (2 LEDs + 2 boutons)

schéma câblage delay et millis

Delay

Commençons par utiliser delay

L’instruction delay permet de faire une pause dans le programme, cela peut être utile a certains moments pour recevoir des données après un certain temps mais durant le temps de delay notre arduino ne répondra plus a nos demandes.

Ce que l’on va rajouter à notre programme c’est un “delay” de 4 secondes pour bloquer toute autre instruction

Je rajoute l’instruction delay(4000); qui correspond a 4 secondes d’attente.

A l’intérieur le temps est exprimé en millisecondes.

Il faut rajouter cette valeur a l’intérieur des 2 conditions IF a la fin avant l’accolade finale du IF

Exemple avec delay()

 

const int pinLed1a=10;
const int pinLed2a=7;
const int pinBouton1=4;
const int pinBouton2=3;

void setup() {

  Serial.begin(9600);
    // put your setup code here, to run once:
  pinMode(pinLed1a,OUTPUT);
  pinMode(pinLed2a,OUTPUT);

  pinMode(pinBouton1,INPUT);
  pinMode(pinBouton2,INPUT);

  digitalWrite(pinLed1a,HIGH);

}

void loop() {
  // put your main code here, to run repeatedly:

  if(digitalRead(pinBouton1)== HIGH){

    digitalWrite(pinLed1a,HIGH);
    digitalWrite(pinLed2a,LOW);

     Serial.print("Feu 1 allume");
     Serial.print("\r\n");

     delay(4000);
  }

  if(digitalRead(pinBouton2)== HIGH){

    digitalWrite(pinLed1a,LOW);
    digitalWrite(pinLed2a,HIGH);

     Serial.print("Feu 2 allume");
     Serial.print("\r\n");

     delay(4000);

  }

}

Ce que l’on constate c’est que si j’appui sur le bouton 1 et que j’appuie tout de suite après sur le bouton 2 , le bouton 2 ne sera pas pris en compte pendant la durée de 4 secondes ici définie.

Le delay est intéressant si l’on a besoin d’empêcher toute autre événement pendant l’action.

Télécharger le code Delay

Millis

Maintenant que vous connaissez l’instruction pour mettre un temps d’arrêt nous allons maintenant utiliser la notion du temps avec l’utilisation des millis(); Reprenons le même schéma de la carte . Ce que je recherche maintenant à faire dans mon programme c’est que je veux que mes led automatiquement toutes les 10 secondes bascule d’un a l’autre comme pour un feu tricolore mais je veux aussi quand j’appuie sur un bouton donner l’ordre de changement la led allumé et repartir un compteur de 0. Mon programme va pas mal évoluer , passons au code et explications.

Exemple non bloquant avec millis()

 

const int pinLed1a=10;
const int pinLed2a=7;
const int pinBouton1=4;
const int pinBouton2=3;

long tempsReference;
int ledAllume;

void setup() {

  Serial.begin(9600);
    // put your setup code here, to run once:
  pinMode(pinLed1a,OUTPUT);
  pinMode(pinLed2a,OUTPUT);

  pinMode(pinBouton1,INPUT);
  pinMode(pinBouton2,INPUT);

  digitalWrite(pinLed1a,HIGH);
  ledAllume=1;
  tempsReference=millis();

}

void loop() {
  // put your main code here, to run repeatedly:

  if(digitalRead(pinBouton1)== HIGH){

    digitalWrite(pinLed1a,HIGH);
    digitalWrite(pinLed2a,LOW);

     Serial.print("Feu 1 allume");
     Serial.print("\r\n");

     tempsReference=millis();
     ledAllume=1;
  }

  if(digitalRead(pinBouton2)== HIGH){

    digitalWrite(pinLed1a,LOW);
    digitalWrite(pinLed2a,HIGH);

     Serial.print("Feu 2 allume");
     Serial.print("\r\n");

     tempsReference=millis();
     ledAllume=2;

  }

// temps ecoule ?
if(millis()> (tempsReference + 10000)){

// si la led 1 était allumée on allume la led 2 et on mémorise le temps dans notre variable tempsReference et on note quel led est maintenant allumée dans ledAllume.
if(ledAllume == 1 ){
    digitalWrite(pinLed1a,LOW);
    digitalWrite(pinLed2a,HIGH);
    tempsReference=millis();
    ledAllume=2;

     Serial.print("Feu 2 allume");
     Serial.print("\r\n");

}
else{
    digitalWrite(pinLed1a,HIGH);
    digitalWrite(pinLed2a,LOW);
    tempsReference=millis();
    ledAllume=1;

     Serial.print("Feu 1 allume");
     Serial.print("\r\n");
}

}

}

Explication du code

Ce que j’ai rajouté dans la partie variable en haut du programme ce sont 2 variable , long tempsReference; qui va nous permettre de stocker la variable de temps (long qui nous permet d’enregistrer un très gros nombre ) et int ledAllume; qui permet d’enregistrer quel led est allumée.

Partie setup je défini que led 1 est allumée au démarrage ledAllume=1; et j’enregistre la valeur du temps au moment ou j’allume ma led pour calculer le temps avant de basculer sur l’autre led tempsReference=millis(); .

Au niveau de la boucle loop je rajoute dans mes conditions de bouton tempsReference=millis(); pour mémoriser le nouveau temps de référence et je mémorise quel led est maintenant allumée ledAllume=1; si c’est le bouton 1.

Il faut maintenant créer le code qui va basculer d’une led a l’autre en fonction du temps, on continue avec une condition IF , ici if(millis()> (tempsReference + 10000)){ .

Ce qui se traduit par si le temps actuel est supérieur au temps de référence enregistré plus 10 secondes alors on respecte notre condition de changement.

A l’intérieur de cette condition maintenant que les 10 secondes sont écoulés je pose a nouveau une condition , if(ledAllume == 1){ si la led 1 est allumée alors je fais ce qu’il faut pour la led 2 ; sinon ( else ) je m’occupe de la led 1 .

Dans le cas de la led 1 allumée a l’intérieur de la condition je vais éteindre la led 1 et allumer la led 2, puis je met une nouvelle valeur dans le temps de référence tempsReference=millis(); ainsi que la valeur de ledAllume=2; car la led 2 est maintenant allumée.

On peut rajouter des valeurs Serial pour suivre l’évolution du programme Serial.print(“Feu 2 allume”); …

Je vous donne le code complet pour cette partie  mais je lance un mini défi pour compléter le programme.

Télécharger le code a compléter

Maintenant le petit défi !

Notre feu tricolore ici ne réagit pas exactement comme on le souhaite, je veux pouvoir aussi rajouter une condition pour qu’il y ait un temps minimum avant de basculer d’une led a l’autre si j’appuie un bouton et ne pas repartir a zero si j’appuie sur le bouton correspondant a la led ( led1 = bouton1 ).

Pour rajouter une condition dans un if , j’utilise le “&&” double & puis ma condition a ajouter.

Ici 2 conditions supplémentaires sont nécessaires a 2 endroits différents.

[su_spoiler title=”Voir un indice”]je dois compléter ma condition sur l’appui du bouton if(digitalRead(pinBouton1)== HIGH)[/su_spoiler]

https://youtube.com/watch?v=5f0ZTeg01Do

Je vous donne mon code pour corriger si cela ne fonctionne pas chez vous , mais sachez qu’il y a différentes manières de coder qui amèneront au même résultat.Télécharger le code.

Notre feux tricolore est presque fini, dans le prochain tutoriel on le termine donc il vous faudra quelques led en plus et un peu du matériel de récupération pour le rendre utilisable avec des enfants.

📌 FAQ – Comprendre millis() et delay() avec Arduino

Q : Quelle est la différence entre millis() et delay() ?
R : delay() stoppe totalement l’exécution du programme pendant un certain temps (en millisecondes), tandis que millis() permet de mesurer le temps écoulé sans bloquer le code. millis() est donc plus adapté aux programmes multitâches.


Q : Quand faut-il utiliser millis() plutôt que delay() ?
R : Utilisez millis() dès que vous avez besoin que plusieurs actions s’exécutent simultanément ou que le programme reste réactif (détection d’un bouton, communication série, etc.). delay() peut être utilisé pour les tests ou projets très simples.


Q : Comment fonctionne millis() ?
R : La fonction millis() retourne le nombre de millisecondes écoulées depuis le démarrage du programme. Elle est souvent utilisée avec des conditions pour exécuter des actions à intervalles réguliers sans bloquer le reste du code.


Q : Est-ce que millis() se réinitialise ?
R : Oui, après environ 50 jours, millis() revient à 0 à cause du dépassement de capacité du type unsigned long. Il faut prévoir ce comportement dans des systèmes critiques.


Q : Peut-on simuler un minuteur avec millis() ?
R : Oui, et c’est une des utilisations les plus courantes. Vous pouvez déclencher une action après un certain temps écoulé sans bloquer l’Arduino, contrairement à delay().

🔗 À découvrir aussi sur Retro&Geek

👉 Arduino – Utiliser un écran LCD 16×2
Affichez le temps écoulé en temps réel sur un écran LCD avec millis().

👉 Arduino – Fabriquer un minuteur à base de NE555
Une autre approche pour créer un système de temporisation, sans microcontrôleur.

👉 Arduino – Feu tricolore pédagogique
Un projet classique où vous pouvez remplacer delay() par millis() pour le rendre plus fluide.

👉 Arduino – Contrôler un servomoteur
Combinez les temporisations avec le contrôle moteur pour des mouvements temporisés précis.

N’hésitez pas à poser vos questions sur les réseaux sociaux de la chaîne twitter , facebook ,youtube ; si vous ne comprenez pas certaines parties du tutoriel, me dire ce que vous aimeriez que je crée pour en faire des vidéos tutoriel ,à partager les projets que vous aimeriez créer etc…

Comme toujours allez sur la page de C’est quoi Retro et Geek pour connaître tout ce que je recherche à faire sur la chaîne.

Merci les RetroGeeker et RetroGeekeuse

Sur une échelle de 1 à 5, comment évalueriez-vous la convivialité de notre site Web?
J'ai besoin de ton avis
Envoyer mon avis
Quel genre de contenu aimeriez-vous voir plus souvent sur RetroetGeek ?
Quel aspect de RetroetGeek aimeriez-vous voir amélioré en priorité ?
Autre chose à dire ?
______________________________________________________________________________
Sur une échelle de 1 à 5, comment évalueriez-vous la convivialité de notre site Web?
J'ai besoin de ton avis
Envoyer mon avis
Quel genre de contenu aimeriez-vous voir plus souvent sur RetroetGeek ?
Quel aspect de RetroetGeek aimeriez-vous voir amélioré en priorité ?
Autre chose à dire ?
______________________________________________________________________________
Rejoignez la Newsletter!
Soyez informé des nouveautés directement dans votre boite email
S'abonner
Rejoignez la Newsletter!
Soyez informé des nouveautés directement dans votre boite email
S'abonner
Newsletter
Cookie
Ce site utilise des cookies pour vous garantir la meilleure expérience sur notre site. Vous pouvez changer les paramètres que vous souhaitez.
Mentions légales & cookies
Paramètres Cookies
Oui, j'aime les Cookies !
Beurk ! ( non )
cookie
Cookie
Ce site utilise des cookies pour vous garantir la meilleure expérience sur notre site. Vous pouvez changer les paramètres que vous souhaitez.
Mentions légales & cookies
Paramètres Cookies
Oui, j'aime les Cookies !
Beurk ! ( Non )
cookie