Timer sur montre M5 stick C

Bonjour,

Je vous écrit ce poste aujourd’hui car je ne trouve vraiment pas la solution sur internet et même dans les exemples arduino du M5 stick C …

Je vous explique en gros je veux faire un sorte de télécommande présentation power point, avec en plus un timer de temps.
Le soucis c’est que je voudrais pouvoir mettre en pause le timer, si je le souhaite.
Et c’est là que je n’arrive pas à trouver la solution …
Mais également je ne sais pas comment faire pour que le timer se lance seulement quand j’appui sur le bouton, comment faire sachant que les millis commence automatiquement après le transfert du programme ? Mon timer affiche 0 au début mais si j’attend 10 sec et que j’appui sur le bouton il affiche 10 sec et non 0,1 comme je voudrais.

Merci d’avance pour votre aide, voilà le programme que j’ai effectué :
Je pense que c’est la position du début de pause et fin de pause qui n’est pas bon mais je n’y arrive pas…

timer_stack.ino (1.02 KB)

Bonjour

en mettant le code en pièce jointe tu mets de côté les contributeurs du forum qui utilisent des smartphones ou des tablettes. ... les temps changent...

Mettre le code dans le corps du message en l'encadrant des balises appropriées, il sera visible d'un plus grand nombre et cela augmentera les chances de réponses.

Balisage du code (voir içi le message #1)

Plus généralement prendre connaissance de Règles du Forum :wink:

#include <M5StickC.h>

int Timer = 1;
unsigned long start_time = 0;
unsigned long duration = 0;

typedef enum {PAUSE, START} tEtat ;
tEtat etat = PAUSE;

void setup(void) {
  M5.begin();
  M5.Lcd.setRotation(3);
  char tmp[12];
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
  M5.Lcd.setTextDatum(MC_DATUM);
}

unsigned long Start (){
  if (digitalRead(M5_BUTTON_HOME) == LOW && digitalRead(BUTTON_B_PIN) == HIGH){
    Timer += 1;
  }
  if ( (Timer % 2) == 0) {
    return (true);
  }
  else 
    return (false);
}

unsigned long Pause (){
  if ( (Timer % 2) == 0) {
    return (false);
  }
  else 
    return (true);
}


unsigned long re_start (){
    if (digitalRead(M5_BUTTON_HOME) == LOW && digitalRead(BUTTON_B_PIN) == LOW) {
    Timer = 1;
    start_time=0;
}
}

void loop() {
   switch (etat) {
    case PAUSE :
      if (Pause()) {
        delay(100);
        duration += millis() - start_time;
        M5.Lcd.drawFloat(duration, 1, 80, 40, 6);
        etat = START;
      }
      break;

    case START :
      if (Start()) {
        start_time = millis();
        M5.Lcd.drawFloat(duration, 1, 80, 40, 6);
        etat = PAUSE;
        
      }
      break;
   }
   }

J’ai changé de code finalement, mais ça ne marche toujours pas …

Je vous explique en gros

Vraiment en gros ...

Tu ferais bien d'exposer avec précision les séquences attendues, et en particulier le rôle de chaque bouton.

Quel est l'intérêt des modulos dans le code ?
Je pense que des anti-rebonds ne feraient pas de mal, à moins que la carte en soit équipée ?
Tu devrais considérer les changements d'état des boutons, pas simplement leur état courant.

Comme Henri, j’ai du mal à voir ce que tu veux.

J’ai supposé : appui sur le bouton pour remettre à zéro et lancer, ou arrêter le chrono. Voici une possibilité (pas testé, je n’ai pas l’appareil)

#include <M5StickC.h>

unsigned long start_time = 0;
float secondes = 0;
int dixiemes = 0;
int oldDixiemes = 0;

typedef enum {PAUSE, START} tEtat ;
tEtat etat = PAUSE;
bool newStart = false;

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
  M5.Lcd.setTextDatum(MC_DATUM);
  start_time = millis();
  M5.Lcd.drawFloat(0, 1, 80, 40, 6); // drawFloat(value, precision, x, y, font);
}

void loop() {
  dixiemes = (int)((millis() - start_time) / 100);
  if (oldDixiemes != dixiemes)   {
    secondes = (float)(millis() - start_time) / 1000.0;
    if (etat == START) M5.Lcd.drawFloat(secondes, 1, 80, 40, 6);
  }

  switch ((int)etat) {
    case PAUSE :
      if (digitalRead(M5_BUTTON_HOME) == LOW && digitalRead(BUTTON_B_PIN) == LOW) {
        etat = START;
        newStart = true;
        delay (30);
      }
      break;

    case START :
      if (newStart) start_time = millis();
      if (digitalRead(M5_BUTTON_HOME) == LOW && digitalRead(BUTTON_B_PIN) == LOW) {
        etat = PAUSE;
        delay(30)
      }
      break;
  }
  oldDixiemes = dixiemes;
}