Faire un décompte pour minuteur sur afficheur 7 segements

Bonjour, je reviens vers vous après mon aventure d'hier, je continue sur mon programme mais je bute sur un nouveau problème : en effet je ne vois pas comment coder un décompte.

J'ai récupérer un bout de programme c'est celui du bouton start mais je ne vois pas comment l'utiliser car il me faudrait une variable que je puisse venir chercher dans n'importe lequel de mes if

Merci d'avance,

#include <SevSeg.h>                                                 //Bibliothèque permettant de piloter l'afficheur 7 segments à télécharger ici https://github.com/DeanIsMe/SevSeg  
int valPota;                                                        //Initialise la variable qui va recueillir la valeur du potentiomètre
int valFinale;
const int BOUTON_START = 6;                                         // Le bouton START est relié à la broche 4
int etatBoutonStart = 0;                                            // variable d'état du bouton START
int selecteurTemps = 0;                                             // Sélection du temps
unsigned long temps = 0;                                            // Temps que l'on a sélectionné
unsigned long instantStart = 0;                                     // Instant ou l'on a appuyé sur START
long tempsEcoule = 0;                                               // Temps écoulé depuis que l'on a appuyé sur START

//Afficheur 7 segments
const byte numDigits = 4;                                           // Nombre de digits de l'afficheur 7 segments, ici il y en a 4 ( on utilise un afficheur référencé SH5461AS )
const byte digitPins[] = {13, 10, 9, A5};                           // Branchement des broches contrôlant les chiffres, celles ou on mettra une résistance de 220 Ohm
const byte segmentPins[] = {12, 8, A3, A1, A0, 11, A4, A2};         // Branchements des broches controlant les segments
SevSeg sevseg;


void setup() {
  sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
  sevseg.setBrightness(100);                                        //On regle l'intensitee lumineuse de l'afficheur 7 Segments
  pinMode(7, OUTPUT);
  pinMode(BOUTON_START, INPUT);


}

void loop() {
  timer();

  if (etatBoutonStart == HIGH) {
    temps = tempsEnSecondes[selecteurTemps];                        // On met à jour la variable Temps en fonction de la nouvelle valeur du compteur
    instantStart = millis();                                        //On utilise la fonction millis qui renvoie le nombre de millisecondes depuis que le programme est lancé pour garder en mémoire l'instant ou l'on a appuyé sur start. Plus d'infos sur Millis ici : https://www.arduino.cc/en/Reference/Millis
    while (tempsEcoule != temps) {                                  // Tant que le temps écoulé n'est pas celui que l'on a sélectionné
      tempsEcoule = 1 + (millis() - instantStart) / 1000;           //calcul du temps écoulé depuis l'appui sur start (+1 pour commencer chrono à 1)
      sevseg.setNumber(calcul_temps_renstant(tempsEcoule), 2);      // On calcule le temps qu'il reste à décompter et on définit ce temps l'afficheur 7 Segments
      sevseg.refreshDisplay();
    }
    void timer() {
      valPota = analogRead(A7);                                          //Lis la valeur du potentiomètre
      valFinale = map(valPota, 0, 1023, 0, 720);                         // Ré-étalonne la valeur entre 0 et 1023 sur une fourchette entre 0 et 600
      if (valFinale <= 5) {
        sevseg.setNumber(0);
      }
      else if (valFinale <= 30) {
        sevseg.setNumber(30);
      }
      else if (valFinale <= 60) {
        sevseg.setNumber(100);
      }
      else if (valFinale <= 90) {
        sevseg.setNumber(130);
      }
      else if (valFinale <= 120) {
        sevseg.setNumber(200);
        sevseg.refreshDisplay();
      }
      else if (valFinale <= 150) {
        sevseg.setNumber(230);
        sevseg.refreshDisplay();
      }
      else if (valFinale <= 180) {
        sevseg.setNumber(300);
      }
      else if (valFinale <= 210) {
        sevseg.setNumber(330);
      }
      else if (valFinale <= 240) {
        sevseg.setNumber(400);
      }
      else if (valFinale <= 270) {
        sevseg.setNumber(430);
      }
      else if (valFinale <= 300) {
        sevseg.setNumber(500);
      }
      else if (valFinale <= 330) {
        sevseg.setNumber(530);
      }
      else if (valFinale <= 360) {
        sevseg.setNumber(600);
      }
      else if (valFinale <= 390) {
        sevseg.setNumber(630);
      }
      else if (valFinale <= 420) {
        sevseg.setNumber(700);
      }
      else if (valFinale <= 450) {
        sevseg.setNumber(730);
      }
      else if (valFinale <= 480) {
        sevseg.setNumber(800);
      }
      else if (valFinale <= 510) {
        sevseg.setNumber(830);
      }
      else if (valFinale <= 540) {
        sevseg.setNumber(900);
      }
      else if (valFinale <= 570) {
        sevseg.setNumber(930);
      }
      else if (valFinale <= 600) {
        sevseg.setNumber(1000);
      }
      else if (valFinale <= 630) {
        sevseg.setNumber(1030);
      }
      else if (valFinale <= 660) {
        sevseg.setNumber(1100);
      }
      else if (valFinale <= 690) {
        sevseg.setNumber(1130);
      }
      else if (valFinale <= 720) {
        sevseg.setNumber(1200);
      }
      sevseg.refreshDisplay();

      int calcul_temps_renstant(int tempsActuel) {                                               // Fonction permettant de transformer le temps en secondes en minutes et secondes.
        int tempsRestantEnMinutesEtSecondes = 0;
        int minutesRestantes = (temps - tempsActuel) / 60;
        int secondesRestantes = (temps - tempsActuel) % 60;                                      //ressource consultée pour le calcul https://www.arduino.cc/en/Reference/modulo
        return tempsRestantEnMinutesEtSecondes = minutesRestantes * 100 + secondesRestantes;
      }

      void clignotement() {
        digitalWrite(7, HIGH);   // allume la LED
        delay(1000);              // ne fait rien pendant 1 seconde
        digitalWrite(7, LOW);    // éteint la LED
        delay(1000);
      }
    }
  }
}

Bonjour,
Dans ton code il manque la fonction "tempsEnSecondes" et quelque accolades.

salut ! oui j'ai cette ligne la que j'aimerais ajouter mais je ne comprends pas comment je peux la rattacher aux valeurs que mon afficheurs 7 segments affiche (nb 30sec ou 1:00 ou 1:30 par exemple)

int tempsEnSecondes[] = {60, 120, 180, 240, 300, 360, 420, 480, 540, 600, 660}; // les différents temps proposés dans le menu ( variable interne en secondes, n'est pas affichée)

Pour faire un décompte, je partirais sur la structure de code suivante (en utilisant millis())

unsigned long compteur;

void resetCompteur()
{
  compteur = 150; // 2min30
}

void finDuTempsImparti()
{
  Serial.println(F("Fin du temps imparti !"));
  resetCompteur();
}

void decompte()
{
  static unsigned long chrono;
  const unsigned long chronoStep = 100; // mettre 1000 en vrai pour 1 fois par seconde
  if (millis() - chrono >= chronoStep) {
    unsigned long m = compteur / 60; // minutes
    unsigned int  s = compteur % 60; // secondes
    Serial.print(m);
    Serial.print(F(":"));
    if (s < 10)   Serial.print(F("0"));
    Serial.println(s);
    if (--compteur == 0) finDuTempsImparti();
    chrono = millis();
  }
}

void setup()
{
  Serial.begin(115200);
  resetCompteur();
}

void loop()
{
  decompte();
  // ici on peut faire autre chose si c'est pas trop long
}

notez le   const unsigned long chronoStep = 100; // mettre 1000 en vrai pour 1 fois par seconde j'ai mis 100 dans la valeur pour que ça défile 10x plus vite et qu'on n'ait pas à attendre 2:30...

Ensuite dans vos if, il suffirait d'affecter la variable compteur à la bonne valeur. L'affichage ensuite se fait tout seul

Merci de ta réponse, je me rends compte que je suis un peu un noob en faite parce que je ne comprends pas comment le decompte va pouvoir se faire sachant que je mélange des valeurs en secondes et en minutes secondes (exemple 1min30)

voici mon programme j'ai commencé a affecter la valeur compteur aux premiers if

#include <SevSeg.h>                                                 //Bibliothèque permettant de piloter l'afficheur 7 segments à télécharger ici https://github.com/DeanIsMe/SevSeg  
int valPota;                                                        //Initialise la variable qui va recueillir la valeur du potentiomètre
int valFinale;
const int BOUTON_START = 6;                                         // Le bouton START est relié à la broche 4
int etatBoutonStart = 0;                                            // variable d'état du bouton START
long tempsEcoule = 0;                                             // Temps écoulé depuis que l'on a appuyé sur START
unsigned long compteur;


//Afficheur 7 segments
const byte numDigits = 4;                                           // Nombre de digits de l'afficheur 7 segments, ici il y en a 4 ( on utilise un afficheur référencé SH5461AS )
const byte digitPins[] = {13, 10, 9, A5};                           // Branchement des broches contrôlant les chiffres, celles ou on mettra une résistance de 220 Ohm
const byte segmentPins[] = {12, 8, A3, A1, A0, 11, A4, A2};         // Branchements des broches controlant les segments
SevSeg sevseg;


void setup() {
  sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
  sevseg.setBrightness(100);                                        //On regle l'intensitee lumineuse de l'afficheur 7 Segments
  pinMode(7, OUTPUT);
  pinMode(BOUTON_START, INPUT);
  Serial.begin(115200);


}

void loop() {
  timer();
  if (etatBoutonStart == HIGH) {
    decompte();
  }

}
void timer() {
  valPota = analogRead(A7);                                          //Lis la valeur du potentiomètre
  valFinale = map(valPota, 0, 1023, 0, 720);                         // Ré-étalonne la valeur entre 0 et 1023 sur une fourchette entre 0 et 600
  if (valFinale <= 5) {
    sevseg.setNumber(0);
    compteur = 0
  }
  else if (valFinale <= 30) {
    sevseg.setNumber(30);
        compteur = 30
  }
  else if (valFinale <= 60) {
    sevseg.setNumber(100);
        compteur = 60
  }
  else if (valFinale <= 90) {
    sevseg.setNumber(130);
     compteur = 90
 }
  else if (valFinale <= 120) {
    sevseg.setNumber(200);
    sevseg.refreshDisplay();
  }
  else if (valFinale <= 150) {
    sevseg.setNumber(230);
    sevseg.refreshDisplay();
  }
  else if (valFinale <= 180) {
    sevseg.setNumber(300);
  }
  else if (valFinale <= 210) {
    sevseg.setNumber(330);
  }
  else if (valFinale <= 240) {
    sevseg.setNumber(400);
  }
  else if (valFinale <= 270) {
    sevseg.setNumber(430);
  }
  else if (valFinale <= 300) {
    sevseg.setNumber(500);
  }
  else if (valFinale <= 330) {
    sevseg.setNumber(530);
  }
  else if (valFinale <= 360) {
    sevseg.setNumber(600);
  }
  else if (valFinale <= 390) {
    sevseg.setNumber(630);
  }
  else if (valFinale <= 420) {
    sevseg.setNumber(700);
  }
  else if (valFinale <= 450) {
    sevseg.setNumber(730);
  }
  else if (valFinale <= 480) {
    sevseg.setNumber(800);
  }
  else if (valFinale <= 510) {
    sevseg.setNumber(830);
  }
  else if (valFinale <= 540) {
    sevseg.setNumber(900);
  }
  else if (valFinale <= 570) {
    sevseg.setNumber(930);
  }
  else if (valFinale <= 600) {
    sevseg.setNumber(1000);
  }
  else if (valFinale <= 630) {
    sevseg.setNumber(1030);
  }
  else if (valFinale <= 660) {
    sevseg.setNumber(1100);
  }
  else if (valFinale <= 690) {
    sevseg.setNumber(1130);
  }
  else if (valFinale <= 720) {
    sevseg.setNumber(1200);
  }
  sevseg.refreshDisplay();

  void resetCompteur()
  {
    compteur = 150; // 2min30
  }

  void finDuTempsImparti()
  {
    Serial.println(F("Fin du temps imparti !"));
    resetCompteur();
  }

  void decompte()
  {
    static unsigned long chrono;
    const unsigned long chronoStep = 100; // mettre 1000 en vrai pour 1 fois par seconde
    if (millis() - chrono >= chronoStep) {
      unsigned long m = compteur / 60; // minutes
      unsigned int  s = compteur % 60; // secondes
      Serial.print(m);
      Serial.print(F(":"));
      if (s < 10)   Serial.print(F("0"));
      Serial.println(s);
      if (--compteur == 0) finDuTempsImparti();
      chrono = millis();
    }
  }
}

Les définitions des fonctions ne peut pas être imbriquées. Vérifies tes {}

tu parles des variables "compteur" ?

Non, je parle des fonctions.
Les fonctions finDuTempsImparti() et decompte() sont définies à l’intérieur de la fonction timer().
Utilises Ctrl T pour formater correctement ton code et tu le verras.

Bon, lol, après de longues heure je reviens vers vous
j'ai testé plein de choses bizarres mais en faite je ne comprends toujours pas comment mon décompte se fera j'en reviens toujours au même....
j'en suis revenu à cette base qui me semble correct :

#include <SevSeg.h>                                                 //Bibliothèque permettant de piloter l'afficheur 7 segments à télécharger ici https://github.com/DeanIsMe/SevSeg  
int valPota;                                                        //Initialise la variable qui va recueillir la valeur du potentiomètre
int valFinale;
const int BOUTON_START = 6;                                         // Le bouton START est relié à la broche 4
int etatBoutonStart = 0;                                            // variable d'état du bouton START
long tempsEcoule = 0;                                             // Temps écoulé depuis que l'on a appuyé sur START
unsigned long compteur;


//Afficheur 7 segments
const byte numDigits = 4;                                           // Nombre de digits de l'afficheur 7 segments, ici il y en a 4 ( on utilise un afficheur référencé SH5461AS )
const byte digitPins[] = {13, 10, 9, A5};                           // Branchement des broches contrôlant les chiffres, celles ou on mettra une résistance de 220 Ohm
const byte segmentPins[] = {12, 8, A3, A1, A0, 11, A4, A2};         // Branchements des broches controlant les segments
SevSeg sevseg;


void setup() {
  sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
  sevseg.setBrightness(100);                                        //On regle l'intensitee lumineuse de l'afficheur 7 Segments
  pinMode(7, OUTPUT);
  pinMode(BOUTON_START, INPUT);
  Serial.begin(115200);


}

void loop() {
  timer();
  if (etatBoutonStart == HIGH) {
    decompte();
  }

}
void timer() {
  valPota = analogRead(A7);                                          //Lis la valeur du potentiomètre
  valFinale = map(valPota, 0, 1023, 0, 720);                         // Ré-étalonne la valeur entre 0 et 1023 sur une fourchette entre 0 et 600
  if (valFinale <= 5) {
    sevseg.setNumber(0);
    compteur = 0;
  }
  else if (valFinale <= 30) {
    sevseg.setNumber(30);
    compteur = 30;
  }
  else if (valFinale <= 60) {
    sevseg.setNumber(100);
    compteur = 60;
  }
  else if (valFinale <= 90) {
    sevseg.setNumber(130);
    compteur = 90;
  }
  else if (valFinale <= 120) {
    sevseg.setNumber(200);
    sevseg.refreshDisplay();
        compteur = 120;
  }
  else if (valFinale <= 150) {
    sevseg.setNumber(230);
    sevseg.refreshDisplay();
        compteur = 150;

  }
  else if (valFinale <= 180) {
    sevseg.setNumber(300);
        compteur = 180;
  }
  else if (valFinale <= 210) {
    sevseg.setNumber(330);
        compteur = 210;

  }
  else if (valFinale <= 240) {
    sevseg.setNumber(240);
        compteur = 90;
  }
  else if (valFinale <= 270) {
    sevseg.setNumber(430);
        compteur = 270;

  }
  else if (valFinale <= 300) {
    sevseg.setNumber(500);
        compteur = 300;
  }
  else if (valFinale <= 330) {
    sevseg.setNumber(530);
        compteur = 330;

  }
  else if (valFinale <= 360) {
    sevseg.setNumber(600);
        compteur = 360;
  }
  else if (valFinale <= 390) {
    sevseg.setNumber(630);
        compteur = 390;

  }
  else if (valFinale <= 420) {
    sevseg.setNumber(700);
        compteur = 420;
  }
  else if (valFinale <= 450) {
    sevseg.setNumber(730);
        compteur = 450;
  }
  else if (valFinale <= 480) {
    sevseg.setNumber(800);
        compteur = 480;

  }
  else if (valFinale <= 510) {
    sevseg.setNumber(830);
        compteur = 510;
  }
  else if (valFinale <= 540) {
    sevseg.setNumber(900);
        compteur = 540;
  }
  else if (valFinale <= 570) {
    sevseg.setNumber(930);
        compteur = 570;
  }
  else if (valFinale <= 600) {
    sevseg.setNumber(1000);
        compteur = 600;
  }
  else if (valFinale <= 630) {
    sevseg.setNumber(1030);
        compteur = 630;
  }
  else if (valFinale <= 660) {
    sevseg.setNumber(1100);
        compteur = 660;
  }
  else if (valFinale <= 690) {
    sevseg.setNumber(1130);
        compteur = 690;
  }
  else if (valFinale <= 720) {
    sevseg.setNumber(1200);
        compteur = 720;
  }
  sevseg.refreshDisplay();
}

  void resetCompteur()
  {
    compteur = 150; // 2min30
  }

  void finDuTempsImparti()
  {
    Serial.println(F("Fin du temps imparti !"));
    resetCompteur();
  }

  void decompte()
  {
    static unsigned long chrono;
    const unsigned long chronoStep = 100; // mettre 1000 en vrai pour 1 fois par seconde
    if (millis() - chrono >= chronoStep) {
      unsigned long m = compteur / 60; // minutes
      unsigned int  s = compteur % 60; // secondes
      Serial.print(m);
      Serial.print(F(":"));
      if (s < 10)   Serial.print(F("0"));
      Serial.println(s);
      if (--compteur == 0) finDuTempsImparti();
      chrono = millis();
    }
  }

Merci pour votre patience !

Bonsoir,
Je pense que avec ce code c'est normal d’être perdu. Moi je le suis.
C'est normal quand on prend des bouts de code à droite et à gauche.
Le cœur du code est la fonction "decompte".
T'as utilisé la fonction decompte que J-M-L t'a proposé.
Le problème est dans son code cette fonction est appelé à chaque loop, dans ton code est appelé seulement si le bouton start est appuyé. Peut être que ce n'est pas un bouton mais un interrupteur?

Il faut que tu utilises une variable pour indiquer l'état ou est ton programme
L'état passe en mode decompte lorsque tu appuies sur le bouton
L'état passe en mode réglage lorsque le décompte est fini

enum Eetat {E_REGLAGE, E_DECOMPTE};

Eetat etat = E_REGLAGE;

void loop() {
  if (digitalRead(BOUTON_START) == LOW) // ou HIGH suivant câblage 
    etat = E_DECOMPTE;

  if (etat == E_REGLAGE)
    timer();
  else
    decompte();
}

On peux améliorer de cette façon?

void loop() {
  if (digitalRead(BOUTON_START) == LOW && etat == E_REGLAGE)
    {
      etat = E_DECOMPTE;
      delay(100);
    } else if (digitalRead(BOUTON_START) == LOW && etat == E_DECOMPTE)
    {
      etat = E_REGLAGE;
      delay(100);
    }

  if (etat == E_REGLAGE)
    timer();
  else
    decompte();
}

dans le cas ou il veut ré-initialiser le décompte.

Moi je remplacerais aussi le grand bazar

void timer() {
  valPota = analogRead(A7);                                          //Lis la valeur du potentiomètre
  valFinale = map(valPota, 0, 1023, 0, 720);                         // Ré-étalonne la valeur entre 0 et 1023 sur une fourchette entre 0 et 600
  if (valFinale <= 5) {
    sevseg.setNumber(0);
    compteur = 0;
  }
  else if (valFinale <= 30) {
    sevseg.setNumber(30);
    compteur = 30;
  }
  else if (valFinale <= 60) {
    sevseg.setNumber(100);
    compteur = 60;
  }
  else if (valFinale <= 90) {
    sevseg.setNumber(130);
    compteur = 90;
  }
  else if (valFinale <= 120) {
    sevseg.setNumber(200);
    sevseg.refreshDisplay();
        compteur = 120;
  }
  else if (valFinale <= 150) {
    sevseg.setNumber(230);
    sevseg.refreshDisplay();
        compteur = 150;

  }
  else if (valFinale <= 180) {
    sevseg.setNumber(300);
        compteur = 180;
  }
  else if (valFinale <= 210) {
    sevseg.setNumber(330);
        compteur = 210;

  }
  else if (valFinale <= 240) {
    sevseg.setNumber(240);
        compteur = 90;
  }
  else if (valFinale <= 270) {
    sevseg.setNumber(430);
        compteur = 270;

  }
  else if (valFinale <= 300) {
    sevseg.setNumber(500);
        compteur = 300;
  }
  else if (valFinale <= 330) {
    sevseg.setNumber(530);
        compteur = 330;

  }
  else if (valFinale <= 360) {
    sevseg.setNumber(600);
        compteur = 360;
  }
  else if (valFinale <= 390) {
    sevseg.setNumber(630);
        compteur = 390;

  }
  else if (valFinale <= 420) {
    sevseg.setNumber(700);
        compteur = 420;
  }
  else if (valFinale <= 450) {
    sevseg.setNumber(730);
        compteur = 450;
  }
  else if (valFinale <= 480) {
    sevseg.setNumber(800);
        compteur = 480;

  }
  else if (valFinale <= 510) {
    sevseg.setNumber(830);
        compteur = 510;
  }
  else if (valFinale <= 540) {
    sevseg.setNumber(900);
        compteur = 540;
  }
  else if (valFinale <= 570) {
    sevseg.setNumber(930);
        compteur = 570;
  }
  else if (valFinale <= 600) {
    sevseg.setNumber(1000);
        compteur = 600;
  }
  else if (valFinale <= 630) {
    sevseg.setNumber(1030);
        compteur = 630;
  }
  else if (valFinale <= 660) {
    sevseg.setNumber(1100);
        compteur = 660;
  }
  else if (valFinale <= 690) {
    sevseg.setNumber(1130);
        compteur = 690;
  }
  else if (valFinale <= 720) {
    sevseg.setNumber(1200);
        compteur = 720;
  }
  sevseg.refreshDisplay();
}

par une petite formule mathématique...

  valFinale = map(analogRead(A7), 0, 1023, 0, 720); // Ré-étalonne la valeur entre 0 et 1023 sur une fourchette entre 0 et 720
  if (valFinale <= 5) {
    compteur = 0;
  } else {
    compteur = 30 * (1 + (valFinale / 30));
  }

et au lieu d'affecter sevseg.setNumber([color=red]xxx[/color]) qui est la représentation numérique des minutes et secondes dans la fonction, je laisserais faire cela à la fonction decompte()

Dans cette fonction on commence par calculer

      unsigned long m = compteur / 60; // minutes
      unsigned int  s = compteur % 60; // secondes

et donc si vous voulez la valeur équivalente à mettre dans votre 7 Segments c'est

sevseg.setNumber(100*m+s); // représentation en centaines et unités
sevseg.refreshDisplay();

(notez que m peut être aussi un unsigned int dans votre cas, pas la peine de 4 octets, 2 suffisent)

c'est plus simple non ?