Bibliothèque SevSeg

Bonjour à tous,

pour un projet perso je dois faire un minuteur où je ferai varier la durée avec un potentiomètre et où je le déclencherai avec un bouton. La durée serait visible sur un afficheur 7 segments 4 digits.

J’ai commencé le programme et pour l’instant je ne cherche que a faire afficher une valeur sur mon afficheur mais celui ci bug : en effet les 2 points du milieu clignotent ainsi qu’une partie du 4ème digit

je galère pas mal car j’ai des problèmes avec l’anglais et je ne trouve pas grand chose avec cette bibliothèque

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;
//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() {
  Serial.begin(9600);                                               //Initialise la communication entre le PC et Arduino
  sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
  sevseg.setBrightness(100);                                        //On regle l'intensitee lumineuse de l'afficheur 7 Segments
}

void loop() {
  valPota = analogRead(A7);                                         //Lis la valeur du potentiomètre
  valFinale = map(valPota, 0, 1023, 0, 600);                        // Ré-étalonne la valeur entre 0 et 1023 sur une fourchette entre 0 et 600
  Serial.println(valFinale);                                        //Affiche la valeur du potentiomètre sur le moniteur série
  sevseg.refreshDisplay();                                          // On actualise l'afficheur 7 segments
  delay(200); //Attends 200 millisecondes
}

Bonjour,

Il n'y a pas d'affichage de la valeur sur l'afficheur

  sevseg.setNumber(valFinale);

La période de rafraîchissement de l'affichage doit être inférieure à quelques ms. Vires ton delay(200)

Merci à toi ! tous mes problèmes sont réglés ! si ce n'est que j'ai l'impression que l'affichage est peu lisible dans le sens ou j'ai l'impression que l'affichage clignote très rapidement.

Quelqu'un aurait la solution ? Merci

Peut être que les valeurs varient trop rapidement. Essaie de faire une tempo de 200ms avec millis()

void loop() {
  static unsigned long millisAff=0;
  if (millis()-millisAff>200)
  {
    millisAff=millis();
    valPota = analogRead(A7);                                         //Lis la valeur du potentiomètre
    valFinale = map(valPota, 0, 1023, 0, 600);                        // Ré-étalonne la valeur entre 0 et 1023 sur une fourchette entre 0 et 600
    Serial.println(valFinale);                                        //Affiche la valeur du potentiomètre sur le moniteur série
    sevseg.setNumber(valFinale);
  }
  sevseg.refreshDisplay();                                          // On actualise l'afficheur 7 segments
}

non ça n'a rien changé, en faite de 0 à 9 l'affichage clignote mais ça va et au delà ça en fait même mal aux yeux !

Ça devrait fonctionner.
Vérifies ton câblage.
C’est quoi ta carte?

Une autre solution (les deux ne sont pas incompatibles) consiste à
a) mémoriser la valeur précédente à afficher (au début, elle serait peu realiste, pour forcer l'affichage)
b) si la valeur en cours différe significativement de la précédente, afficher la valeur en cours

int valpre=22222; // valeur jamais atteinte
const int Seuil = 2; // 
void loop() {
    //Lit la valeur du potentiomètre et la met à l'échelle
    valFinale = map(analogRead(A7), 0, 1023, 0, 600); 
    Serial.println(valFinale);    //Affiche la valeur du potentiomètre sur le moniteur série
    if (abs (valFinale - valpre) > Seuil) {
        sevseg.setNumber(valFinale);
        valpre = valFinale;
    }
  }
  sevseg.refreshDisplay();                                          // On actualise l'afficheur 7 segments
}

(ceci évite d'avoir par exemple 499, puis 501 affiché ce qui est fatiguant... on peut le combiner avec un espacement dans le temps de 200 ms, comme préconisé par Kamil)

Ca y est j'ai trouvé !.….

cette ligne était visiblement en trop…

Serial.println(valFinale);                                        //Affiche la valeur du potentiomètre sur le moniteur série

Merci à tous !

1 Like

C'est étrange. Si tu fais une mesure tous les 200ms il y a largement le temps pour la transmission sans perturber le programme.

Bon, je bute dorénavant sur un nouveau problème :

en effet, je voulais pouvoir afficher sur l’afficheur 7 segments la durée en minute et voir un décompte se faire en fonction de la valeur choisie

par exemple je choisis 2:30 qui correspond à 2min 30 sec et dans le programme que ça me fasse le décompte en seconde soit un décompte de 150 sec

je ne vous cache pas que je me suis inspiré de ce modèle et de remplacer les boutons qui incrémente par le potar :

https://wikifab.org/wiki/Timer_:_Un_minuteur_à_base_d'Arduino

voici mon programme et en faite je sens que je m’enlise à chaque instant, maintenant j’ai des bugs sur l’affichage….

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

void loop() {
  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 <= 29) {
    sevseg.setNumber(0);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 59) {
    sevseg.setNumber(30);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 60) {
    sevseg.setNumber(100);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 90) {
    sevseg.setNumber(130);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 120) {
    sevseg.setNumber(200);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 150) {
    sevseg.setNumber(230);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 180) {
    sevseg.setNumber(300);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 210) {
    sevseg.setNumber(330);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 240) {
    sevseg.setNumber(400);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 270) {
    sevseg.setNumber(430);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 300) {
    sevseg.setNumber(500);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 330) {
    sevseg.setNumber(530);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 360) {
    sevseg.setNumber(600);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 390) {
    sevseg.setNumber(630);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 420) {
    sevseg.setNumber(700);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 450) {
    sevseg.setNumber(730);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 480) {
    sevseg.setNumber(800);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 510) {
    sevseg.setNumber(830);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 540) {
    sevseg.setNumber(900);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 570) {
    sevseg.setNumber(930);
    sevseg.refreshDisplay();
  }
  
}

Il faut mettre des else if autrement tous les ifs de valeurs inférieures seront exécutés
Ensuite tu n’as pas besoin de mettre refreshDisplay dans chaque if, tu en mets un seul à la fin.

  if (valFinale <= 29) {
   sevseg.setNumber(0);
   }
   else if (valFinale <= 59) {
     sevseg.setNumber(30);
   }
   else if (valFinale <= 60) {
    sevseg.setNumber(100);
  }
...
    sevseg.refreshDisplay();

Toute votre sequence de tests est très longue

if (valFinale <= 29) {
    sevseg.setNumber(0);
    sevseg.refreshDisplay();
  }
  if (valFinale <= 59) {....

Je la remplacerais par

int aAfficher = 975; // valeur impossible
if (valFinale <= 29) aAfficher=0;
if (valFinale <= 59) aAfficher=30;
.....

if (valFinale <= 579) aAfficher =  930;

    sevseg.setNumber(aAfficher); // un seul point pour afficher
    sevseg.refreshDisplay();

pour pouvoir tenter de debugguer (je rejoins Kamill, qui a tapé plus vite que moi: je ne pense pas, cependant, que la kyrielle de ifs soit pénalisante…