février 27

Clignotement SANS delay()

Sous Arduino ou Teensy, le clignotement d’une LED avec la commande delay() ralentit tout le code.

1 – Avec la fonction elapsedMillis

Heureusement, la fonction elapsedMillis, qui génère un compteur permet de se passer de delay.
J’ai concocté une fonction qui permet d’allumer et d’éteindre une LED x sec toute les x sec.

int LEDcligno = 20; // LED entre pin 20 et la masse, via résistance
int EtatLEDcligno = HIGH;
int ChangeLEDcligno = 0;
elapsedMillis ComptCligno; //compteur

void setup()
{
pinMode(20, OUTPUT); 
}
void loop()
{
ClignoLED(250, 15000); // 1/4 sec, 15 sec
}//loop

void ClignoLED (int on, int off)
{
int intervalle = ComptCligno - ChangeLEDcligno;
if (EtatLEDcligno == HIGH && intervalle > on)
{
    // éteint 
    EtatLEDcligno = LOW;
    digitalWrite(LEDcligno, EtatLEDcligno);
    ChangeLEDcligno = ComptCligno;
}
  else if (EtatLEDcligno == LOW && intervalle > off) 
  {
    // allumé
    EtatLEDcligno = HIGH;
    digitalWrite(LEDcligno, EtatLEDcligno);
    ChangeLEDcligno = ComptCligno;
  }
intervalle = 0;//RAZ
}//void

2 – Avec le cycle d’horloge

Les instructions du Teensy sont exécutés en boucle, à une fréquence de 96Mhz. Entre le début et la fin de la boucle, il se passe donc un certains temps, dépendant principalement du nombre d’instructions que le teensy doit effectuer.

int ComptLED = 1;
int TempsON = 14000;

void setup() {
  pinMode(2, OUTPUT);//LED
  digitalWrite(2, LOW);// démarrer éteint 
  pinMode(4, INPUT_PULLUP);//contact

}

void loop() {
ComptLED = ComptLED+1;
 Serial.println(ComptLED); 
if (digitalRead(4) == LOW)// si contact
{
 digitalWrite(2, HIGH);// allumer la LED
}

if (ComptLED == TempsON)// au bout d'un certains temps
{
  digitalWrite(2, LOW);// éteindre la LED  
   ComptLED = 1;  
}
}//loop

C’est moins précis car il faut ajuster « ComptLED » à la mano mais ça fonctionne.



Copyright 2017. All rights reserved.

Ecrit 27 février 2016 par Pit dans la catégorie "Teensy/Arduino

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

3 × deux =