Problema conversione dati

Ciao a tutti, mi si è presentato un problema, che non essendo ancora molto pratico del ide di arduino, mi lascia un po' perplesso.
Ho un sensore umidità e temperatura (DH22) che mi da dei dati in float

float h = dht.readHumidity(); // Legge umidità da DHT
float t = dht.readTemperature(); // Legge temperatura da DHT

Io però devo creare una string Buffer, per scriverla poi in un botto su file sd.

Buffer += (now.day());
Buffer += ('-');
Buffer += (now.month());
Buffer += ('-');
Buffer += (now.year());
Buffer += (',');
Buffer += (now.hour());
Buffer += (':');
Buffer += (now.minute());
Buffer += (':');
Buffer += (now.second());
Buffer += (',');
Buffer += (t, DEC);
Buffer += (',');
Buffer += (h, DEC);
Buffer += (',');
Buffer += (valLux1);

Però alla fine la temperatura e umidità mi risultano nel file sempre con lo ctesso valore e cioè 10 e 1
Come mai ?
Se tolgo il DEC allora non riesco a compilare.

Mi potete aiutare ?
Grazie

Ciao, ti sei assicurato prima stampando su seriale le due variabili h e t se non restituiscono proprio di loro sempre 10 e 1 e quindi il problema sta nella lettura dei 2 sensori?

Certo.. i dati li "stampo" anche su un display.
Se faccio un Serial.print(t, DEC) funziona... se scrivo su file con .print funziona, non funziona la conversione da float a string... o meglio... non riesco io a farla funzonare.

Grazie

prova con
Serial.print(t, 2)
2 sta per 2 decimali

Oppure provare ad usare la funzione dtostrf()

dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);

quindi nel tuo caso ad esempio:

char temperatura[5];
float temp;

dtostrf(temp,5,1,temperatura);

E quindi poi..

Buffer += ('temperatura');

segui il consiglio di Nik_90 se devi usare il valore ottenuto per successive elaborazioni oltre che stamparlo sulla seriale

Sicuramente proverò... ma mi potete spiegare la funzione ?
Ma per convertire in string un numero float, non cè una funzione semplice.
Il serial.print funziona in qualsialsi modo.... non è possibile fare una cosa del genere Buffer += Serial.print(t) ? Un po' assurdo lo so.. ma ....

la libreria della gestione della seriale comprende quello che fà dtostrf ma il metodo non è disponibile mentre usando direttamente dtostrf fai la stessa cosa senza complicatri tanto la vita.

Ahh ok grazie.. allora questa sera provo.
Ma mi sembra strano che devo fare funzioni simili per fare una conversione float to string.

Grazie ancora

bè se pensi che il linguaggio C non ha implicito il concetto di stringa e che i numeri float per arduino sono un pò "magia nera" allora non sembra più così strano :slight_smile:

Si.. capisco.. infatti per il C una stringa è un array di char... =(
Vi aggiorno questa sera.. ma se qualcuno ha qualche altra idea.. è benvenuta..
Non vorrey fare tanti myfile.print() per scrivere una semplice stringa composta da dei dati. :zipper_mouth_face:

Grazie a tutti, ho risolto il problema con le info che mi avete dato, ma passando per delle variabili come mi avevate suggerito mi usciva una strnga strana. Quindi ho dovuto modificare il codice in questo modo.

Buffer += (now.day());
Buffer += ('-');
Buffer += (now.month());
Buffer += ('-');
Buffer += (now.year());
Buffer += (',');
Buffer += (now.hour());
Buffer += (':');
Buffer += (now.minute());
Buffer += (':');
Buffer += (now.second());
Buffer += (',');
Buffer += dtostrf(t,3,2,s);
Buffer += (',');
Buffer += dtostrf(h,3,2,s);
Buffer += (',');
Buffer += dtostrf(valLux1,3,2,s);

Grazie ancora

su Buffer è un oggetto, puoi aggiungere un metodo overloadato di +=, che se riceve una stringa fa il dtostrf dei dati.

il sistema dei metodi overloadati è lo stesso sistema che usa la print :slight_smile: