# Reverse ADC for voltage

I understand when I read the voltage on an input pin the ADC converts it to a number between 0-1023. (and how this makes it a digital representation of the infinite number of possible analog inputs)

Can someone help me understand how to reverse this to get the voltage value? 1023 = 5.0 0 = 0.0 etc.

figure it out, had to modify the map function to return a float. This will give you the voltage on an analog input

void loop()
{

float val = fmap(raw, 0, 1023, 0.0, 5.0);
Serial.println(val); //voltage
delay(1000);
}

float fmap(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;
}

``````int value;
float voltage;

Setup()
{}

void loop()
{
voltage = (value  * 5.0) / 1023;
Serial.println(value, 3);
delay(1000);
}
``````

also…

``````map(raw,0,1023,0,50)/10.0;
``````

@robtillaart's code has a bug...

``````Serial.println(value, 3);
``````

This line should be...

``````Serial.println(voltage, 3);
``````

Thanx James, you are right It may seem a minor point, but we might as well get it as close as we can.

The calculation for Vin is given by

`Vin = (ADC_reading * Vref) / 1024.0`

The denominator is 1024, not 1023.

The voltage indicated by a full scale reading (1023 decimal = 0x3ff hex) is one LSB less than Vref.

Regards,

Dave