Ciao a tutti!
Premetto che ho trovato sul forum un argomento simile, ma non riesco a capire la sua logica di funzionamento.
La faccio ultra semplice: su mkr1010 in ambiente IoT, c'è la possibilità di impostare il valore float di lettura tensione della batteria lipo esterna, con un singolo valore decimale? Utilizzando un analogread su ADC Battery, lo moltiplico per (4.2 / 1024).
Il risultato in seriale è corretto, ed è praticamente di valore identico al volere che leggo sul multimetro, ad esempio 4.1 volt.
Il problema però lo trovo nello stesso valore float in ambiente Cloud di Arduino, con un risultato tipo 4.014.
C'è la possibilità di trasformare questo valore float con un singolo decimale?
Senza il tuo codice non è che ti si possa dire molto, ma "trasformare questo valore float con un singolo decimale" può significare o che vuoi fare un arrotondamento numerico o che è la sua rappresentazione (o conversione in stringa).
Per l'arrotondamento numerico ti basterebbe moltiplicare per 10, prendere la parte intera, e poi dividere per 10.
Per la rappresentazione, dipende da cosa usi. Se è una stringa, puoi usare sprintf() ad esempio. Ma se posti il tuo codice facciamo prima.
il valore iniziale "x" viene sì moltiplicato per 10 e presa la parte intera, ma poi la divisione per 10 sarà sempre intera per cui ti perdi i decimali anche se poi il risultato lo metti in un float. Ad esempio se "x" valesse 1.2345, int(x*10) viene 12, e dividendo l'intero 12/10 otterresti 1 ossia quando converte in float (col cast implicito) avrai 1.0.
Basta quindi forzare in float la divisione per 10:
Ciao e grazie delle risposte! Purtroppo sono fuori casa e non riesco a copiare/incollare correttamente il codice dall'idea Cloud. Stasera provo a fare queste correzioni consigliate e nel caso comunque posto anche il codice. Grazie!
Non stai tendo conto di una cosa. Quando stampi il valore di una variabile float con Serial, la classe Serial fa di default la stampa a 2 decimali.
"Serial.print() - Arduino Reference"
Leggi la parte "An optional second parameter..."
come indicato da docdoc nel post#4, quando lavoro con i float/double, se ho delle costanti preferisco sempre aggiugere il decimale nei calcoli, anche .0 per forzare il compilatore a lavorare con decimali
Allora, ecco svelato il mistero del perché sulla seriale leggo correttamente il valore con un solo decimale dopo la virgola. Grazie delle delucidazioni!
in fase iniziale, il sensorebatt è int, mentre invece volt e batteria sono float. Ho provato velocemente ad inserire la formula float a = int(x*10)/10.0; ma sulla dashboard di arduino cloud, il valore dei volt ad esempio anzichè essere 3.742, è diventato 3.700. A questo punto non so se si tratta di un limite del widget della dashboard di arduino cloud o meno.
Edit: ho risolto! La dashboard su desktop legge il valore di volt finale 3.700. sulla stessa dashboard nell'app su telefono scrive correttamente 3.7! Ottimo!