Go Down

Topic: Probleme avec la fonction millis() (Read 221 times) previous topic - next topic

b3b3rt

Oct 12, 2017, 10:04 am Last Edit: Oct 12, 2017, 11:50 am by b3b3rt
Bonjour a tous

Je cherche basiquement a faire s'allumer une LED pendant une périodes sans avoir a utiliser delay() qui bloque le programme.
Dans mon programme ci-dessous ma variable temps ne ce réinitialise jamais et ne commence pas quand je le souhaite.
Je peut voir dans le port série que le temps ne cesse de s'écouler.



Code: [Select]

/*
 Programme de reception IR
 Entree PIN 4
 Sorties PIN 10 / 11 /12
*/
#include <IRremote.h>

int RECV_PIN = 4;                //pin de reception du capteur IR
int led2;
int led3;

unsigned long prevtime = 0;

IRrecv recep (RECV_PIN);        // variable de reception IR
decode_results resul;           // resultat de la recpetion en HEX

void setup() {
 
  Serial.begin(9600);           // ouverture du port serie
  recep.enableIRIn();           //Autorise la reception du signal IR dans la variable choisie
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);

}

void loop() {



 if (recep.decode(&resul)){                                 
 
 //Serial.println(resul.value,HEX);                      // valeur hexa du bouton dans le port serie
 
 
  if (resul.value == 0xFF30CF){                       // Un apuis sur 1 alume une led pendant 1 seconde
    (Serial.println("touche1"));
   
   /* digitalWrite (10,1);
    delay(1000);
    digitalWrite (10,0); */
   
    digitalWrite (10,1);
    prevtime = millis()/1000;                            // debut du compteur en secondes
    Serial.println (prevtime);
    if (prevtime >= 1){
      digitalWrite (10,0);
      prevtime=0;
    }
   

  }

   if (resul.value == 0xFF18E7 && led2 ==0){          // Un apuis sur 2 alume la led un deuxieme apuis l'eteind
    (Serial.println("touche2"));
    digitalWrite (11,1);
    led2=1;
  }
  else if (resul.value == 0xFF18E7 && led2 ==1){
    (Serial.println("touche2"));
    digitalWrite (11,0);
    led2=0;
  }


 
  delay(50);                       // evite les redondances
  //recep.enableIRIn();        // je ne sais pas osef
  recep.resume();               // Permet d'apuyer encore sur la telecomande sans cree une boucle infini
 }

}


Dans l'espoir de recevoir votre aide

cordialement B3B3RT

henrigolant

Bonjour,

Ta variable n'est jamais réinitialisée à zéro, tout simplement millis() à partir du moment où tu lances ton programme.

infobarquee

bonjour,
tu veux faire quoi exactement?
ne mélange pas les millis et des delay
AUCUNE AIDE PAR MP

b3b3rt

#3
Oct 12, 2017, 11:05 am Last Edit: Oct 12, 2017, 11:10 am by b3b3rt
Je voudrais faire comme la partie avec le delay() mis en comentaire mais sans que ça me bloque le programe.
Je voudrais alumer une led pendant x secondes en apuyant sur bouton 1 et pouvoir me servir de bouton 2 pendant que la led est allumé
La fonction millis() me semble la plus aproprier mais je suis incabable de la controler (debut , pause , fin ,reset)

fdufnews

millis() compte en permanence donc, passé une seconde, prevtime sera toujours supérieur à 1.

Regarde dans les exemples installés avec l'IDE comment fonctionne le programme BlinkWithoutDelay c'est un exemple simple de l'utilisation de millis().

infobarquee

#5
Oct 12, 2017, 11:13 am Last Edit: Oct 12, 2017, 11:13 am by infobarquee
Code: [Select]
if (resul.value == 0xFF30CF){                       // Un apuis sur 1 alume une led pendant 1 seconde
    (Serial.println("touche1"));
    
    prevtime = millis();                            // debut du compteur en secondes
    Serial.println (prevtime);
    if (millis() -prevtime < 1000){
      digitalWrite (10, HIGH);

    }else{
digitalWrite (10, LOW);
}
AUCUNE AIDE PAR MP

b3b3rt

J'ai essayer mais cella ne marche malheureusement pas

Pour faire plus simple je cherche a pouvoir déclencher manuellement un chronomètre et être capable de le réinitialiser

infobarquee

#7
Oct 13, 2017, 09:54 am Last Edit: Oct 13, 2017, 10:06 am by infobarquee
J'ai essayer mais cella ne marche malheureusement pas

Pour faire plus simple je cherche a pouvoir déclencher manuellement un chronomètre et être capable de le réinitialiser
j'adore lorsque l'on dit, ca ne marche pas.
qu'est ce qui ne fonctionne pas?

entre déclencher manuellement et utiliser une télécommande, c'est pas la même chose.

est ce que tu recois bien la bonne info?

ca va être encore la pêche à l'info pour résoudre ta question.


EDIT :
surtout que le code fait en sorte d'allumer une led pendant une seconde si on recoit un code 0xFF30CF
j'appelle pas ca un chrono.

le schéma est le suivant

si on recoit un code
Code: [Select]
void loop(){
if(irrecv.decode(&results)){
       switch (results.value)[
              case 0xFF30CF:
                  top_chrono();
                  break;
            case 0xFF18E7:
                  Stop();
                  break;
         }
    irrecv.resume();
    }
}//fin loop

void top_chrono(){
top = millis();
Serial.println(millis());
}
void Stop(){
stop = millis();
temps = stop - top;
Serial.println(temps);
}
AUCUNE AIDE PAR MP

fdufnews

#8
Oct 13, 2017, 09:56 am Last Edit: Oct 13, 2017, 09:56 am by fdufnews
La fonction millis() me semble la plus aproprier mais je suis incabable de la controler (debut , pause , fin ,reset)
Je pense que tu n'as pas compris comment fonctionne millis(). On ne contrôle rien. millis() retourne simplement une mesure du temps écoulé depuis la mise en route de la carte. Tu si tu veux mesurer un temps relatif à un événement qui serait ton T0 il faut mémoriser la valeur de millis() à T0 dans une variable (disons milliT0) et travailler ensuite en faisant à chaque instant la différence entre millis() et milliT0.

b3b3rt

Merci beaucoup voila grace a votre aide comment j'ai résolut mon problème

Code: [Select]

void loop() {

if (temps > 1000){
      digitalWrite(10,0);
    }

 if (recep.decode(&resul)){                                 
 
 
  if (resul.value == 0xFF30CF){                       // Un apuis sur 1 alume une led pendant 1 seconde
    top_chrono();
    digitalWrite(10,1);
  }

   if (resul.value == 0xFF18E7 && led2 ==0){          // Un apuis sur 2 alume la led un deuxieme apuis l'eteind
    (Serial.println("touche2"));
    digitalWrite (11,1);
    led2=1;
  }
  else if (resul.value == 0xFF18E7 && led2 ==1){
    (Serial.println("touche2"));
    digitalWrite (11,0);
    led2=0;
  }


  delay(50);                    // evite les redondances
  recep.resume();               // Permet d'apuyer encore sur la telecomande sans cree une boucle infini
 }

Stop();
}


void top_chrono(){
start = millis();
}

void Stop(){
arret = millis();
temps = arret - start;
}


merci beaucoup infobarquee tu m'as fait réfléchir dans le bon sens et m'as donne les outils nécessaire pour pouvoir réaliser ça

infobarquee

utilises les switch case comme je l'ai fait.
ca allège le code d'une part et surtout, si tu veux rajouter des options ca sera plus simple que des if ;)

ton code doit pas durer plus d'une seconde avec le Stop en fin du loop.
c'est pas un chrono ca
AUCUNE AIDE PAR MP

Go Up