conversion float en string en vue d'écriture sur carte SD

Bonjour,

Je souhaite faire un logger qui enregistrer les données de capteurs dans le temps.
Pour faciliter la comparaison avec d'autres appareils, et pour tracer des graph, je calcule le temps décimale.

voici ma fonction

float DecTimeConv(Time t){
  float DecTime;
  DecTime=(t.yr-1900)*365+(t.mon-1)*30+t.date+(t.hr*3600.0+t.min*60.0+t.sec)/(86400.0);
  return DecTime;
}

quand je fait un Serial.println(DecTimeConv(t),8); , j'ai quelque chose comme ça 43167.78296875.

Mais quand je veux transformer ça en String pour pouvoir l'écrire dans un fichier texte sur une carte SD,
j'ai que 2 décimales.
Avec String(DecTimeConv(t),8) j'obtiens : 43167.79000000

après quelques recherches sur internet, je trouve une fonction dtostrf(). YOUPIIII je suis sauvé !

char outstr[15];
dtostrf(DecTimeConv(t),14,8,outstr);

me donne 43167.78300000

J'ai gagné 1 chiffre significatif mais c'est pas suffisant.

Est ce que quelqu'un a une idée de pourquoi ça ne fonctionne pas ?

Merci

Tu peux conserver
DecTime=(t.yr-1900)*365+(t.mon-1)*30+t.date+(t.hr*3600.0+t.min*60.0+t.sec); et stocker cette valeur.
Si ce temps ne sert qu'à faire des comparaisons, tu peux utiliser cette valeur qui ne pose pas de problème de précision.

Si tu dois diviser, tu n'es pas forcé de diviser par 86400 : en divisant par 864, tu gagnes 2 décimales.

Quand je parle de comparaison ... c'est pas une comparaison dans le programme en lui même.
Le logger sera posé sur un autre appareil qui fait des mesures, et ces mesures sont données en temps décimale selon la formule que j'utilise dans la fonction.
Après récupération des données, je peux mettre en parallèle les données de mes capteurs avec l'appareil sur lequel le logger se trouve sur un même graph facilement

la partie entiere correspond au nombre de jours écoulés depuis le 1er janvier 1900 (en partant du principe qu'il y a 30 jours par mois) et la partie décimale, c'est la fraction de l'heure actuelle exprimée en seconde, sur une journée entière exprimée en seconde. (86400 = 246060)

si je ne divise que par 864, je vais avoir quelque chose de supérieur a 1 et ça va me fausser le nombre entier.

J'ai quand meme testé pour voir si au moins je gagnais des décimales et si cette piste était a explorer.

j'obtiens 43257.16800000. La partie entiere est pas bonne et j'ai toujours 3 chiffres significatifs.

Merci pour ces explications précises, je comprends mieux. Je vais passer par un unsigned long.

Un unsigned long est limité à 4 294 967 295. Si c'est un nombre de secondes ça correspond en gros à une durée de l'ordre de 49 700 jours soit 136 ans. Il semble que tu prennes ta référence en 1900, ça te permet de prendre en compte des dates jusqu'en 2036 : ça ira ?

en soit je pense que ça suffirait ^^

mais je suis parti sur une piste un peu différente. Vu que je veux mon temps décimal sous forme de texte, la partie entiere et décimale peuvent etre totalement dissociées.

du coup j'ai ça,

bla=String((t1.yr-1900)*365+(t1.mon-1)*30+t1.date);
bla+=",";
bla+=String((t1.hr*3600.0+t1.min*60.0+t1.sec)/(86400.0)*100000,0);

du coup pour les dates et heures 7/4/2018 23:40:44, j'obtiens 43167,98662
Avec 5 chiffres significatifs je suis aussi précis que l'appareil sur lequel sera le logger et je ne dépasse pas la précision d'un float.

EDIT : Minuit est passé et ça a fait apparaitre un petit soucis ...
pour 8/4/2018 0:7:51 j'ai 43168,545 ... au lieu de 0.00545
mon idée n'est peut etre pas la meilleur solution ...

J'avais fait un 2e édit a mon post précédent mais ça n'a pas été pris en compte on dirait, j'ai résolu mon soucis avec un substring.

Sinon en soit j'ai pas besoin d'etre aussi précis que ton code le permet (années bissextiles etc ...) J'ai juste besoin d'etre aussi précis que l'appareil sur lequel je vais mettre le logger.

Et en regardant plusieurs fichier de cet appareil, pour tester ma fonction conversion ... je me suis rendu compte que des fois ça fonctionnait, des fois j'avais 1 ou 2 jours d'écart ... et ça dès le mois de janvier, donc c'est pas une question de nombre de jours sur février...

Et en continuant de cherche d'autres dates pour essayer de comprendre ce qui n'allait pas dans ma fonction de conversion .... je suis tombé là dessus :

1000.0000000 1000.0000000 1.0000 4403.829 0.009 1.2 1.8 -0.97 -0.083 60 0 23:59:43 42855.99820 0.0000 2017/05/31
1000.0000000 1000.0000000 1.0000 4403.828 0.011 1.2 1.8 -0.97 -0.083 60 0 00:00:48 42855.00055 0.0000 2017/06/01

Donc l'appareil sur lequel je me base n'est même pas fiable sur la conversion en temps décimale ...

Du coup comme je compte faire un programme qui communique avec le logger pour extraire les données et éviter d'avoir a sortir la carte SD a chaque fois, je vais utiliser ton code pour convertir ça lors de l’extraction, et je convertirait les dates et heures de l'appareil de la meme façon, pour pouvoir comparer.

Merci beaucoup pour ce bout de code !
On dirait que c'est la fonction utilisée par excel, j'avais essayé en vain de trouvé le calcul.