Mettre en place un timer

Bonjour à tous XD,

Je souhaiterais mettre en place une pause dans mon timer mais je ne sais pas du tout comment je peux m'y prendre... J'avais comme piste de créer une interruption qui mettrait ce Timer en pause, j'ai d'ailleurs inclus cette interruptions dans mon code mais elle ne met pas le timer en pause et les deux LED restent allumées...

Voici le déroulement de mon programme: lorsque le bouton reste enfoncé, la LED ORANGE reste allumée jusqu’à la fin du temps déterminé. Une fois que celui-ci s'est écoulé, la LED s'éteint... jusqu'ici tout fonctionne... Mais je voudrais également gérer l’événement selon lequel lorsque le bouton serait relâché et que la boucle du Timer n'est pas terminée, la LED ROUGE s'allume et la orange s'éteingne. De plus, je ne comprend pas pourquoi le programme ne s’exécute pas en boucle et que je soit obligé de faire un reset a chaque fois :frowning: Oui je suis débutant en Arduino et cela doit se voir dans mon code... :grin:

Le voici:

const int led_orange = 12;
const int led_rouge = 10;
const int button = 3;
int button_state = 0;

unsigned long valeur_chrono = 18000; // temps à atteindre (en millisecondes)


void setup() 
{
  pinMode(led_rouge, OUTPUT);
  pinMode(led_orange, OUTPUT);
  pinMode(button, INPUT);
  Serial.begin(9600);
  attachInterrupt(1, CHRONO_PAUSE, CHANGE);

}

void loop() 
{
  
   
  
  button_state = digitalRead(button);
  
  if (button_state == HIGH)
  {
   while (valeur_chrono > millis())
   {
     Serial.println(millis());
     delay(1000);
     digitalWrite(led_orange, HIGH);
     
     if (button_state == LOW)
     {
       CHRONO_PAUSE();
     }
   }
    
    if (millis() > valeur_chrono)
    {
      digitalWrite(led_orange, LOW);
    }
    
  }
  else
  {
    digitalWrite(led_orange, LOW);  
  }
}


void CHRONO_PAUSE()
{
  digitalWrite(led_orange, LOW);
  digitalWrite(led_rouge, HIGH);
}

Merci d'avance pour vos réponses

Un moyen pour arrêter un timer est de dévalider la source d'horloge qui l'actionne. Je ne sais pas s'il y en a d'autre.
Les explications sont dans la datasheet du micro.
Par exemple pour le timer0 il faut écrire dans le registre TCCR0B et mettre les bits CS02, CS01 et CS00 à 0L.
Si tu ne les as pas préconfiguré toi même (c'est à dire si cela a été fait par les lib arduino) il est préférable de lire le registre TCCR0B au préalable et d'en mettre le contenu en mémoire pour pouvoir facilement relancer le timer.
Attention modifier les timers 0, 1 et 2 peut avoir des conséquence sur les fonctions delay() et micro() [timer0] et sur les fréquences de PWM (timers 0,1,2)

bonjour

tone5846:

   while (valeur_chrono > millis())

{
...
  }

c'est normal que ton programme ne s'execute qu'une seule fois, tu ne mets pas a jour ta variable "valeur_chrono". Donc au bout de 18 sec, la condition WHILE n'est plus vrai et ne fait plus rien.

a+

Merci pour vos réponses :slight_smile: Il n'y aurait pas un moyens plus simple pour mettre en pause le Timer 68tjs? Par exemple avec des instructions conditionnelles? Tu veux dire mettre à jour la fonction millis() caap? Parce que "valeur_chrono" est une constante (même si je ne l'ai pas précisé dans mon code...

Regarde bien comment fonctionne la fonction millis().
Elle ne fait que ajouter 1 toutes les millisecondes depuis le dernier reset. Donc une fois depassé 18000, bein elle continue.
C'est a toi de gérer une variable qui va mémoriser l'intant T0 que tu considaire comme le debut de ton chronometrage.
il te suffiras de comparer la valeur de millis à tout instant pour savoir si tu as depassé ton "valeur_chrono "

long T0;
...
T0=millis();
while ((millis() - T0) < valeur_chrono ){
...
}

A toi de bien placer la réinitialisation de T0.

voir l'exemple "Blink without delay"

a+

tone5846:
Il n'y aurait pas un moyens plus simple pour mettre en pause le Timer 68tjs?

Tu as demandé comment arrêter un timer je t'ai donné la solution que je connais.
Ecrire :

uint8_t memorisation_T0;
memorisation_T0 = TCCR0B ;
TCCR0B &= ~( (1<<CS02) |(1<<CS01) | (1<<CS00) ) ;

// tu fais ce que tu veux

//tu rétablis le timer ;
TCCR0B =memorisation_T0

N'est pas si compliqué si on veut bien prendre 5 mn pour comprendre. Et ces 5mn ne seront pas du temps perdu. Ces manipulations de bits servent très fréquemment.
Par contre je n'ai pas regardé si c'était la meilleure solution pour ton besoin, et très souvent il y a plusieurs solutions plus au moins heureuses au même problème.

salut, j'ai essayé de faire une pause avec le code que tu m'a donné, mais comme tu l'as précisé, après cela empêche les fonctions de temps de fonctionner correctement... Mais j'ai trouvé une autre solution, merci quand même d'avoir prit le temps de m'aider :wink:

Ici c'est un forum d'entraide qui ne fonctionne pas à sens unique.
C'est très bien si tu as trouvé une solution qui convient, mais ce serait encore mieux si tu en faisait profiter la communauté.