- Gestion du temps
Je suis pas sur de quelle partie tu n'as pas compris alors je reprend au début
delay( MON_DELAI ); est une fonction bloquante.
C'est à dire que tu ne va rien faire d'autre que d'attendre. C'est balot.
Quand ton programme va devenir plus complexe, tu voudra faire d'autre choses.
Or avec delay() ton programme est bloqué à rien faire pendant une seconde pour rien, temps que les autres tâches (que tu rajouteras certainement plus tard) auraient bien besoin pour s'exécuter à leur tour.
L'idée est donc plutot que de se bloquer pendant 1 seconde dans delay() de regarder si 1 seconde s'est écoulée depuis la dernière action. Si ce n'est pas le cas, on ne fait rien et on continue à tourner dans loop(). Si 1 seconde s'est écoulée depuis la dernière action on fait la nouvelle action et on re-mémorise la date du moment pour la prochaine comparaison.
millis() est une fonction qui retourne le temps écoulé en millisecondes depuis le lancement du programme.
Il s'agit d'un compteur sur un "unsigned long" auquel la bibliothèque de base "core" de l'Arduino ajoute 1 toute les milliseconde.
Un entier "unsigned long" sur Arduino est un entier 32 bits non signé pouvant prendre les valeurs entre 0 et (2^32)-1 (2 puissance 32 moins 1 soit 4294967295).
Que ce passe t'il au bout de 49 jours et des pouillèmes quand le compteur atteint 4294967295 ?
=> Le compteur repasse à 0.
Supposons que tu mémorises comme dans mon code la date de la dernière action dans "heure_dernier_changement"
Et que tu teste si les 1 secondes se sont écoulées par
if ( millis() > (heure_dernier_changement + MON_DELAI) )
Ce code semble bon puisque tu regarde si l'heure de maintenant est plus grande que l'heure précédente + le délai.
Or que se passe t'il si au moment où tu fais
heure_dernier_changement = millis();[code]
la valeur de millis() renvoi 4294966296
Ton test deviens temporairement
[code] if ( millis() > (4294966296 + 1000) )
Mais comme on utilise des "unsigned long" limité à 4294967295 on obtient 4294966296 + 1000 = ...... 0 !
Donc le test devient :
if ( millis() > (0) )
Donc on va considérer pratiquement immédiatement que la durée s'est écoulée et on va passer à l'étape suivante immédiatement, ce qui est faux.
Maintenant si on écrite le code ainsi
if ( (millis() - heure_dernier_changement) > MON_DELAI )
Le processeur va faire une difference entre 2 entiers non signés.
Le calcul se fait modulo 4294967296 (2^32) et donc la différence sera bonne.
C'est comme toi si tu regarde une horloge à aiguilles.
Tu as pris ton paracétamol (parce que l'Arduino çà donne mal à la tête) à 20H et tu dois attendre 6H pour la prochaine prise.
Si tu calcule l'heure de la prochaine prise c'est 20+6 = 26 modulo 24 = 2H du matin
Au bout d'un moment tu regardes l'horloge et tu vois marqué 20H10
Ah 20H10 > 2H donc je reprend un médoc et je calcule l'heure de la prochaine prise : 20h10 + 6H = 2h10
AU bout d'un moment tu regardes et tu vois 20h15.
20h15 c'est plus grand que 2h20, et au bout d'un moment tu finis a l'hopital
Evidemment toi tu sais que 2h du matin c'est le jour suivant.
Mais si tu considère le calcul uniquement sur les valeurs ca ne marche pas !
Refais le même raisonnement avec un calcul de différence.
Tu te rappelle que t'a dernière prise était a 20H
Donc a 20h10 tu calcule le temps écoulé : 20h10 - 20H00 = 0h10 et tu ne fait pas de bétise
A 1h45 du matin, tu recommence : 01h45 - 20H00 = 5h45 parce que tu fais une différence MODULO 24H
Et a 2H01 tu trouve : 02H01 - 20H00 = 6H01 : ok, tu peux prendre un autre paracétamol parce que les explications de Barbudor c'est pas du gâteau.....
Compris ?
- Je vais pas me fatigué parce que c'est le week-end.
Alors il va falloir que tu réfléchisses
Si tu veux que ça s’arrête après la décroissance, il faut que ton automate revienne dans l'état REPOS après la décroissance.
Revois les tests effectués dans l'état EN_COURS pour déterminer la condition qui te fait revenir dans l'état REPOS.
Tic-tac, relevé des copies dans 1H.......
[/code][/code]