[ RÉSOLU ]Fonction modulo

Bonsoir,

J'aimerais savoir ce que donne l'instructions suivante

if( millis() / periode_scrutation % 2 )
{
. ........

}

Je ne comprends pas trop le fonctionnement du modulo ici avec le if.

Le programme passe régulièrement dans la boucle... donc ca marche... mais comment ?

Merci

Arzou:
Bonsoir,

J'aimerais savoir ce que donne l'instructions suivante

if( millis() / periode_scrutation % 2 )
{
. ........

}

Je ne comprends pas trop le fonctionnement du modulo ici avec le if.

Le programme passe régulièrement dans la boucle... donc ca marche... mais comment ?

Merci

l'évaluation de periode_scrutation %2 ne peut qu'etre égale à zero ou un

La division et le modulo ont même priorité donc on applique de la gauche vers la droite.
Division d'abord, puis modulo.
Une période de scrutation sur 2 la condition est vrai.

Donc prenons un exemple

Millis a une valeur bidon

11 233 224 / 10 000 %2 me donnerais quoi comme resultat?
1 123,3224 %2 ?

Mon but je l’avoue et de rentrer toutes mes 10 secondes mini ,dans mon cas, dans la boucle if sans utiliser le delay()
Merci et bonne nuit

1123 % 2 = 1 car 1123 est impair

donc , cette écriture ne me fais pas entrer dans la boucle if toutes les 10 secondes comme espérée mais toutes les 2 secondes non ?

int   periode_scrutation =10000;
if( millis() / periode_scrutation % 2 )
{
. ........

}

comment coder ça dans ce cas pour que l'on rentre dans la boucle que toute les 10 secondes?

c'est inévitable de passer par une autre variable comme ci dessous?

int   periode_scrutation =10000;
tempo=millis();
if( millis() -tempo>= periode_scrutation)
{
. ........

}

merci

Bonjour,

Tu ne vas pas entrer dans le if toutes les 2 secondes, mais tu vas entrer en continu pendant 10s puis ne pas entrer pendant 10s.

Il faut utiliser une variable comme ton deuxième code, mais il faut que cette variable soit réinitialisée dans la boucle.

static unsigned long tempo=millis();
if( millis() -tempo>= periode_scrutation)
{
 tempo=millis();
 // ...
}

Comme mon if est dans le loop, c'est utile de déclarer la variable en static ?

C'est indispensable car sinon elle sera réinitialisée à chaque entrée dans la loop.
Soit tu la déclares static soit tu la définis en global (en dehors d'une fonction).

Soit tu la déclares static soit tu la définis en global

C’est super clair, mais si j’utilise une variable seulement dans une fonction, c’est mieux static ou global?
Je pense que c’est static. Non?

Si elle est utilisée dans une seule fonction c'est mieux de la définir en static à l'intérieur de la fonction.
Si elle est utilisée dans plusieurs fonctions, il faut la définir en global.

oui l'idéal est de limiter la portée de la variable à la zone du programme où elle est pertinente. Souvent je mets ce qui doit se produire de temps en temps carrément dans une fonction à part avec sa variable statique. Comme ça la loop() n'a qu'à faire appel à cette fonction et on ne se prend pas la tête en lisant le code

void faireQuelqueChoseDeTempsEnTemps(bool forceExecution = false)
{
  const unsigned long deltaT = 10000UL;
  static unsigned long chrono = 0;
  if (forceExecution || (millis() - chrono >= deltaT)) {

    if (forceExecution ) chrono = millis();
    else chrono += deltaT;
  }
}

void setup() {...}

void loop()
{
  faireQuelqueChoseDeTempsEnTemps();
  ...
}

(tapé ici donc peut-être des fautes de frappe)

Notez que je mets aussi souvent un paramètre optionnel qui permet de forcer l'exécution, ça peut permettre par exemple de garantir le rafraîchissement d'un affichage ou d'initialiser le chrono si vous lancez ce truc régulier tard dans le code.

Enfin, l'approche chrono += deltaT; au lieu de chrono = millis(); permet de re-synchroniser des retards si de temps en temps la loop() prend plus de deltaT ou que la fonction elle même prend longtemps à exécuter et que vous voulez vraiment que les ticks de déclenchements soient calés sur deltaT

l'approche chrono += deltaT

Génial! je n'avais jamais pensé à faire ça même si c'est très logique. Je le mets dans mon tiroir.

Dernière question juste pour être sur.
static unsigned long chrono = 0;
avec le mot static la variable chrono est initialisé à 0 seulement la première fois que cette fonction est appelé?

savoriano:
Dernière question juste pour être sur.
static unsigned long chrono = 0;
avec le mot static la variable chrono est initialisé à 0 seulement la première fois que cette fonction est appelé?

oui, les variables locales statiques sont initialisées lors du premier passage dans le bloc qui englobe leur déclaration, sauf si l'initialization est à zéro ou une constante, auquel cas ça peut être traité globalement par le compilateur et la spécification précise que cette initialisation peut se passer avant l'entrée dans le bloc.

Et si vous vous posez la question, dans la signature de la fonction void faireQuelqueChoseDeTempsEnTemps(bool forceExecution = false)l'initialisation à false ne se fait que si vous appelez la fonction sans paramètre. si vous passez true ou false directement , c'est cette valeur que la variable forceExecution prendra.