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 à 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.
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
}
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)
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();
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....