The precision of tha ADC of the Arduino is 10 bit, in practice the last bit may be inaccurate. That means you have approx 500 steps for 0..15 volt ==> at best 1/30 volt precission = 0,2% . Assume the resistors have an accuracy of 1% . suppose VREF has an accuracy of 2%.
Then - float carVoltage = analogRead(A0) * VREF / 1024.0 / R2 * (R1 + R2); - would give an max accumalate error of
0.2% + 2% + 0% + 1% + 1% + 1% = 5.2%
=> 15V * 5.2% = 0.8 Volt max error => so one tenth of is indeed very good.
Disclaimer not official error math, just an first order approximation.One can improve the measurement by doing the AnalogRead multiple times:
float readVoltage()
{
#define SAMPLES 3.0
float rv = 0;
for (int i=0; i< SAMPLES ; i++) rv += analogRead(A0);
rv /= SAMPLES;
return rv * 0.01576; // average of 3 reads times the calculated constant.
}
If time is not an issue one can take more samples ...