Main

Apprendre : Accueil | Exemples | Fondements? | Bidouillage? | Liens?
Exemples > Pour commencer

Faire clignoter une LED sans utiliser l'instruction delay


Parfois vous voudrez faire faire deux chose à la fois dans un programme. Par exemple, vous voudrez faire clignoter une LED ( ou toute autre fonction sensible au temps) tout en lisant l'état d'un bouton poussoir ou d'une autre entrée. Dans ce cas, vous ne pourrez pas utiliser l'instruction delay(), ou sinon vous arrêterez toutes les autres fonctions de votre programmes tant que la LED clignote. Le programme ne prendra pas en compte une pression sur un bouton poussoir par exemple si cela arrive pendant que l'instruction delay.

Ce programme montre comment faire clignoter une LED sans utiliser l'instruction delay. Le programme garde une trace de la dernière fois que la carte Arduino a allumé ou éteint la LED. Puis, à chaque passage dans la boucle principale loop(), le programme si un certain délai s'est écoulé à l'aide de l'instruction millis. Si c'est le cas, on inverse l'état de la LED (on l'allume ou on l'éteint).

Matériel requis

Le circuit à réaliser

Pour réaliser ce circuit :

  • prendre une LED et connecter sa patte longue (patte positive appelée anode) à la broche 13 de la carte Arduino,
  • connecter la patte courte (patte négative, appelée cathode) à la broche de masse de la carte Arduino (notée GND pour GROUND en anglais, cette broche correspond au 0V).

Image créée avec le logiciel Fritzing. Pour plus de circuits d'exemple, voir la page des projets Fritzing.

Plus d'information sur les LEDs, voir ici : http://fr.wikipedia.org/wiki/Diode_%C3%A9lectroluminescente

La plupart des cartes Arduino ont déjà une mini-LED connectée à la broche 13, intégrée sur la carte elle-même. Si vous démarrez cet exemple sans utiliser de LED externe comme indiqué ci-dessus, vous devriez voir la mini-LED de la carte clignoter.

Mise en oeuvre du programme

La LED connectée sur la broche 13 doit se mettre à clignoter.

Schéma théorique du montage

Voici le schéma théorique du montage :

Comment çà marche ?

Dans ce programme, à l'aide de l'instruction millis, on va évaluer le délai qui s'est écoulé depuis le dernier changement d'état de la LED.

Explications du programme

Au niveau de la partie déclarative préalable

  • On nomme la broche utilisée à l'aide d'un identifiant.
  • On déclare 3 variables utilisées par le programme

Au niveau de la fonction setup ()

  • On se contente de mettre en sortie la broche utilisée avec la LED

Au niveau de la fonction loop()

  • A chaque passage de la fonction loop, on évalue à l'aide d'une condition If si un certain délai s'est écoulé. L'évaluation du délai est basée sur l'utilisation de la fonction millis qui fournit à tout instant le temps écoulé depuis le démarrage de la carte Arduino.
  • Lorsque le délai fixé est écoulé, on modifie l'état de la LED et on réinitialise la variable utilisée pour l'évaluation du délai.

Le code du programme

A copier/coller dans votre logiciel Arduino.


/* Blink without Delay

Fait clignoter une LED connectée à une broche numérique en sortie
sans utiliser la fonction delay(). Ainsi, un autre code peut être exécuté,
sans être bloqué par le code de gestion de la LED.

La LED est connectée à la broche 13.

 créé en 2005
 par David A. Mellis
 modifié 8 Feb 2010
 par Paul Stoffregen

 Cet exemple est dans le domaine public.
Traduction française par X. HINAULT - www.mon-club-elec.fr

 http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
 */


/////////////////////// 1. Entête déclarative ///////////////////////////

// Les constantes ne changent pas durant le programme.
// Utilisée ici pour définir la numéro de la broche :

const int ledPin =  13;      // crée un identifiant pour la broche utilisée avec la LED

// Les variables sont modifiées au cours du programme
int ledState = LOW;             // ledState est utilisée pour fixer l'état de la LED (HIGH/LOW)

// les variables suivantes sont de type long car le temps, mesuré en millisecondes
// devient rapidement un nombre qui ne peut pas être stocké dans un type int.

long previousMillis = 0;        // variable pour mémoriser le temps écoulé depuis le dernier changement de la LED
long interval = 1000;           //intervalle de clignotement de la LED (en millisecondes)

///////////////////// 2. Fonction d'initialisation Setup ///////////////////////

void setup() {

  // configure la broche numérique en SORTIE
  pinMode(ledPin, OUTPUT);      

}

////////////////// 3. Fonction principale Loop /////////////////////////////

void loop()
{
  // Ici, mettre le code que vous voulez exécuter tant que la LED clignote

  // Vérifie si le délai est écoulé depuis le dernier changement d'état de la LED
  // C'est le cas si la différence entre la valeur courante renvoyée par millis()
  // et la valeur de la variable du temps du dernier changement d'état de la LED
  // est supérieure à la valeur de l'intervalle de clignotement.

  unsigned long currentMillis = millis(); // stocke la valeur courante de la fonction millis()

  if(currentMillis - previousMillis > interval) {

    // mémorise la valeur de la fonction millis()
    previousMillis = currentMillis;  

    // inverse la variable d''état de la LED
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // modifie l'état de la LED
    digitalWrite(ledPin, ledState);
  }
}
 

Voir également

La documentation des composants utilisés

La documentation des instructions utilisées :

La documentation des stratégies de programmation utilisées

Les autres exemples suivants :

Commentaires utilisateurs

  • Il est possible également d'exécuter un code à intervalle régulier en utilisant une interruption. Voir notamment la librairie : http://www.arduino.cc/playground/Main/MsTimer2
  • Il faut bien saisir ici le temps processeur très important dont on dispose entre la survenue de 2 changements d'état de la LED : il es possible de faire réaliser un très grand nombre de chose à la carte Arduino.
  • On peut même envisager d'étendre ce principe en faisant réaliser plusieurs tâches à intervalles régulier, permettant ainsi d'obtenir un effet de multi-tâche émulé.

Page d'accueil de la référence Arduino en français

Corrections, suggestions et nouvelle documentation peuvent être postées sur le Forum Arduino.

La présente traduction française commentée a été réalisée par Xavier HINAULT (2010) (www.mon-club-elec.fr) et est sous licence Creative Commons Attribution-ShareAlike 3.0. Cette page est la traduction française commentée de la page originale : http://arduino.cc/en/Tutorial/BlinkWithoutDelay