Millisecondes en Secondes + décimale

Hellooo !!

Bon, j'ai passé l'après midi à essayé des tonnes de codes qui n'aboutissent absolument pas à ce que je veux faire, donc je sors ma dernière chance, le forum :smiley:

L'idée étant de convertir une valeur de variable unsigned long (ce sont des millisecondes), pour la mettre dans une autre variable qui sera exploitée par la suite, mais sous forme x.y (secondes.dixièmes de seconde).

J'ai donc ma variable en millisecondes :

unsigned long tps_play = 0;

qui est incrémenté dans le void loop() .

J'ai une variable avant le setup :

float arondi_play = 0;

J'ai essayé des round, des floor etc etc, tout un tas de manip mais ca me met toujours .00 comme décimales .

Je ne souhaite pas utiliser de code du genre
lcd.print(valeur, 1);

Si quelqu'un a une astuce :slight_smile:

Merci et bon OuiK :slight_smile:

Bonsoir,

Tu peux diviser ta variable de départ par 100 avec résultat dans un unsigned long pour ne garder que la partie entière puis tu divisés pas 10 en rangeant le résultat dans ta variable d'arrivée. Pour les 0 qui traînent, cela dépend de ce tu fais avec.

Bonsoir Coin

	long tps_play = 1233;               // Millisecondes
	
	arondi_play = tps_play/10;          // Résultat en entiers
	arondi_play = arondi_play/10;       // Résultat flottant
	String sec_dixiemes = String(arondi_play, 1);
	Serial.println(sec_dixiemes);

En "interne" il y a toujours 2 chiffres après la virgule, mais c'est arrondi au dixième.

Résultat: 12.30, affiché 12.3

Cordialement
jpbbricole

Slt

soit du divise par 1000 pour transformer les millis en seconde :

arondi_play= float(tps_play)/1000;

ça te donne ex:19.24

soit tu décompose :

arondi_play=long(tps_play/1000);  // calcul des secondes
arondi_play += float((tps_play%1000)/100)/10; // ajoute les dixièmes de secondes

ça te donne ex:19.20

Hello,

Merci pour vos réponses :slight_smile:

La victoire revient, à, ààààà : jpbbricole :smiley:

Alors dans l'ordre, Zlika :
Dans le loop je mets

tps_play = millis();
tps_play = tps_play / 100;
arondi_play = float(tps_play) / 10; 
lcd.setCursor(0,0);
lcd.print(arondi_play);

Bah ça donne 2 chiffres après la virgule lol

jpbbricole:
Le résultat correspond parfaitement (et meme mieux) au besoin si je divise la première fois par 100 et non 10 (sans doute une faute de frappe).
La conversion en String , top , car ca me permet de meme aligner l'affichage pour que le point ne se déplace pas.

tps_play = millis();
arondi_play = tps_play/100;          // Résultat en entiers
arondi_play = arondi_play/10;       // Résultat flottant

  if ( tps_play < 10000 ) {
  sec_dixiemes = "  " + String(arondi_play, 1);
  }
  if ( tps_play < 100000 && tps_play > 10000 ) {
  sec_dixiemes = " " + String(arondi_play, 1);
  }
  if ( tps_play >= 100000  ) {
  sec_dixiemes = String(arondi_play, 1);
  }

lcd.setCursor(0,0);
lcd.print(sec_dixiemes);

fifi82 :
Comme pour la solution de Zlika, ca sort 2 chiffres après la virgule :wink:

Merci à tous :slight_smile:

Couin:
Le résultat correspond parfaitement (et meme mieux) au besoin si je divise la première fois par 100 et non 10 (sans doute une faute de frappe).

Non malheureusement c'est pire, certainement du à l'âge, en raisonnant, j'ai perdu l'énoncé du problème et fait comme s'il fallait diviser par cent... mais la "mécanique" est la même.

Couin:
La victoire revient, à, ààààà : jpbbricole :smiley:

Je suis flatté, merci.

Bonne journée
jpbbricole

néanmoins attention, ça fonctionne, mais utiliser String, c'est un peu ouvrir la boite de pandore... là la longueur de la chaine est connue,il vaudrait donc mieux utiliser une chaine de type classique.

@jpbbricole : Ah bah moi c'est tout le temps, oubli, perte, un vrai calvaire :frowning:

@bricofoy : Quel est le risque avec string ? (désolé je ne comprends rien à la mythologie grecque lol).
Il serait mieux de déclarer en

char sec_dixiemes = 0;

?