Go Down

Topic: [ RÉSOLU ]Fonction modulo (Read 308 times) previous topic - next topic

Arzou

Nov 20, 2019, 09:58 pm Last Edit: Nov 22, 2019, 11:14 pm by 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

Artouste

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

fdufnews

#2
Nov 20, 2019, 10:18 pm Last Edit: Nov 20, 2019, 10:19 pm by fdufnews
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.

Arzou

#3
Nov 20, 2019, 11:44 pm Last Edit: Nov 20, 2019, 11:48 pm by Arzou
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

lesept

1123 % 2 = 1 car 1123 est impair
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Arzou

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 ?


Code: [Select]


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?

Code: [Select]

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

}

 
merci

kamill

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.
Code: [Select]

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

Arzou

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

kamill

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).

savoriano

Quote
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?
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

kamill

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.

J-M-L

#11
Nov 22, 2019, 10:11 am Last Edit: Nov 22, 2019, 10:12 am by J-M-L
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

Code: [Select]
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



Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

savoriano

Quote
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.
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

savoriano

Dernière question juste pour être sur.
Code: [Select]
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é?
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

J-M-L

#14
Nov 23, 2019, 07:49 am Last Edit: Nov 23, 2019, 07:53 am by J-M-L
Dernière question juste pour être sur.
Code: [Select]
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
Code: [Select]
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.
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up