Go Down

Topic: Problema conversione dati (Read 933 times) previous topic - next topic

superzaffo

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

Nik_90

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?

superzaffo

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

BrainBooster

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

Nik_90

Oppure provare ad usare la funzione dtostrf()

dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);

quindi nel tuo caso ad esempio:

Code: [Select]

char temperatura[5];
float temp;

dtostrf(temp,5,1,temperatura);


E quindi poi..

Code: [Select]

Buffer += ('temperatura');

BrainBooster

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

superzaffo

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 ....

BrainBooster

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.

superzaffo

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

BrainBooster

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 :)

superzaffo

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.  :smiley-zipper:

superzaffo

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.

Code: [Select]

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

lesto

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 :)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up