convertire in float

buongiorno a tutti,sto usando il voltmetro segreto di arduino, ma esso mi restituisce il valore in millivolt
ho provato a dividerlo a /1000 ma non e' il modo corretto.come si fa per convertirlo in un float con 2 decimali?
grazie del vostro aiuto

long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}
void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.println( readVcc(), DEC );
  delay(1000);
}

A te in che unità di misura interessa il valore e con quanti decimali ? ? ?

Se prendi i millivolt dividi per 1000 hai il valore in Volt con il massimo di decimali che il sistema è in grado di darti.

Ti rammento che su Arduino i float sono a 32 bit e i valori con un discreto arrotondamento ...

Io lascerai stare i float e giocherei con i long (che sono numeri interi) facendo divisioni intere e sottrazioni :wink:

Guglielmo

Scusa, ma quel valore è definito come "long" ossia un intero 32 bit, come pensi di avere un valore decimale dividendolo per 1000? Devi convertirlo in float, ad esempio per avere 2 decimali:

void loop() {
  float volt = (float)readVcc()/1000.0;
  Serial.println(volt, 2);
  delay(1000);
}

... ripeto che, fino a quando è possibile, è molto meglio e più precisio lasciar stare i float (lenti e imprecisi) e lavorare sul long ...
... con poche operazioni sui numeri interi ricavi la parte intera e la parte decimale con la precisione che ti occorre :smiley:

Guglielmo

gpb01:
Ti rammento che su Arduino i float sono a 32 bit e i valori con un discreto arrotondamento ...

Si, certo, ma immagino che le (circa) 6-7 cifre significative dei float siano sufficienti per ciò che deve farci (se misura in millivolt diciamo che avrà 4 o 5 cifre significative).

L'alternativa è prendere il valore e "segarlo" in due:

  long Vcc = readVcc();
  int V = Vcc/1000;
  int mV = Vcc - V*1000;
  Serial.print(V);
  Serial.print(",");
  Serial.println(mV);

grazie delle vostre risposte,a me basta avere 2 decimali, che mi occorrono per avere una tensione di riferimento,
si e' vero ho notato che le float arrotondano, ma per l uso che mi serve vanno piu' che bene, e solo per sapere se la batteria e' carica

Considera pure che l'ADC di Arduino Uno è a 10 bit, perciò ha una risoluzione di 1/1024, quindi non puoi ottenere una granularità, un passo minore dello 0,1%.

penso che per visualizzare una tensione di una batteria che ,a sua volta ti dice se devi caricarla, penso che sia anche troppo precisa,
grazie ancora dell'vostro aiuto
buona serata