Float and unsigned long convertite in string… come?

Sto lavoricchiando per inviare i dati dei miei sensori a thingspeak, ma c'è una cosa assai ostica.
I valori devono essere convertiti in stringa prima di essere inviati e non so come convertire in stringa le float e l'unsigned long.
L'int me la cavo, grazie agli esempi sul sito, ma oltre a quello boh... so che forse dovrei usare sprintf ma io ed il C siamo ancora al primo appuntamento, dobbiamo conoscerci meglio -_-'

Anyway:
Ho queste 8 variabili

  float toutES; // tout DHT
  float houtES; // rh out DHT
  float tinES; // tin DHT
  float hinES; // rh in DHT
  float T1ES; // h20
  float T2ES; // hot
  unsigned long mediaHzES; // media dei valori di luce dall'ultimo log
  int statusSSRES; //status

Che devo convertire in una stringa di questo tipo (senza le parentesi ovviamente):

field1=(toutES)&field2=(houtES)&field3=(tinES)&field4=(hinES)&field5=(T1ES)&field6=(T2ES)&field7=(mediaHzES)&field8=(statusSSRES)

Tout, tin , t1 e t2 sono valori di temperatura in °C quindi mi andrebbe benissimissimo un solo decimale dopo la virgola.
hin ed hout sono valori di umità, anche qui un solo decimale dopo la virgola sarebbe ottimo.
mediaHz varia da 0 a 69mila e qualcosa...
status vale o 0 d 1 ed al momento è l'unico che so convertire :stuck_out_tongue:

Potete darmi una mano?

ltoa (per i long)
ftoa(per i float)
dtostrf o sprintf se hai spazio ...

BrainBooster:
ltoa (per i long)
ftoa(per i float)
dtostrf o sprintf se hai spazio ...

La ftoa() non è una funzione standard del C, su Arduino puoi usare la dtostrf() .

p.s.
Su Arduino non è possibile usare la sprintf() per convertire in stringa i float, semplicemente non funziona.

Io utilizzo questo sistema:
Devi inviare per esempio il numero 25,67.

float toutES=25,67*100; //un float che vale 2567.
int pass=(int) toutES; //Lo converti in int.

Lo invii come int o visto che non hai problemi a
convertirlo in string lo invii come string.

Chi riceve avrà il numero ricevuto=2567

float ricevo= (float) ricevuto/100; Lo riconverti in float con 2 decimali.
A questo punto avrai un float che vale 25,67

Ciao.
Spero che ti possa servire.

Ciao.

astrobeed:
La ftoa() non è una funzione standard del C, su Arduino puoi usare la dtostrf() .

Ok, andiamo per gradi.
Ho iniziato a costruire la stringa e per ora ci sono e funziona. Ho messo dentro l'unsigned long con ltoa e l'int con itoa.

    /*----- ThingSpeak -----*/
    char charbufferluce[7]; //luce
    char charbufferssr[2]; // SSR
    ltoa(mydata.mediaHzES,charbufferluce,10);
    itoa(mydata.statusSSRES,charbufferssr,10);

    char stringaTs[16] = "1=";  // Field 1
    strcat(stringaTs, charbufferluce);
    strcat(stringaTs, "&2=");   // Field 2
    strcat(stringaTs, charbufferssr); 

    updateThingSpeak(stringaTs);

dtostrf invece proprio non la capisco (non ho basi di C) se mi fate un esempio pratico ve ne sarei grata :slight_smile:

@carletto il tuo consiglio è buono, se avessi il controllo su entrambi i lati della comunicazione avrei fatto anche io così... purtroppo però invio i dati a thingspeak (una cosa come pachube) un host per il datalogging che non mi permette di fare un operazione simile sul dato ricevuto.

Ok, ci sono riuscita :slight_smile:
L'unica cosa, se vi va, datemi un occhiata alle dimensioni dei buffer per verificare che siano adeguate...
considerato che i valori di temperatura possono andare in negativo tipo -12.4.

 /*----- ThingSpeak -----*/
    char charbufferluce[7]; //luce
    char charbufferssr[2]; // SSR
    char charbufferT2[5]; // T2
    ltoa(mydata.mediaHzES,charbufferluce,10);
    itoa(mydata.statusSSRES,charbufferssr,10);
    dtostrf(mydata.T2ES,4,1,charbufferT2);

    char stringaTs[16] = "1=";  // Field 1
    strcat(stringaTs, charbufferluce);
    strcat(stringaTs, "&3=");   // Field 3
    strcat(stringaTs, charbufferssr); 
    strcat(stringaTs, "&4=");   // Field 4
    strcat(stringaTs, charbufferT2);

    updateThingSpeak(stringaTs);

con questo ottengo un invio di questo tipo:

1=3123&3=0&4=23.8