bonjour j'aimerais fair un décompte de 50 jour 4 heure 52 minute et 35 seconde mais au moment ou le programme s'exécute les jour ne fonctionne pas . J'aimerais avoir de l'aide s'il vous plait .
matérielle:
carte Arduino Uno R3
écran LCD
programme:
#include <LiquidCrystal.h>
const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
long timeInit=50;
int tDay=10;
int tHour=4;
int tMin=4;
int tSec=35;
void setup() {
lcd.begin(16, 2);
analogWrite(8,15);
lcd.print("Depart dans :");
timeInit=timeToCounter(tDay,tHour,tMin,tSec);
}
void loop() {
counterToTime(timeInit);
lcd.setCursor(0, 1);
lcd.print(tDay);
lcd.print(" j ");
lcd.print(tHour);
lcd.print(" h ");
lcd.print(tMin);
lcd.print(" m ");
lcd.print(tSec);
lcd.print(" s");
delay(1000);
timeInit=timeInit-1;
}
int timeToCounter(int j,int h,int m,int s){
return j/24+h*3600+m*60+s;
}
void counterToTime(long cnt){
tDay=(cnt/3600);
tHour=(cnt/3600);
tMin=(cnt%3600)/60;
tSec=((cnt%3600)%60);
}
Tu es sûr de toi? Tu penses vraiment qu'il faut faire j/24? Et il ne manquerait pas une paire de parenthèses aussi?
Et ici, tu calcules les jours comme tu calcules les heures, tu ne trouves pas ça choquant?
Pour les heures, cnt/3600 va contenir les heures ET les jours. Il manque sûrement un modulo par là.
tSec = ((cnt % 3600) % 60); c'est pareil que tSec = cnt % 60;
Tu es sure?
50J en seconde on est de l'ordre de 4 million.
Il faudrait des milliseconde pour avoir des milliards, il faudrait alors passé en unsigned long, d'ailleurs.
Pour compléter les réponses, tu si veux avoir une précision correcte(illusoire, mais on pourra y revenir plus tard ), il ne faudrait pas utiliser un delay de 1000 ms, car entre chaque incrémentation de ta variable "timeInit" il se passera un peu plus de 1000ms.
car il faut ajouter le temps d'exécution de ton code.
Cela ne devrait pas ajouter grand chose, mais mutliplié par 4 millions, cela peut te rajouter quelques secondes.
On en revient à l'illusoire, car la fréquence d'un microcontrôleur n'est pas exacte et donc les fonction comme delay, ne sont pas très précise.
Cela entraine une dérive de l'horloge ou du comptage du temps.
Mais d'autre pourront te donner les données exactes
bonjour,
je tombe un peu tard sur ce fil ...
de plus, le demandeur n'étant pas revenu après les premières réponses, mon intervention n'aura sans doute pas de suite ... mais peut-être servira-t-elle à d'autres ?
@minou19,
pourquoi créer des variables contenant le nombre de jours, d'heures, etc... sans t'en servir directement ? tu te simplifierais la vie.
tu cherches à convertir ces données individuelles en un nombre unique, que tu re-décomposes ensuite : fais tes décrémentations directement dans tes variables, ce sera plus simple et plus efficace.
autre chose, qui a dû en choquer plus d'un : l'utilisation de delay() pour le cadencement.
ici, tu ne fais rien d'autre que ton décompte, le fait que delay() soit une fonction bloquante n'influence donc pas le déroulement du programme, mais la régularité des boucles n'est pas assurée car n'étant pas toutes exécutées dans le même nombre de cycles d'horloge leur temps d'exécution variable va venir s'ajouter à ton délai, qui lui-même va devenir variable : il vaudrait mieux ici utiliser millis() et la technique décrite dans de nombreux autres fils de discussion de ce forum.