It's an awfully convoluted way of doing things but suspect your error lies in misunderstanding calculations mixing ints and floats and something screwy with your resistor bridge - It is always worth checking the bridge with a multimeter and raw voltage to verify the expectation. If you have 3v at the top of your voltage divider, you should be getting 0.9593v applied on the ADC pin which will be read as 892 against the 1.1v internal reference. The easiest way I found was to define a multiplier needed to derive the raw voltage, in this case (((R1+R2)x1.1)/R2) - For your resistor arrangement the max you can read is 3.4404v before exceeding the 1.1v internal reference. To reverse the ADC reading of 892 to raw voltage is (892x3.4404)/1023 = 2.9984 v. Perhaps this is a simpler way to do it float MULTIPLIER= (((1000+470)*1.1)/470);//Resistor bridge values in k and Vref int sensorValue = analogRead(BATTERY_SENSE_PIN); float batteryV = (sensorValue * MULTIPLIER)/1023.0; //Note the trailing decimal point on the 1023 for calculations involving floats