Décompte Arduino

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

}

je vous remercie

Bonjour et Bienvenue !

Je viens de déplacer ton message , posté initialement dans la partie anglophone du Forum

Lien direct vers le forum Arduino francophone : https://forum.arduino.cc/c/international/francais/49/

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;

Bonjour minou19

Mise à part la remarque de @fdufnews , ta fonction:

int timeToCounter(int j,int h,int m,int s){
 return j/24+h*3600+m*60+s;
}

retourne un int alors que tu es, ailleurs, en long. int est insuffisant pour stocker le nombre de secondes du décompte.

Cordialement
jpbbricole

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 :slight_smile: ), 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 :slight_smile:

Bonjour terwal

Oui,

ne peut pas retourner 4 millions, puisque int c'est entre -32,768 et 32,767

Effectivement je suis con, comme je suis sur une architecture 32bits en ce moment, je n'ai pas réfléchit plus que ça :crazy_face:

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.

exemple :

// ...
if ( TSec != 0 ) TSec -- ;
else
{
	TSec = 59 ;
	if ( TMin != 0 ) TMin -- ;
	else
	{
		TMin = 59 ;
		if ( THour != 0 ) THour -- ;
		else
		{
			THour = 23 ;
			if // la suite...
		}
	}
}
// ...

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.

Oui c'est ce que j'ai évoqué dans un précédent post :face_with_hand_over_mouth:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.