[Débutant Arduino] Questions sur millis (), delay () et la grosseur de calcul

a marqué ce sujet comme résolu.
Auteur du sujet

Bonjour,

je débute, j’ai commencer le tuto d’Eskimon et me pose des questions concernant l’emplois de la fonction millis(), delay() et les lourdeurs de calcul que cela pourraient engendrer.

En faites je prévois de faire un appareil qui resterait allumé toute la journée et ne déclencherait un évenement qu’à intervalle assez long (du genre 30min ou 3h), tout en ayant des boutons et interrupteur pour piloter d’autres trucs.

Du coup j’imaginais que dans la fonction loop des "if" viendrais vérifier l’état des boutons et interrupteurs tandis qu’un autre "if" vérifirait si le temps du déclenchement est atteins ou pas. Pour mesurer ce temps sans tout interrompre comme le fait delay() il pourrait y avoir une variable récupérant le temps en utilisant millis() pour effectuer un calcul avec (ça je vois comment faire ma question n’est pas là).
SAUF que j’ai lus au début du tuto de Eskimon que les calculs fait en 32bits sont "gros", un peu lourd. Hors pour un appareil qui fonctionne toute la journée j’aurrais besoin d’une variable de temps du type long, donc 32 bits. Et là je me dit que faire et refaire en boucle un calcul en 32bits alors que l’appareil ne fait rien d’autres qu’attendre c’est peut’être idiot ?! D’autand que je ne suis pas à la minute prés pour le déclenchement de l’événement.
Du coup je me demander s’il ne serait pas plus pertinent de rajouter un compteur (je pensais à une variable de type byte, donc juste 8bits) dans la fonction loop pour ne vérifier si le temps de déclenchement est atteints qu’une fois par minute (à peu prés) ?
ça pourrait ressembler à un truc comme ça dans la fonction loop :

  • vérification des boutons et interrupteurs
  • incrémentation du compteur(byte)
  • vérification du compteur(byte), s’il vaut 250 (ou plus) on vérifie le temps (le gros calcul en 32bits avec millis et tout) et on remet le compteur(byte) à zero.
  • et un delay(240) pour finir, car 250x240 = 60000ms donc 1 minute le "gros calcul" du temps ne serait fait qu’une fois par minute. Ce délais provoquerait un leger retard possible dans la réaction des boutons mais bon d’un quart de seconde au maximum, ça m’irait c’est pas une console de jeu !

Mon raisonnement est il bon ou pas ? Ou est ce que je m’embête pour rien ce "gros calcul" n’étant pas si lourd que ça ? Autre question que je me suis posé ..est ce que dans le détail la fonction delay n’utilise elle aussi des calculs avec des variables long en 32 bits ? De sorte que je n’esquiverait finalement rien du tout :colere: !?

Désolée si je n’ai pas était clair j’ai essayé de faire au mieux, ou si je n’ai pas poster au bon endroit :euh: .

+0 -0

La question est quel est ton projet et en quoi consiste ce calcul ?

Oui les calculs 32 bits pour un petit processeur comme un Arduino ce n’est pas gratuit mais pour la plupart des cas d’usage cela n’est pas un facteur limitant.

Disons que tu ne dois pas faire de calculs intensifs basés dessus ni espérer respecter des contraintes de temps stricts trop courts.

En contexte embarqué il est très courant d’avoir une variable comme horloge monotonique à savoir qui compte le temps qui passe depuis l’allumage de l’appareil qui s’incrémente. Avec une soustraction simple tu peux calculer un delta de temps et à partir de là faire les opérations que tu veux si un certain temps a été écoulé.

Une autre méthode aussi pour appeler des évènements à intervalle régulier, tu peux utiliser des timers matériels (qui se programment) pour déclencher une interruption à chaque fois que l’intervalle de temps est écoulée. Et à partir de là faire ce que tu veux. Mais je ne connais pas bien Arduino pour savoir s’il y en a fourni avec la puce de base.

Édité par Renault

Amateur de Logiciel Libre et de la distribution GNU/Linux Fedora. #JeSuisArius

+0 -0
Auteur du sujet

Le "gros calcul" serait celui qui vérifie si le temps est atteins ou pas. Il y aurrait une variable temps de type long, une soustraction avec millis() et ensuite comparer si c’est inferieure ou égal à zéro. Tout ça en 32bits puisque l’appareil fonctionnerait toute la journée.

(…) Oui les calculs 32 bits pour un petit processeur comme un Arduino ce n’est pas gratuit
(…) Disons que tu ne dois pas faire de calculs intensifs basés dessus (…)

Renault

Voilà, c’est justement ça qui m’inquiétes. Si le programme recalcul si le temps est atteins en boucle est ce que l’on est pas dans les bornes de "l’intemsif" ?

Les histoires de timers j’ai croisé ça en cherchant sur le net mais j’ai crus comprendre qu’on commencait à jouer avec le registre nan ? Et pis comme je débute tout juste je préférais rester dans les clous du tuto d’Eskimon.

+0 -0

Cette réponse a aidé l’auteur du sujet

Voilà, c’est justement ça qui m’inquiétes. Si le programme recalcul si le temps est atteins en boucle est ce que l’on est pas dans les bornes de "l’intemsif" ?

Non, c’est très raisonnable.

Les histoires de timers j’ai croisé ça en cherchant sur le net mais j’ai crus comprendre qu’on commencait à jouer avec le registre nan ?

Tout à fait.

Et pis comme je débute tout juste je préférais rester dans les clous du tuto d’Eskimon.

Pas de soucis, de toute façon ici cela ne me semble pas nécessaire.

Amateur de Logiciel Libre et de la distribution GNU/Linux Fedora. #JeSuisArius

+0 -0
Auteur du sujet

..mais quand même je me demande ? o_O ..
Quelqu’un saurrait me dire si la fonction delay() utilise des calculs à base de long 32bits ?

Édité par Oktave

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte