Arduino cours 2, le temps en millis et delay

7868

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.

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

 

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.

 

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");
}

}

}

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.

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