Il te suffit de faire une boucle infinie qui attend que le temps soit écoulé.
Exemple :
void delayWithMillis(unsigned long t) {
// Calcul du temps lorsque t millisecondes se seront écoulés
unsigned long stopTime = millis() + t;
// Attente active jusqu'à ce que stopTime soit atteind
while ( millis() < stopTime ) { }
}
Petit exemple :
J'appelle la fonction avec t = 50 et avec un processeur lancé depuis 2000 millisecondes.
On a donc stopTime = 50 + 2000 = 2050.
La première fois que la condition du while est testée, c'est 2000 < 2050 => vrai
Donc le code entre dans le while (il n'y a rien à faire) puis revient tester la condition.
Vu que très peu de temps s'est écoulé, c'est toujours 2000 < 2050 => vrai
Après avoir fait ce test un millier ou un million (voir milliard) de fois, millis va finir par retourner 2001 car le temps s'écoule
Pour le moment, 2001 est toujours inférieur à 2050.
Mais au fur et à mesure que le temps s'écoule, millis augmente.
Une fois arrivé à 2050, on a 2050 < 2050 => faux
Donc le code quitte le while puis quitte la fonction.
Et entre le début et la fin de la fonction, on a bien 50 ms qui se sont écoulés
void delayWithMillis(unsigned long t) //delay with millis
{
// Calcul du temps lorsque t millisecondes se seront écoulés
unsigned long stopTime = millis() + t;
// Attente active jusqu'à ce que stopTime soit atteind
while ( millis() < stopTime )
{
capteur();
}
}
void capteur(void)
{
val=analogRead(sensorPin);
Serial.println(val);
}
j'ai rajouté une fonction "capteur" dans le while pour continuer à lire les données de "analogRead".
Cependant n'y a t'il pas un moyen pour effectuer la fonction delayWithMillis() sans arreter le reste du programme ?
"Kashkawan" means "it is foggy" in Algonquin. | 你很好奇 |
Le role de la fonction delay est justement d'arrêter le programme pendant un certain temps ...
Par contre, sur les micro-processeur, il y a ce qu'on appel des interruptions.
Une interruption, c'est une fonction qui va s'exécuter en arrêtant le cour normal de l'exécution du programme.
Par exemple, tu peux avoir ton programme qui tourne en tache de fond pour faire des analogues read en permanence ET une fonction d'interruption qui s'occupe de changer l'état d'une pin.
Changer l'état d'une pin étant très court, la fonction d'interruption ne stopera le programme qu'un instant très court et celui-ci ne sera donc pas perturbé.
Sur arduino, tu as aussi des timers.
Un timer, on peut voir ça comme une boite noir capable de déclencher une interruptions toutes les X millis.
Tu peux donc configurer ton time pour qu'il t'appelle ta fonction toutes les 100ms et dans cette fonction, tu change l'état de la led.
Ainsi, tu verras ta led clignoté sans perturber le reste du programme.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.