question avec sprintf

Salut à tous,

Je suis en train de faire un morceaux de code avec un shield GPS.

Je capture la latitude et la longitude et je la stock dans un double et je voudrais les mettres dans un char[]. Je fais donc un sprintf mais il marche pas comme je veux.

J'ai trouvé un bout de code et quand je fais un :

Serial.println(lat,7);

Il m'affiche la bonne latitude, j'ai :
Lat:45.5249710

mais quand je fais un

sprintf(url,"latitude=%ld;longitude=%ld,", (double)lat, (double)lon);
Serial.println(url);

l'affichage retourné est pas bon, j'ai :

latitude=1110841746;longitude=1082887390

En fait je ne comprendre pas le paramètre "7", on met normalement le format d'affichage?

Merci de votre aide.

%ld = entier long
si tu veux du virgule flottante, c'est %f ou %g
-> printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s - cppreference.com

j'ai des point d'intérogation à la place. Normal je pense car ce sont des double

oui mais mon problème c'est que je fais un sprintf() pour ensuite stocker la variable sur une carte SD.

j'ai essayé, mais comme je disais, il me mets des point d'interrogation à la place :

latitude=?;longitude=?

alors qu'avec Serial.print( lat, 7 ); aucun problème.

Je viens de faire un test tt bête avec ce code minimaliste et j'ai bien les points d'interrogation en sortie ... :

void setup(){

    Serial.begin(9600);   

}
void loop(){
char url[100];
double lat=0;
double lon=0;
  
lat=45.98879;
lon=4.476638;

   sprintf(url,"latitude=%.7f;longitude=%.7f,", lat, lon);
   Serial.println(url);
   
  delay(5000);

}

affichage :

latitude=?;longitude=?,
latitude=?;longitude=?,
latitude=?;longitude=?,
latitude=?;longitude=?,
latitude=?;longitude=?,
latitude=?;longitude=?,
latitude=?;longitude=?,
latitude=?;longitude=?,
latitude=?;longitude=?,
latitude=?;longitude=?,
latitude=?;longitude=?,
latitude=?;longitude=?,
latitude=?;longitude=?,

Si vous avez une idée ? :frowning:

Merci encore de votre aide.

Bonjour,
Enlève les . devant 7f

même problème.

affichage :

latitude=      ?;longitude=      ?,
latitude=      ?;longitude=      ?,
latitude=      ?;longitude=      ?,

Merci

je vais passer par des entier je pense :wink: avec un modulo.

C'est le mieux je pense non?

Pas de bug c'est normal.

sprintf() ne prend pas les float en charge sur Arduino, pour la simple raison que cette prise en charge inclurait des librairies qui occuperait plus de 15 ko de mémoire ...

Il faut soit jouer "manuellement", en récupérant la partie entière, puis la soustraire au nombre d'origine, envoyer un '.' puis multiplié ce qui reste par le nombre de chiffre après la virgule souhaitée et envoyer.

Sinon essaye dtostrf(), mais attention il met des espaces devant le nombre si tu as pris un emplacement trop large.

J'ai justement bosser sur ce sujet ce week end (envoi de coordonnées GPS sur un serveur), les espaces rajoutés faisait tout planter