Comment convertir un float en un String

Bonjour,
Je suis un peu embeter sur des fusion de variable.

D'abord j'ai une variable String

const String request = "GET /opt/updatesql.php";
const String request_end = " HTTP/1.1";

Puis j'ai des float

float flat, flon, falt, fspeed;
unsigned long fage;
//char coordinate[8];
gps.f_get_position(&flat, &flon, &fage);

falt = gps.f_altitude();
fspeed = gps.f_speed_kmph();

Et au final, j'aiemrai avoir ceci

Serial.println(request + "?lat=" + flat + "&long=" + char(flon) + "&alt=" + char(falt) + "&speed=" + char(fspeed) + "&course=" + TinyGPS::cardinal(gps.f_course()) + "&age=" + char(fage) + request_end);

Ce qui m'affiche ceci, sur mon terminal

GET /opt/updatesql.php?lat=.&long=&alt=²&speed=&course=ENE&age= HTTP/1.

En fait toutes la valeurs de mes variable ne sont pas rpises en compte.
J'aivaois deja essayé d'autres possiblité, en supprimant le char()
expl: char(flat) => flat
mais va me génpère un message d'erreur du genre "Ambigous overload for 'operator+' in operator..."

Comment pourrais concatener des varaibles de different type?

Milles mercis

Bonjour,

la méthode utilisée généralement pour répondre à ton besoin est de passer par une chaine de caractère tampon (ou string) avant de faire l'envoi sur le port série.
La convertion d'un "float en string" est faite dans un premier temps à l'aide de la fonction sprintf dans une variable tampon (appelée "buffer" dans l'exemple). Dans un deuxième temps, cette variable tampon est transmise par le port série. et voilà !

Philoménale

Ou bien :

Serial.print(request)
Serial.print("?lat=" );
Serial.print(flat );
Serial.print("&long="); 
Serial.print(char(flon) );
Serial.print("&alt=" ); 
Serial.print(char(falt) );
Serial.print("&speed=" );
Serial.print(char(fspeed)); 
Serial.print("&course=");
Serial.print(TinyGPS::cardinal(gps.f_course()));
Serial.print("&age=");
Serial.print(char(fage));
Serial.println(request_end);

Hello merci pour vos réponses.
Je vais prendre le temps de regarder.
Une petite précision que je n'ai pas mis.

Pour le moment je test en l'imrpimant sur le terminal

 Serial.println(request + "?lat=" + &flat + "&long=" + char(flon) + "&alt=" + char(falt) + "&speed=" + char(fspeed) + "&course=" + TinyGPS::cardinal(gps.f_course()) + "&age=" + char(fage) + request_end);

mais en fait, je vais devoir tout mettre dans une variable.
Par exemple:

String package_to_send = request + "?lat=" + &flat + "&long=" + char(flon) + "&alt=" + char(falt) + "&speed=" + char(fspeed) + "&course=" + TinyGPS::cardinal(gps.f_course()) + "&age=" + char(fage) + request_end;

ou

request = request + "?lat=" + &flat + "&long=" + char(flon) + "&alt=" + char(falt) + "&speed=" + char(fspeed) + "&course=" + TinyGPS::cardinal(gps.f_course()) + "&age=" + char(fage) + request_end

Mais , en fait, request est une constant, donc je ne sais pas on peut modifier sa valeur

@Philomonale,
Puis-je te demander une exemple du bufferisation avec String?

Milles mercis à vous

Bonjour,

Caster des nombres en char* ne marchera pas (et encore heureux), utilise la méthode que te propose B@tto :wink:

Je me permet quand même d'enlever les casts, hein B@tto, c'est pas bien de faire que la moitié du boulot :wink:

Serial.print(request)
Serial.print(F("?lat="));
Serial.print(flat);
Serial.print(F("&long=")); 
Serial.print(flon);
Serial.print(F("&alt=")); 
Serial.print(falt);
Serial.print(F("&speed="));
Serial.print(fspeed); 
Serial.print(F("&course="));
Serial.print(TinyGPS::cardinal(gps.f_course()));
Serial.print(F("&age="));
Serial.print(fage);
Serial.println(request_end);

Ok, mais ce que je ne comprends pas dans la metho de Batto

C'est que je dois au final, retrouver les valeur dans cette chaine

String coords = request + "?lat=" + char(flat)  + "&long=" + char(flon) + "&alt=" + char(falt) + "&speed=" + char(fspeed) + "&course=" + TinyGPS::cardinal(gps.f_course()) + "&age=" + char(fage) + request_end;
    Serial.println(coords);

donc, comment puis-je faire un Serial.print(flat); à la place de char(flat)?

J'ai essayé d'utiliser sprintf()

    float flat, flon, falt, fspeed;
    unsigned long fage;
    gps.f_get_position(&flat, &flon, &fage);
    
    falt = gps.f_altitude();
    fspeed = gps.f_speed_kmph();
    
    Serial.println(flat);
    Serial.println(flon);
    Serial.println(falt);
    Serial.println(fspeed);
    Serial.println(TinyGPS::cardinal(gps.f_course()));
    Serial.println(fage);
    
    
    char buffer [90];
    //int n, a=5, b=3;
    Serial.println(F("******"));
    int n;
    n=sprintf (buffer, "%d plus %d is %d", flat, flon, falt, fspeed, fage);
    printf ("[%s] is the fix %a %b chars long\n",buffer,n);
    //printf ("[%s] is the fix %a chars long\n",buffer,n)
    Serial.println(F("******"));

Mais il n'y a rien qui s'affiche entre les *******

Mais c'est impératif que j'ai ceci à la fin, par exemple et je ne dois pas avoir deux décimal après la virgule, mais 6 voir plus

GET /opt/updatesql.php?lat=46.22&long=6.14&alt=407.10&speed=2.37&course=WSW&age=1103 HTTP/1.1

Suis un peu larger :~

je viens de trouver une solution avec la fonction dtostrf

char buffer [90];
    String flatAsString;
    dtostrf(flat,1,8,buffer);
    flatAsString = String(buffer);
    
    char buffer [90];
    String flonAsString;
    dtostrf(flon,1,8,buffer);
    flonAsString = String(buffer);
    
    char buffer [90];
    String faltAsString;
    dtostrf(falt,1,8,buffer);
    faltAsString = String(buffer);
    
    char buffer [90];
    String fspeedAsString;
    dtostrf(fspeed,1,8,buffer);
    fspeedAsString = String(buffer);
    
    char buffer [90];
    String fageAsString;
    dtostrf(fage,1,8,buffer);
    fageAsString = String(buffer);

String coords = request + "?lat=" + flatAsString  + "&long=" + flonAsString + "&alt=" + faltAsString + "&speed=" + fspeedAsString + "&course=" + TinyGPS::cardinal(gps.f_course()) + "&age=" + fageAsString + request_end;
    Serial.println(coords);

Simplement j'ai un souci d'optimisation concernant le buffer. Suis pas trop averti concernant les buffer.

Es-ce juste de redéclarer char buffer à chaque fois?

Comment optimeseriez-vous ce code?

Milles mercis pour vos lumières

J'aurais pu essayer avant de poser ma question

char buffer [90];
    String flatAsString;
    dtostrf(flat,1,8,buffer);
    flatAsString = String(buffer);
    
    //char buffer [90];
    String flonAsString;
    dtostrf(flon,1,8,buffer);
    flonAsString = String(buffer);
    
    //char buffer [90];
    String faltAsString;
    dtostrf(falt,1,8,buffer);
    faltAsString = String(buffer);
    
    //char buffer [90];
    String fspeedAsString;
    dtostrf(fspeed,1,8,buffer);
    fspeedAsString = String(buffer);
    
    //char buffer [90];
    String fageAsString;
    dtostrf(fage,1,8,buffer);
    fageAsString = String(buffer);

String coords = request + "?lat=" + flatAsString  + "&long=" + flonAsString + "&alt=" + faltAsString + "&speed=" + fspeedAsString + "&course=" + TinyGPS::cardinal(gps.f_course()) + "&age=" + fageAsString + request_end;
    Serial.println(coords);

Ca bug quand je redéclare..

Simplement, j'aimerais reposer la même question.
Comment puis-je obptimiser ce code?
Aussi, comment puis-je savoir que le 90 de buffer[90] n'est pas trop grop ou quel serait le minimum à mettre (50, 70, 100,300?)

Milles mercis pour vos lumières

J'ai denouveau un probleme de concatenation

J'aimerais avoir dans ma varibale String date, la date, et dans ma variable String time, l'heur

Pour cela j'ai ce code

    // Same goes for date and time
    int year;
    byte month, day, hour, minute, second, hundredths;
    gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
    // Print data and time
    Serial.print("Date: "); Serial.print(month,DEC); Serial.print("/"); 
    Serial.print(day, DEC); Serial.print("/"); Serial.print(year);
    Serial.print("  Time: "); Serial.print(hour, DEC); Serial.print(":"); 
    Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC); 
    Serial.print("."); Serial.println(hundredths, DEC);
    //Since month, day, hour, minute, second, and hundr
    
          // Print data and time
    String date = year + "-" + month + "-" + day;
    String time = hour + ":" + minute + ":" + second ;

Le problème ce trouve là (ca ne marche pas, quand je compile):

    String date = year + "-" + month + "-" + day;

Par contre, si je mets ca:

    String date = year + "-" + month;

J'ai pas d'erreur quand je compile

je pense que month est un byte et que DEC à une influance, mais je ne sais pas comment corriger pour avoir ceci, au final

String date = "2013-05-04";
String time = " 22:10:20";

ou encore mieux
String datetime ="2013-05-04 22:10:20"
:cold_sweat:

Réponse :

 String date = String(year) + "-" + String(month) + "-" + String(day);
    String time = String(hour) + ":" + String(minute) + ":" + String(second);

Le seul truc qui m'embete c'est que ca affiche

2013-5-4 22:10:10

et j'aurais préféré avoir

2013-05-04 22:10:10

Une idée?