Aller au contenu


Photo
- - - - -

Arduino - Les interruptions


  • Veuillez vous connecter pour répondre
22 réponses à ce sujet

#1 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 11 janvier 2018 - 03:43

J'ai pensé qu'il serait intéressant de parler des interruptions dans un fil spécifique.

J'ai trouvé quelques informations dans le livre de Christian Tavernier - Arduino - Maitrisez sa programmation et ses cartes d'interface(shields) - p : 65 et je me suis dit qu'il serait bon de les partager. Si je dis des bêtises, ce qui ne manquera pas d'arriver, n'hésitez pas à me corriger.

La plupart du temps, si l'on veut tester l'état dun capteur, nous interrogeons l'entrée concernée au travers d'une boucle 'for', par exemple.
Cette manière de faire peut, être couteuse en énergie car le processeur boucle à toute vitesse dans une course folle, à ne rien faire. Et si l'on teste plusieurs capteurs, le problème est multiplié d'autant. De plus, la structure du programme n'est pas vraiment optimisée.

L'idée, qui ne date pas d'hier, c'est de faire en sorte que le capteur envoie un signal sur une entrée dédiée du processeur. Le processeur arrête net ce qu'il était en train de faire, exécute la fonction de linterruption, puis reprend sa tâche.

Facile à dire ! Et bien oui, et en plus, c'est facile à faire.

Voici un exemple très minimaliste ou le capteur, un simple interrupteur, allume ou éteint la Led notée L (située au milieu de votre Arduino Uno), à chaque fois que l'on appuie dessus. Pour information, cette Led est reliée à l'E/S 13 de lArduino.
Cette interrupteur, placé sur une BreadBoard, est relié à la masse au travers d'une résistance de 10k. Ainsi lorsque l'interrupteur est ouvert, l'entrée sera à 0.

Les entrées spécifiques aux interruptions sont numérotées de 0 à 5. Mais attention, ces chiffres ont une correspondance physique sur les entrées de l'Arduino différente des chiffres eux-mêmes.

Correspondance des numéros d'interruptions et des lignes d'E/S :
Arduino Uno et Nano :
- interruption 0 liée à l'entrée 2
- interruption 1 liée à l'entrée 3
Arduino Mega :
- interruption 0 liée à l'entrée 2
- interruption 1 liée à l'entrée 3
- interruption 2 liée à l'entrée 21
- interruption 3 liée à l'entrée 20
- interruption 4 liée à l'entrée 19
- interruption 5 liée à l'entrée 18

Comme vous pouvez le constater, le programme est simplissime. Néanmoins, voici quelques commentaires.
- Je commence par initialiser la sortie 13 correspondant à la Led L.
- Puis j'exécute la fonction 'attachInterrupt' qui possède 3 paramètres. Le premier est le numéro de l'interruption, ici 0. Donc l'interrupteur est relié à lentrée 2 de l'Arduino. Le deuxième paramètre est le nom de la fonction qui doit être exécutée lorsque survient l'interruption. Le troisième paramètre, 'RISING', indique que l'interruption fait passer l'entrée, du niveau bas au niveau haut. Il y a dautres possibilités.
- Comme vous pouvez le constater, la fonction loop() est vide.
- La fonction interrupteur() est celle que j'ai écrite et qui est donc exécutée lorsque j'appuie sur linterrupteur. Puis vient la variable 'etat' qui est initialisée à la valeur de la sortie 13. Puis, grosse astuce de programmeur, je lui applique un XOR 1. Cela permet de la passer alternativement de 0 à 1 et inversement à chaque exécution de la fonction. Ainsi, à la ligne suivante, la Led sallumera, puis séteindra, puis sallumera etc.
- Ici, la boucle 'for' sert de temporisation pour palier à l'effet rebond de linterrupteur. En effet, la fonction delay() ne peut être utilisée dans une fonction d'interruption, car elle-même consulte des interruptions (horloge).

Merci d'avance pour vos remarques.
 
// Arduino - Les interruptions

void setup() {
  // utilisation de la led L au centre de carte - sortie numérique 13    
  pinMode(13, OUTPUT);
  
  // interruption 0 - entrée numérique 2 
  // fonction appelée 'interrupteur' 
  // déclenchée par passage du niveau bas au niveau haut
  attachInterrupt(0, interrupteur, RISING);
}

void loop() {}                      // fonction vide

void  interrupteur()  {             // fonction appelée par l'interruption 0
  byte etat= (digitalRead(13)^1);   // va et vient, 0 XOR 1 = 1  ou  1 XOR 1 = 0
  digitalWrite(13,etat);
  for (double i=1; i<=5000;i++);    // temporisation            
}

Fichier joint  Interruptions_bb.jpg   80,73 Ko   14 téléchargement(s) Fichier joint  Interruptions_schéma.jpg   28,88 Ko   14 téléchargement(s)

#2 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 11 janvier 2018 - 04:05

Je sais que c'est pour l'exemple, mais je pense que traiter le rebond électriquement est mieux qu'une tempo dans une interruption, car pendant l'interruption rien d'autre ne passe dans le programme.

 

Question ouverte : dans les interruptions, faut-il faire des traitements ou alors des changements de valeur de variable ou ça dépend ? et du coup je veux bien des exemples.



#3 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 11 janvier 2018 - 07:06

Je sais que c'est pour l'exemple, mais je pense que traiter le rebond électriquement est mieux qu'une tempo dans une interruption, car pendant l'interruption rien d'autre ne passe dans le programme.
Question ouverte : dans les interruptions, faut-il faire des traitements ou alors des changements de valeur de variable ou ça dépend ? et du coup je veux bien des exemples.

Pour le rebond, j'ai repris l'idée de Tavernier qui le traite dans son livre avec la fonction delay(), hors cadre d'interruption. Tavernier est quand même l'un des plus grand vulgarisateur d'électronique dans les revues françaises, je le connais depuis 45 ans. Pourquoi être plus royaliste que le roi ? Personnellement, cela ne me choque pas. Cela permet de simplifier la partie électronique. Non, vraiment ! A la limite, je trouve que c'est une solution élégante.

Dans une fonction d'interruption, tu peux faire absolument ce que tu veux. Sous réserve de ne pas utiliser la fonction delay(), millis() ne s'incrémente plus et les données Serial sont perdues. Les variables globales du programme, modifiées par la fonction doivent être déclarées 'volatile'.
Par contre cette fonction pourrait en appeler une autre où on pourrait peut-être stopper toute interruption avec noInterrupts(), sans oublier à la fin de re-autoriser les interruptions avec interrupts().
Il faudrait tester.

Je ne l'ai jamais fait, mais faire un programme avec une logique d'interruption me semble sensiblement différent d'une programmation classique.
Mais attention au plat de nouilles.

#4 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée
  • Interests:Robotique, informatique, architecture et patrimoine...

Posté 11 janvier 2018 - 08:30

Si je ne fais pas d'erreur, les capteurs avec une sortie analogique (par exemple, capteur de distance) ne conviennent pas pour une interruption, il faut donc continuer à les scruter dans une boucle dans le programme. Les entrées pour interruption sont des entrées logique : 0 ou 1 (0V ou 5V).


Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega

#5 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 11 janvier 2018 - 09:14

Si je ne fais pas d'erreur, les capteurs avec une sortie analogique (par exemple, capteur de distance) ne conviennent pas pour une interruption, il faut donc continuer à les scruter dans une boucle dans le programme. Les entrées pour interruption sont des entrées logique : 0 ou 1 (0V ou 5V).

je ne dirais pas ça. Il suffirait de déterminer un seuil de déclenchement. Avec si nécessaire, un peu d'électronique.
Puis, j'imagine tout à fait la possibilité pour une fonction d'interruption de lire l'entrée analogique. Pourquoi pas ?
Tout est permis. Il faut tester.

#6 maximusk

maximusk

    Membre passionné

  • Membres
  • PipPipPip
  • 304 messages
  • Gender:Male
  • Location:Le Mans

Posté 11 janvier 2018 - 09:52

Sur Arduino, tu ne gagneras rien au niveau consommation. Les programmes Arduino contiennent un "setup()", lancé au démarrage, et un "loop()", qui est une boucle infinie. Faire les choses dans un loop ou dans un for, c'est pareil niveau consommation. La où ça peut changer, c'est si tu mets le microcontrôleur en mode veille, et qu'il se réveille sur une interruption, mais je ne sais pas si c'est possible sur Arduino.
Par contre, tu gagnes la possibilité de faire du code asynchrone, par exemple, avoir une boucle d'asservissement et ne lancer la fonction liée à un capteur que lors de l'activation de celui-ci.

Pour un capteur analogique, c'est impossible de fixer un seuil sans électronique a côté, le microcontrôleur sur les cartes Arduino ne peut prendre que des interruptions numériques (il te faut donc au moins un comparateur). Tu peux ensuite lire la valeur analogique sur une autre entrée (attention tout de même, la lecture d'une entrée analogique prend un certain temps).

Par contre, loin de moi l'idée de vouloir être plus royaliste que le roi, mais je confirme les dires d'arrobaseb par rapport à la temporisation. L'interruption à pour but de faire du code non bloquant, il faut donc choisir un anti rebond électronique ou le gérer de manière asynchrone avec des timers (en dehors de l'interruption, sinon ça ne marche pas). Ça marche dans l'exemple car l'interruption n'est qu'un bouton actionné à la main. Si tu fais la même chose avec un codeur optique précis, tournant à une vitesse assez élevé, ou que tu veux interpréter un protocole série, tu rateras une bonne partie des signaux.
Je conseillerais quelques règles à respecter au niveau des interruptions, c'est :
1) JAMAIS de code bloquant dans une interruption, ça pourrait planter le programme.
2) Garder le contenu de la callback d'interruption le plus court et rapide possible, quitte à traiter les données récupérées en dehors (sinon, on peut rater d'autres interruptions).
3) Déclarer les variables qui sont modifiées dans les interruptions en volatile, cela prêt de les recharger depuis la RAM lors de son utilisation, ce qui permet d'éviter les problèmes de valeurs différentes entre la RAM et le cache ou les registres du processeur.

#7 Forthman

Forthman

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 379 messages
  • Gender:Not Telling
  • Location:Montauban (82)

Posté 11 janvier 2018 - 10:15

Je suis du même avis qu'Arobasseb, le rebond doit être géré par de l'électronique (un simple réseau RC en fait)

une interruption doit être la plus courte possible sinon c'est le programme principal qui va faire la gueule :help:

 

Pour gérer une entrée analogique avec une interruption, il faut utiliser un timer.

On paramètre le timer sur la fréquence souhaité, et l'interruption lit l'entrée à cette fréquence.

Par contre il faut savoir que les timers sont utilisés pour générer les signaux PWM, donc

si on utilise un timer pour lire une entrée, il faut se priver de certaines sorties PWM

 

enfin, petite précision :

 

Le troisième paramètre, 'RISING', indique que l'interruption fait passer l'entrée, du niveau bas au niveau haut.

 

en fait c'est l'inverse, :crazy:

RISING précise que l'interruption sera déclenchée par le passage à l'état haut (front montant) de l'entrée.

 

Vous allez dire que je pinaille mais j'assume :P



#8 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 12 janvier 2018 - 08:44

RISING précise que l'interruption sera déclenchée par le passage à l'état haut (front montant) de l'entrée.
Vous allez dire que je pinaille mais j'assume :P

Non, non, ce n'est pas du pinaillage, on est dans le sujet. Mais un front montant, comme tu l'indiques, c'est bien un passage de l'état bas à l'état haut, non ?
Et je parle bien d'un passage de l'état bas à l'état haut, en référence au livre de Tavernier p:66.
Sur le site Arduino, on peut lire ceci "RISING to trigger when the pin goes from low to high", https://www.arduino....ttachinterrupt/
Par contre Tavernier p:66, n'est pas complet. J'aurais pu utiliser "HIGH to trigger the interrupt whenever the pin is high". Plus simple.

Concernant la temporisation anti-rebond, elle n'est là que parce que j'utilise un interrupteur qui m'a semblé être un capteur pédagogique dans ce contexte.

Pour les capteurs analogiques, il ne me semble pas que l'électronique soit nécessaire si on fixe le seuil à un bon 3V.

Pour gérer une entrée analogique avec une interruption, il faut utiliser un timer.

Pourrais-tu nous en dire plus ?

Faire les choses dans un loop ou dans un for,

On est d'accord ! Je parlais de boucle 'for' parce que la boucle 'loop' est moins parlante en terme de C.
C'est vrai que dans mon exemple la boucle 'loop' est toujours là, même si elle est vide. Donc elle boucle toujours.
Le fait de montrer une boucle 'loop' vide, c'était juste pour mettre en évidence le principe de l'interruption.

#9 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 12 janvier 2018 - 09:25

 

 

Pour gérer une entrée analogique avec une interruption, il faut utiliser un timer.

On paramètre le timer sur la fréquence souhaité, et l'interruption lit l'entrée à cette fréquence.

Par contre il faut savoir que les timers sont utilisés pour générer les signaux PWM, donc

si on utilise un timer pour lire une entrée, il faut se priver de certaines sorties PWM

 

 

 

Pourrais-tu nous en dire plus ?
 

 

 

En fait ce que souhaite dire Forthman à mon avis c'est que, comme il n'y a pas de fonction de type "interrupt on analog change" la seule chose qu'on peut faire sans ajouter d'électronique externe c'est venir lire la valeur analogique en continu. Toute les secondes, par exemple, et à chaque fois que tu lis cette valeur tu fais l'opération de vérification souhaitée.

Pour faciliter cette prise de mesure en continue à fréquence constante, cela peut être fait avec une interruption sur Timer qui va se déclancher tous les X temps, en fonction des réglages du timer que tu vas faire. Toute les secondes pour respecter l'exemple. 

void interrupt_each_1s(){

  analogValue = analogRead(ANLOGPIN);  // lecture
  actionToPerform(analogValue) ;   // action en fonction de la valeur lue

}

 

Les timers ce sont les outils "hardware" du microcontrôleur qui permettent de générer des pwm hardware et non pas un pwm " software " tel qu'on peut le faire en jouant avec digitalWrite(PIN,HIGH) et   digitalWrite(PIN,LOW) ...


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#10 Forthman

Forthman

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 379 messages
  • Gender:Not Telling
  • Location:Montauban (82)

Posté 12 janvier 2018 - 09:32

Je me doutais bien qu'on parlait de la même chose, mais dans ta phrase tu dis que c'est l'interruption qui fait passer l'entrée à l'état haut,

comme si l'interruption agissait sur l'entrée, alors que c'est l'inverse, c'est l'état de l'entrée qui provoque l'interruption.

 

si ton capteur analogique est directement câblée sur une entrée TTL, il y aura un état instable qui va provoquer... un paquet de rebonds.

 

Je ne vais pas pouvoir donner d'exemple d'utilisation des timers car je n'ai que très peu touché à la programmation sur arduino

(je me suis surtout intéressé à la conception de la carte arduino uno), et du coup je ne connais pas du tout les librairies qui existent.

Par contre, ayant beaucoup programmé sur x86 (mini cartes PC), j'ai été confronté à ce genre de problème.

Dans les grandes lignes :

un Timer est un compteur qui peut déclencher une interruption à intervalles réguliers.

La fréquence du Timer est fixe, et on peut donner une valeur 8 ou 16 bits (suivant les timers utilisés) qui va diviser cette fréquence.

Par exemple (valeurs au pif juste pour l'exemple ), si on a un Timer a une fréquence de 10KHz et que la valeur de division = 100,

alors ce dernier va compter à la vitesse de 10KHz jusqu'à 100, remet le compteur à 0, et il déclenche une interruption.

 

Donc pour en revenir au capteur analogique, l'interruption en question doit lire la valeur du capteur analogique, et faire quelques

manipulations simples en fonction.

 

Je viens de faire une recherche rapide avec "Arduino Timer Interrupt" et je suis tombé sur ça : https://oscarliang.c...rrupt-tutorial/

Les explications me paraissent claires.

 

Par contre, comme je l'ai écrit plus haut, les timers sont utilisés pour générer les sorties PWM donc si on utilise ce type de sorties, il faut s'assurer

de ne pas utiliser le même timer sinon ça va foirer :crazy:

 

 

 

 



#11 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 12 janvier 2018 - 10:09

Je me doutais bien qu'on parlait de la même chose, mais dans ta phrase tu dis que c'est l'interruption qui fait passer l'entrée à l'état haut,
comme si l'interruption agissait sur l'entrée, alors que c'est l'inverse, c'est l'état de l'entrée qui provoque l'interruption.

Tu as parfaitement raison ! Mon intitulé est incorrecte.

Merci pour tes précisions sur le timer. Je vais lire le contenu de ton lien à tête reposée.

#12 maximusk

maximusk

    Membre passionné

  • Membres
  • PipPipPip
  • 304 messages
  • Gender:Male
  • Location:Le Mans

Posté 12 janvier 2018 - 08:22

La manière la plus simple d'utiliser les interruptions des timers sur Arduino, c'est avec la librairie SimpleTimer à mon avis. On peut l'utiliser pour appeler une fonction toutes les x millisecondes, ou appeler une fonction au bout de x millisecondes une seule fois. Par contre, comme toute utilisation des timers, elle fait perdre certaines sorties PWM.

#13 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 13 janvier 2018 - 08:06

J'ai lu le lien proposé par Forthman. https://oscarliang.c...rrupt-tutorial/. Super intéressant ! Quoique, je ne suis pas sûr d'avoir tout compris...
C'est rigolo, il utilise le même code que moi, avec le XOR : 'digitalWrite(ledPin, digitalRead(ledPin) ^ 1); // toggle LED pin'

La manière la plus simple d'utiliser les interruptions des timers sur Arduino, c'est avec la librairie SimpleTimer à mon avis. On peut l'utiliser pour appeler une fonction toutes les x millisecondes, ou appeler une fonction au bout de x millisecondes une seule fois. Par contre, comme toute utilisation des timers, elle fait perdre certaines sorties PWM.

Effectivement, si j'ai bien compris, un timer fait perdre au minimum 2 sorties PWM.
Mais si on utilise pas ces sorties en PWM, si on les utilise en tout ou rien, est-ce que on les perd quand même ?

J'imagine que la librairie SimpleTimer rend le code plus lisible.

#14 Forthman

Forthman

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 379 messages
  • Gender:Not Telling
  • Location:Montauban (82)

Posté 13 janvier 2018 - 08:37

Oui, les sorties fonctionneront toujours en Tout ou rien ;)



#15 Melmet

Melmet

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 519 messages
  • Gender:Male
  • Location:Saint-Sozy (46200)

Posté 14 janvier 2018 - 07:55

Peut etre hors sujet mais je balance un truc:

 

pourquoi ne pas utilisé la fonction millis ? (faut que je retrouve un tuto que j'ai vu y a pas mal de temps...) 


Ne demande jamais à un robot de faire ce que tu peux faire toi même. :nono: :laugh1:


#16 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 14 janvier 2018 - 09:32

Peut etre hors sujet mais je balance un truc:
pourquoi ne pas utilisé la fonction millis ? (faut que je retrouve un tuto que j'ai vu y a pas mal de temps...) 

Rien à voir.

Regarde l'exemple sur cette page, le dernier code, https://forum.arduin...p?topic=38134.0
- executer une fonction toutes les 15 secondes
- exécuter une fonction après 10 secondes
- exécuter une fonction 10 fois

Si j'ai bien compris...

#17 Melmet

Melmet

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 519 messages
  • Gender:Male
  • Location:Saint-Sozy (46200)

Posté 15 janvier 2018 - 06:33

autant pour moi :)


Ne demande jamais à un robot de faire ce que tu peux faire toi même. :nono: :laugh1:


#18 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 15 janvier 2018 - 07:14

Aux temps pis pour toi Melmet. :)
T'es pas hors sujet avec millis. Si tu veux faire toi même le bout de code qui appel une fonction quand tu le souhaite. Comme le fait SimpleTimer.
Je dirais que millis te permet de faire du multitâche cooperatif. SimpleTimer et l'interruption matériel cest du préemptif.

#19 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 15 janvier 2018 - 11:03

#define TIME_MS_TO_WAIT 3000



uint16_t previousTimeMs = 0;  // Attendtion uint16_t permet d'aller jusqu'à 65535 ... Pour un temps plus long choisire uint32_t !



void loop()

{

   if( millis()-previousTimeMs > Time_MS_TO_WAIT ) 

   {

        previousTimeMs = millis(); 

        /*
        ajouter ici tout les choses que vous souhaitez réaliser tous les X temps
        */

   }

}

Un exemple de code qui permet d'exécuter une action tous les x temps en utilisant millis() et sans code bloquant =)


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#20 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 15 janvier 2018 - 11:21

#define TIME_MS_TO_WAIT 3000



uint16_t previousTimeMs = 0;  // Attendtion uint16_t permet d'aller jusqu'à 65535 ... Pour un temps plus long choisire uint32_t !



void loop()

{

   if( millis()-previousTimeMs > Time_MS_TO_WAIT ) 

   {

        previousTimeMs = millis(); 

        /*
        ajouter ici tout les choses que vous souhaitez réaliser tous les X temps
        */

   }

}

Un exemple de code qui permet d'exécuter une action tous les x temps en utilisant millis() et sans code bloquant =)

 

 

Par contre avec cette méthode, le délais n'est pas garanti, contrairement à une interruption de timer.






0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users