Errore arrotondamento float

Sto provando a leggere una tensione da un ingresso analogico, utilizzo questo codice:

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
float v = map(analogRead(A0),0,1023,0,9.8);
Serial.println(v); 
}

Non ho un problema di cifre stampate a schermo, dato che mi viene dato come risultato: "6.00".

Il problema è che per qualche motivo vengono "arrotondati" i calcoli e mi trovo risultati come 6.00 o come 7.00 (il risultato reale è 7.5 circa, misurato con tester).

Utilizzo un arduino nano.

EDIT:
un altro errore strano è che senza collegare niente nel pin analogico misuro comunque un input di circa 300 su 1023 (oscilla molto rapidamente).

Ho provato diversi pin ma non cambia nulla.

checcoc:
... un altro errore strano è che senza collegare niente nel pin analogico misuro comunque un input di circa 300 su 1023 (oscilla molto rapidamente).

Nessun errore, è più che normale e, se cerchi sul forum, ne abbiamo parlato decine e decine di volte ...
... i pin di Arduino sono ad altissima impedenza e NON possono essere lasciati aperti dato che captano qualsiasi disturbo sia nell'aria. Gli analogici danno numeri a caso, i digitali oscillano tra LOW ed HIGH ... quindi, o NON si usano, o se si usano, DEVONO essere collegati a qualche cosa e mai lasciati aperti.

Guglielmo

TU invece stai facendo un errore ed evidentemente NON hai studiato il reference della map() che dice chiaramente:

The map() function uses integer math so will not generate fractions, when the math might indicate that it should do so. Fractional remainders are truncated, and are not rounded or averaged.

... quindi, SOLO numeri interi e niente numeri con decimali (... che vengono troncati e nemmeno arrotondati).

Guglielmo

Bene, risolto grazie mille !! :smiley:

Questa è la map()

long map(long x, long in_min, long in_max, long out_min, long out_max)
{ return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

ti puoi creare una tua map con i float (cambiagli nome, esempio mapf)

float mapf(float x, float in_min, float in_max, float out_min, float out_max)
{ return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

...ma se moltiplichi per 9,8 e dividi per 1023 fai prima!
Se dividi per 104, fai prima ancora! :slight_smile:
Senza float, se ti basta un decimale, dividi per 10,4: il risultato è in decimi di volt, che potrai visualizzare separando la cifra a destra mediante la virgola. Se vuoi anche fare l'approssimazione corretta, dopo aver diviso per 10,4 somma 0,5: la variabile intera prenderà solo la parte intera, che è approssimata.