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