Go Down

Topic: Information bibliothèque SevSeg (Read 129 times) previous topic - next topic

CharlesMnt

Bonjour à tous.

Je suis en train de réaliser une minuterie ou l'on pourrait faire varier le temps avec un potentiomètre et lancer le décompte avec un bouton.
Actuellement et pour des raison de simplicité j'augmente la durée de ma minuterie avec un bouton et je la fais diminuer avec un autre.
Je me suis basé sur un tuto et j'utilise la bibliothèque SevSeg qui a priori simplifie pas mal les choses.

Le problème étant que quand j'augmente la durée de ma minuterie, le 1, 2, 3 s'affiche sur le 3ème digit et le 4 vient s'afficher sur le 2è digit.

et je ne sais comment régler ce problème car je ne trouve aucun tuto ou info sur la bibliothèque SevSeg.

Merci de votre aide !

dbrion06

Excusez moi, mais avez vous votre code quelque part?

CharlesMnt

C'est moi qui m'excuse plutôt  :o

Code: [Select]
#include <SevSeg.h>                    //Bibliothèque permettant de piloter l'afficheur 7 segments à télécharger ici https://github.com/DeanIsMe/SevSeg 

//Connexions électroniques et variables des boutons
const int BOUTON_MOINS = 2;            // Le bouton MOINS est relié à la broche 2
const int BOUTON_PLUS = 3;             // Le bouton PLUS est relié à la broche 3
const int BOUTON_START = 4;            // Le bouton START est relié à la broche 4
int etatBoutonMoins = 0;               // variable d'état du bouton MOINS
int etatBoutonPlus = 0;                // variable d'état du bouton PLUS
int etatBoutonStart = 0;               // variable d'état du bouton 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;                                 // On déclare un objet sevseg qui représente l'afficheur 7 segments


//Variables relatives au temps
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
char* tempsAffiche[] = {"  1", "  2", "  3", " 4", " 5", " 6", " 7", " 8", " 9", "10", " 11"}; //les différents temps affichés dans le menu, à faire correspondre avec les temps internes ci dessous
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)


void setup() {
  // On déclare chaque Bouton comme étant une entrée
  pinMode(BOUTON_MOINS, INPUT);
  pinMode(BOUTON_PLUS, INPUT);
  pinMode(BOUTON_START, INPUT);

  //On initialise l'afficheur 7 Segments
  sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
  sevseg.setBrightness(100);      //On règle l'intensité lumineuse de l'afficheur 7 Segments
}

void loop() {

  //on commence par lire l'etat des buttons et stocker les états dans les variables d'état
  etatBoutonMoins = digitalRead(BOUTON_MOINS); 
  etatBoutonPlus = digitalRead(BOUTON_PLUS);
  etatBoutonStart = digitalRead(BOUTON_START);
 
  // à ce stade on a trois possibilités : on peut appuyer sur le bouton PLUS, MOINS ou START, chaque possibilités est traitée en dessous


  //traitement bouton PLUS
  if (etatBoutonPlus == HIGH) {                           // Si on a appuyé sur PLUS (la variable d'état du bouton PLUS est à HIGH)
    if (selecteurTemps < (sizeof(tempsEnSecondes)) / 2 - 1) { // Et si le compteur n'est pas à son maximum (la taille du tableau)
      selecteurTemps = selecteurTemps + 1 ;                   // Alors on augmente la valeur du sélecteur
    }
    while (digitalRead(BOUTON_PLUS) == HIGH) {            // On bloque le programme en attendant que le bouton soit relaché, comme le programme tourne très vite, on incrémenterait la variable indéfiniment sinon
      sevseg.refreshDisplay();                            // On actualise l'afficheur 7 segments
    }
    temps = tempsEnSecondes[selecteurTemps];              // On met à jour la variable Temps en fonction de la nouvelle valeur du compteur
  }

  //traitement bouton MOINS
  if (etatBoutonMoins == HIGH) {                          // Si on a appuyé sur MOINS (la variable d'état du bouton MOINS est à HIGH)
    if (selecteurTemps > 0) {                             // Et si le compteur n'est pas à son minimum (zéro)
      selecteurTemps = selecteurTemps - 1 ;               // Alors on diminue la valeur du sélecteur
    }
    while (digitalRead(BOUTON_MOINS) == HIGH) {           // On bloque le programme en attendant que le bouton soit relaché, comme le programme tourne très vite, on décrémenterait la variable indéfiniment sinon
      sevseg.refreshDisplay();                            // On actualise l'afficheur 7 segments
    }
    temps = tempsEnSecondes[selecteurTemps];                           
  }

  //traitement bouton START
  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();                                // On rafraichit l'afficheur 7 Segments

      if (digitalRead(BOUTON_MOINS) == HIGH && digitalRead(BOUTON_PLUS) == HIGH) {  //Si on appuie sur les deux boutons en même temps
        break;                                               // La fonciton break nous permet de sortir de la boucle, c'est à dire d'arrêter de décompter le temps, plus d'infos sur break ici : https://www.arduino.cc/en/Reference/Break
      }

    }                                                        // Le temps écoulé est égal au temps sélectionné (La condition de la boucle while n'est plus vraie, donc on en sort)
    tempsEcoule = 0;
  }
  sevseg.setChars(tempsAffiche[selecteurTemps]);
  sevseg.refreshDisplay(); // Must run repeatedly
}


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;
}

dbrion06

#3
Jun 12, 2019, 04:39 pm Last Edit: Jun 12, 2019, 04:41 pm by dbrion06
Code: [Select]

tempsAffiche[] = {"  1", "  2", "  3", " 4",....
.........................012...012...012...01

Ce qui est curieux (et semble expliquer les symptômes) c'est que vos chaines composant tempsAffiche n'ont pas la même longueur...1 a deux espaces devant, 2 aussi, mais 4 n'a qu'un blanc....

Go Up