Pages: [1]   Go Down
Author Topic: Problema conversione dati  (Read 833 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 2
Posts: 555
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Montalbano Jonico
Offline Offline
Sr. Member
****
Karma: 1
Posts: 287
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
God Member
*****
Karma: 2
Posts: 555
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Montalbano Jonico
Offline Offline
Sr. Member
****
Karma: 1
Posts: 287
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oppure provare ad usare la funzione dtostrf()

dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);

quindi nel tuo caso ad esempio:

Code:
char temperatura[5];
float temp;

dtostrf(temp,5,1,temperatura);

E quindi poi..

Code:
Buffer += ('temperatura');
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
God Member
*****
Karma: 2
Posts: 555
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
God Member
*****
Karma: 2
Posts: 555
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

Offline Offline
God Member
*****
Karma: 2
Posts: 555
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si.. capisco.. infatti per il C una stringa è un array di char...  smiley-cry
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
Logged

Offline Offline
God Member
*****
Karma: 2
Posts: 555
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Shannon Member
****
Karma: 136
Posts: 10525
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1]   Go Up
Jump to: