[Résolu]fonction millis

Bonjour,

voila j'ai fait un petit programme pour revoir les bases du codage C.

int compteur = 0 ;
int compteurb = 1 ;
int L1 = 2 ;
int L2 = 3 ;
int L3 = 4 ;

void setup()
{
  Serial.begin( 9600 ) ;
  pinMode( 7, INPUT_PULLUP ) ;
  pinMode( L1, OUTPUT ) ;
  pinMode( L2, OUTPUT ) ;
  pinMode( L3, OUTPUT ) ;
}

void loop()
{
  while ( compteur != 5 )
  {
    boolean etatbouton = digitalRead( 7 ) ;
    Serial.println( etatbouton ) ;
    if ( boolean etatbouton = digitalRead( 7 ) == 0 )
    {
      Serial.println( "ok" ) ;
      compteur++ ;
      digitalWrite( L1, HIGH ) ;
      millis( 250 ) ;
      digitalWrite( L2, HIGH ) ;
      millis( 250 ) ;
      digitalWrite( L3, HIGH ) ;
      millis( 750 ) ;
      digitalWrite( L1, LOW ) ;
      millis( 250 ) ;
      digitalWrite( L2, LOW ) ;
      millis( 250 ) ;
      digitalWrite( L3, LOW ) ;
      millis( 750 ) ;
    }
    else
    {
      Serial.println( "nope" ) ;
      millis( 500 ) ;
    }
  }
  while ( compteurb != 15 )
  {
    Serial.println( "Stop it dude plz" ) ;
    compteurb++ ;
    millis( 750 ) ;
  }
  Serial.println( "Really? you still there?!" ) ;
  millis( 750 ) ;
}

J'ai voulu remplacer les delay par la fonction millis pour optimiser mon programme. Je me doute bien qu'il ne suffit pas de remplacer juste les delay par millis, mais même après quelque recherche je ne vois pas qu'est ce qu'il faut que je change.

Je vais continuer a chercher en attendant.

Merci d'avance pour vos réponse.

Bonjour,

millis() ne prend pas d'arguments mais retourne le nombre de millisecondes écoulées depuis le lancement du programme.

voir l'utilisation dans l'exemple Blink Without Delay

kamill:
Bonjour,

millis() ne prend pas d'arguments mais retourne le nombre de millisecondes écoulées depuis le lancement du programme.

voir l'utilisation dans l'exemple Blink Without Delay

désoler mais, pour être honnête je ne comprend pas... :-[
Il faut que j'écrive au début de mon programme combien de temps va durée millis? :confused:

Merci pour votre réponse.

J'ai fait ça:

int compteur = 0 ;
int compteurb = 1 ;
int L1 = 2 ;
int L2 = 3 ;
int L3 = 4 ;
int tb = A0 ;
int ta = A1 ;

void setup()
{
  unsigned long ta = millis() ;
  Serial.begin( 9600 ) ;
  pinMode( 7, INPUT_PULLUP ) ;
  pinMode( L1, OUTPUT ) ;
  pinMode( L2, OUTPUT ) ;
  pinMode( L3, OUTPUT ) ;
  unsigned long tb = millis() ;
}

void loop()
{
  if ( tb-ta >=1000 )
  {
  while ( compteur != 5 )
  {
    boolean etatbouton = digitalRead( 7 ) ;
    Serial.println( etatbouton ) ;
    if ( boolean etatbouton = digitalRead( 7 ) == 0 )
    {
      Serial.println( "ok" ) ;
      compteur++ ;
      digitalWrite( L1, HIGH ) ;
      millis( 250 ) ;
      digitalWrite( L2, HIGH ) ;
      millis( 250 ) ;
      digitalWrite( L3, HIGH ) ;
      millis( 750 ) ;
      digitalWrite( L1, LOW ) ;
      millis( 250 ) ;
      digitalWrite( L2, LOW ) ;
      millis( 250 ) ;
      digitalWrite( L3, LOW ) ;
      millis( 750 ) ;
    }
    else
    {
      Serial.println( "nope" ) ;
      millis( 500 ) ;
    }
  }
  while ( compteurb != 15 )
  {
    Serial.println( "Stop it dude plz" ) ;
    compteurb++ ;
    millis( 750 ) ;
  }
  Serial.println( "Really? you still there?!" ) ;
  millis( 750 ) ;
  }
}

et voici ce que j'ai comme message d'érreur:

exit status 1
too many arguments to function 'long unsigned int millis()'

et le logiciel me montre mon dernier millis dans mon code.

J'ai vraiment du mal à bien comprendre le fonctionnement de la fonction millis. :confused:

Merci pour votre réponse.

titutato:
et voici ce que j'ai comme message d'érreur:

exit status 1

too many arguments to function 'long unsigned int millis()'


et le logiciel me montre mon dernier millis dans mon code.

J'ai vraiment du mal à bien comprendre le fonctionnement de la fonction millis. :confused: 

Merci pour votre réponse.

Comme dit plus haut, millis() ne prend pas d'argument, c'est à dire que tu ne peux pas ecrire millis ( 250 );
La seule chose que tu peux ecrire c'est millis();.

Comment marche millis():

millis() est un compteur, qui compte le temps qui s’écoule depuis la mise sous tensions de ta carte.
A la mise en route millis() vaut 0, 10millisecondes plus tard millis() vaudra 10 etc etc...
Tu ne peux pas arrêter millis(), tu ne peux pas le remettre à zéro. Il se remet a zéro tout seul quand le compteur est plein, ce qui prend à peu près 50jours.

Quand tu veux faire cuire un oeuf 3 minutes, tu regardes ta montre, tu releves l'heure qu'il est, par exemple 12h05, puis tu regardes régulièrement ta montre jusqu'a ce que tu observes que 3 minutes ce sont écoulées.

Il faut faire pareil dans ton code.

Ok je comprend un peu mieux. Merci.
Ducoup, au lieu de remplacer mes delay par des millis, j'aurais du mettre des if avec tb-ta par exemple?

Merci pour vos réponse, je commence à mieux comprendre la fonction millis.

titutato:
Ducoup, au lieu de remplacer mes delay par des millis, j'aurais du mettre des if avec tb-ta par exemple?

Il faut que tu revoies complètement ton programme sous forme d'automate d'état. Voir le tuto de J-M-L

Il faut utiliser deux variables
Tactuel et Tancien

Au départ initialisation de Tancien
Tancien = millis()

Avant chaque test tu fais
Tactuel =millis()
Test
Si Tactuel - Tancien supérieur ou égal a valeur_cherchée alors faire .............

Bonjour,

kamill:
Il faut que tu revoies complètement ton programme sous forme d'automate d'état. Voir le tuto de J-M-L

Ok merci, je regarde ça.

68tjs:
Il faut utiliser deux variables
Tactuel et Tancien

Au départ initialisation de Tancien
Tancien = millis()

Avant chaque test tu fais
Tactuel =millis()
Test
Si Tactuel - Tancien supérieur ou égal a valeur_cherchée alors faire .............

Ok merci, je vais y réfléchir.

Merci de vos réponse, je reposterais mon code quand je l'aurais changé. Si vous avez d'autres conseil/aide à me donner, je suis preneur.

Merci :slight_smile:

J'ai fais ça:

int compteur = 0 ;
int compteurb = 1 ;
int L1 = 2 ;
int L2 = 3 ;
int L3 = 4 ;
int tempoActive = 0 ;
unsigned long tempDepart = 0 ;

void setup()
{
  Serial.begin( 9600 ) ;
  pinMode( 7, INPUT_PULLUP ) ;
  pinMode( L1, OUTPUT ) ;
  pinMode( L2, OUTPUT ) ;
  pinMode( L3, OUTPUT ) ;
}

void loop()
{
  while ( compteur != 5 )
  {
    tempoActive = 1 ;
    tempDepart = millis() ;
    boolean etatbouton = digitalRead( 7 ) ;
    if ( ( millis() - tempDepart ) >= 750 )
    {
      Serial.println( etatbouton ) ;
    }
    tempoActive = 0 ;
    if ( boolean etatbouton = digitalRead( 7 ) == 0 )
    {
      if ( tempoActive )
      {
        tempoActive = 1 ;
        tempDepart = millis() ;
        Serial.println( "ok" ) ;
        compteur++ ;
        if ( ( millis() - tempDepart ) >= 250 )
        {
          digitalWrite( L1, HIGH ) ;
        }
        if ( ( millis() - tempDepart ) >= 500 )
        {
          digitalWrite( L2, HIGH ) ;
        }
        if ( ( millis() - tempDepart ) >= 750 )
        {
          digitalWrite( L3, HIGH ) ;
        }
        if ( ( millis() - tempDepart ) >= 1250 )
        {
          digitalWrite( L1, LOW ) ;
        }
        if ( ( millis() - tempDepart ) >= 1500 )
        {
          digitalWrite( L2, LOW ) ;
        }
        if ( ( millis() - tempDepart ) >= 1750 )
        {
          digitalWrite( L3, LOW ) ;
        }
        tempoActive = 0 ;
      }
    }
    else
    {
      tempoActive = 1 ;
      tempDepart = millis() ;
      if ( ( millis() - tempDepart ) >= 500 )
      {
        Serial.println( "nope" ) ;
      }
      tempoActive = 0 ;
    }
  }
  while ( compteurb != 15 )
  {
    tempoActive = 1 ;
    tempDepart = millis() ;
    if ( ( millis() - tempDepart ) >= 750 )
    {
      Serial.println( "Stop it dude plz" ) ;
      compteurb++ ;
    }
    tempoActive = 0 ;
  }
  tempoActive = 1 ;
  tempDepart = millis () ;
  if ( ( millis() - tempDepart ) >= 750 )
  {
    Serial.println( "Really? you still there?!" ) ;
  }
}

Mais rien ne se passe. J'ai l'impression que mon programme ne rentre pas dans le premier if ( et aussi dans les autres ducoup ).
Je ne comprend pas pourquoi. :confused:

J'ai fais plusieurs test mais rien ne change. Je n'arrive pas a faire fonctionner mon programme.
Est ce que je pourrais avoir plus de précision sur comment je dois faire s'il vous plait? :-[

Merci.

J'ai fais ça:

    tempoActive = millis() ;
    tempDepart = 1 ;
    boolean etatbouton = digitalRead( 7 ) ;
    if ( ( millis() - tempDepart ) >= 750 )
    {
      tempDepart = millis() ;
      Serial.println( etatbouton ) ;
      tempoActive = 0 ;
    }

Maintenant mon programme rentre bien dans le if et fais se que je lui demande ( m'afficher l'état du bouton ). Mais la vitesse d'affichage est trop grande, alors que j'aimerais que l'état du bouton s'affiche toute les 750 millisecondes. Une idée?

Merci pour votre aide.

Le morceau de code que tu montres est sorti de son contexte donc on ne peut pas savoir si c'est bon ou pas dans le contexte final.
Par exemple, si:

tempDepart = 1 ;

est placé dans loop() et bien à chaque itération de la boucle tu réinitialises tempDepart à 1 est donc tu exécutes le contenu du if systématiquement.

Ah oui désoler, oui le morceau de code que j'ai posté est dans le loop:

void loop()
{
  while ( compteur != 5 )
  {
    
    tempoActive = millis() ;
    boolean etatbouton = digitalRead( 7 ) ;
    
    if ( ( millis() - tempDepart ) >= 750 )
    {
      
      Serial.println( etatbouton ) ;
      tempDepart = millis() ;
    }

PS: j'ai refais des test, c'est pour cela que ce code est différent de celui d'avant.

J'ai fais ça:

int compteur = 0 ;
int compteurb = 1 ;
int L1 = 2 ;
int L2 = 3 ;
int L3 = 4 ;
int tempoActive = 0 ;
unsigned long tempDepart = 0 ;

void setup()
{
  Serial.begin( 9600 ) ;
  pinMode( 7, INPUT_PULLUP ) ;
  pinMode( L1, OUTPUT ) ;
  pinMode( L2, OUTPUT ) ;
  pinMode( L3, OUTPUT ) ;
  tempoActive = millis() ;
}

void loop()
{
  unsigned long tempoActive = millis() ;
  while ( compteur != 5 )
  {
    tempoActive = millis() ;
    boolean etatbouton = digitalRead( 7 ) ;
    if ( ( tempoActive - tempDepart ) >= 750 )
    {
      Serial.println( etatbouton ) ;
      tempDepart = millis() ;
    }
    tempoActive = millis() ;
    if ( boolean etatbouton = digitalRead( 7 ) == 0 )
    {
      Serial.println( "ok" ) ;
      compteur++ ;
      if ( ( tempoActive - tempDepart ) >= 250 )
      {
        digitalWrite( L1, HIGH ) ;
        tempDepart = millis() ;
      }
      tempoActive = millis() ;
      if ( ( tempoActive - tempDepart ) >= 250 )
      {
        digitalWrite( L2, HIGH ) ;
        tempDepart = millis() ;
      }
      tempoActive = millis() ;
      if ( ( tempoActive - tempDepart ) >= 250 )
      {
        digitalWrite( L3, HIGH ) ;
        tempDepart = millis() ;
      }
      tempoActive = millis() ;
      if ( ( tempoActive - tempDepart ) >= 500 )
      {
        digitalWrite( L1, LOW ) ;
        tempDepart = millis() ;
      }
      tempoActive = millis() ;
      if ( ( tempoActive - tempDepart ) >= 250 )
      {
        digitalWrite( L2, LOW ) ;
        tempDepart = millis() ;
      }
      tempoActive = millis() ;
      if ( ( tempoActive - tempDepart ) >= 250 )
      {
        digitalWrite( L3, LOW ) ;
        tempDepart = millis() ;
      }
      tempoActive = millis() ;
    }
    else
    {
      if ( ( tempoActive - tempDepart ) >= 500 )
      {
        Serial.println( "nope" ) ;
        tempDepart = millis() ;
      }
      tempoActive = millis() ;
    }
  }
  while ( compteurb != 15 )
  {
    if ( ( tempoActive - tempDepart ) >= 750 )
    {
      Serial.println( "Stop it dude plz" ) ;
      compteurb++ ;
      tempDepart = millis() ;
    }
    tempoActive = millis() ;
  }
  if ( ( tempoActive - tempDepart ) >= 750 )
  {
    Serial.println( "Really? you still there?!" ) ;
    tempDepart = millis() ;
  }
  tempoActive = millis() ;
}

J'avance un peu: maintenant tout mes "println" s'affiche, le "nope" le "stop it dude plz" et le "really? you still there?!" s'affiche a une vitesse normale. MAIS: je n'affiche plus l'état de mon bouton au niveau de mon premier "println" et l'animation de mes LED ne s'effectue pas (il y a seulement ma première LED qui s'allume, mais qui reste allumé).

Des idées? :slight_smile:

Merci.

C'est à dire que la temporisation de 750ms ne peut jamais être atteinte parce que tu réinitialises tempDepart toutes les 250 ou 500ms dans le reste de ton code.
L'enchaînement de tous tes if rends le code compliqué à lire et à comprendre. je pense qu'il serait judicieux d'écrire tout ça sous la forme d'une machine à états.

fdufnews:
L'enchaînement de tous tes if rends le code compliqué à lire et à comprendre. je pense qu'il serait judicieux d'écrire tout ça sous la forme d'une machine à états.

Moi je ne pense pas qu'il soit judicieux de réécrire sous forme de machine d'état, comme je l'ai dit dans un mail précédent je pense que c'est obligatoire.

Ca sert à quoi de bricoler avec millis() alors qu'actuellement il y a une boucle while ( compteur != 5 ) dans la loop?

Bonjour,

fdufnews:
C'est à dire que la temporisation de 750ms ne peut jamais être atteinte parce que tu réinitialises tempDepart toutes les 250 ou 500ms dans le reste de ton code.
L'enchaînement de tous tes if rends le code compliqué à lire et à comprendre. je pense qu'il serait judicieux d'écrire tout ça sous la forme d'une machine à états.

d'accord je vais regarder ça, merci pour l'info.

kamill:
Ca sert à quoi de bricoler avec millis() alors qu'actuellement il y a une boucle while ( compteur != 5 ) dans la loop?

C'est pour remplacer les delay que j'avais mit avant, mais je me rend compte que faut pas forcément que je remplace TOUT mes delay, qu'est ce que vous en pensez?

Merci pour vos réponse.

Soit tu utlises des delay() dans la structure actuelle du programme (millis() ne sert à rien dans la version actuelle).

Soit tu revois complètement ton programme sous forme d'automate et tu utilises millis()

Vu que je voulais juste bien voir comment fonctionnais la fonction millis(), je pense que je vais tout simplement remettre les delay.

Merci pour votre réponse.