[Partage] faire clignoter une led toutes les secondes

Bonjour c'est un petit mémo qui regroupe plusieurs façons de faire clignoter une led toutes les secondes si ça peut servir à quelqu'un.

si vous avez d'autre astuces je les ajouterai à la suite.

1/ la méthode la plus courante

// clignotant 1s 

const int ledpin = 13;   // n° de la led verte de la carte

void setup() {

  pinMode(ledpin, OUTPUT); // la broche "13" est une sortie

}

void loop() {
    
  digitalWrite(ledpin, HIGH); // allume la led
  delay(500);                 // bloque le programme pendant 500ms
  digitalWrite(ledpin, LOW);  // éteint la led
  delay(500);                 // bloque le programme pendant 500ms

}

2/ en inversant la sortie suivant sont état

// clignotant 1s 

const int ledpin = 13;   // n° de la led verte de la carte

void setup() {

  pinMode(ledpin, OUTPUT); // la broche "13" est une sortie

}

void loop() { 

    digitalWrite(ledpin, !digitalRead(ledpin) ); // allume la led si elle est éteinte, et l'éteint si elle est allumée
    
    delay(500);                 // bloque le programme pendant 500ms

}

3/ en utilisant une variable

// clignotant 1s 

const int ledpin = 13;   // n° de la led verte de la carte

boolean s;

void setup() {

  pinMode(ledpin, OUTPUT); // la broche "13" est une sortie

}

void loop() { 

    digitalWrite(ledpin, s ); // allume la led ou l'éteint suivant l'état de "s"
    
    if (s==false) s=true; else s=false;   // inverse s  
    
    delay(500);                 // bloque le programme pendant 500ms

}

4/ en inversant une variable identique au 3 mais plus simple

// clignotant 1s 

const int ledpin = 13;   // n° de la led verte de la carte

boolean s=0;

void setup() {

  pinMode(ledpin, OUTPUT); // la broche "13" est une sortie

}

void loop() { 

    digitalWrite(ledpin, s ); // allume la led ou l'éteint suivant l'état de "s"
    
    s=!s;    // inverse s  
    
    delay(500);                 // bloque le programme pendant 500ms

}

5/ sans bloquer le programme et en utilisant le modulo de millis()

// clignotant 1s 

const int ledpin = 13;   // n° de la led verte de la carte

void setup() {

  pinMode(ledpin, OUTPUT); // la broche "13" est une sortie

}

void loop() { 
    
   // ne bloque pas le programme
   digitalWrite( ledpin , millis() / 500 % 2 );  // fait clignoter la led avec le modulo de millis() de 2, soit 1 ou 0
   
}

6/ en utilisant un timer avec la fonction millis()

// clignotant 1s 

const int ledpin = 13;   // n° de la led verte de la carte

unsigned long mtemps=0;  // mémorisation du temps + 500ms

boolean s=true; // état de la sortie 

void setup() {

  pinMode(ledpin, OUTPUT); // la broche "13" est une sortie

}

void loop() { 
    // ne bloque pas le programme
    
    unsigned long temps = millis(); // lecture du temps système, utiliser une variable comme "temps" permet de l'utiliser pour d'autres action dans le programme
    
   
  if ( temps >= mtemps )  // si le temps est écoulé
     { 
       digitalWrite( ledpin , s ); // allume la led selon l'état du bit "s"
       s=!s;        // inverse l'état de "s"
       mtemps=mtemps+500; // mémorise le temps +500 
     } 
    
}

7/ avec 2 timer, un pour allumer et l'autre pour éteindre la led

// clignotant 1s 

const int ledpin = 13;   // n° de la led verte de la carte

unsigned long mtemps=0;  // mémorisation du temps

unsigned int on=50; // déffinit le temps d'allumage de la led

unsigned int off=950; // déffinit le temps d'extinction de la led, pour faire 1s l'addition de "on" et de "off" doit faire 1000.

boolean s=true; // état de la sortie 

void setup() {

  pinMode(ledpin, OUTPUT); // la broche "13" est une sortie

}

void loop() { 
    // ne bloque pas le programme
    
  unsigned long temps = millis(); // lecture du temps système, utiliser une variable comme "temps" permet de l'utiliser pour d'autres action dans le programme
    
  if ( temps >= mtemps )  // si le temps est écoulé
     { 
       digitalWrite( ledpin , s ); // allume la led selon l'état du bit "s"
       if ( s ) mtemps = mtemps + on; else mtemps = mtemps + off; // mémorise le temps + la valeur de "on" ou de "off" suivant l'état de "s"
       s=!s;        // inverse l'état de "s" de "true" passe à "false" ou de "false" à "true"
     } 
    
}

j'attend vos réaction ...

Salut
bien
Pour la 7:

7/ avec 2 timer, un pour allumer et l'autre pour éteindre la led

je m'attendais a du timer HARDWARE.

plutôt avec rapport cyclique différent de 1/2

A+

caape:
Salut
bien
Pour la 7:je m'attendais a du timer HARDWARE.

plutôt avec rapport cyclique différent de 1/2

A+

Je suis très limiter en programmation donc j'utilise ce que je connais mais je suis preneur pour ne nouvelles façon de faire

Salut, personnellement j'utilise que deux de ces méthodes : la 1 rarement et plus souvent la méthode avec millis().
Les autres sont bien aussi mais les effets sont les mêmes le seul truc qui change c'est que en utilisant millis, tu peux faire des actions en même temps.

Pour le timer HARDWARE, je saurais pas t'aider :stuck_out_tongue: à part en te donnant le lien vers les explications ^^ =
http://playground.arduino.cc/Code/Timer1

Voilà pour toi un petit bout de code que j'ai créer pour faire clignoter un chenillard de led ou plusieurs led dans un sens puis dans l'autre :

const int nbrLed = 4;     // pour changer le nombre de led facilement.
const int led[nbrLed] = {9,10,11,12};    // {R,B}

void Setup ()
{
  for (int i = 0; i<nbrLed; i++)
      {
        pinMode (led[i], OUTPUT);
        digitalWrite (led[i],LOW); // s'assurer que toutes les leds sont éteinte au démarage 
      }  
  ShowLed(200,5); //(Délai entre les leds, nombre d'aller-retours)
  }
void ShowLed (int delay1, int number) // Attention, si number est plus grand que 10, ca foire, cause à déterminer 
    {
     for (int i=0; i<number; i++)
     {
        for (int c=0; c<nbrLed; c++)
        {
          digitalWrite (led[c],HIGH);
          digitalWrite (led[c-1],LOW);  
          delay (delay1);
        }
        for (int c1=nbrLed; c1>=0; c1--)
        {
          digitalWrite (led[c1],HIGH);
          digitalWrite (led[c1+1],LOW);  
          delay (delay1);
        }
        digitalWrite (led[0],LOW);
     }
    }// ShowLed

Je la metterai à jour pour qu'elle fonctionne avec la fonction millis(); et plus delay();

Bonne année :wink: