Resistance measurement for 2 decimal points precise with Arduino

is it possible to get a precise resistivity values for 2 decimal points in 1 to 1k ohm range. I have tried with other resistor techniques but doesn't found a suitable method. I think the reason behind this error is the current consumption of the Arduino in analog pin. Any kind of help is much appreciated.

The A/D has not got enough bits for that.

No the analogue pin consumes almost no current at all.

1 Like

Then why the voltage divider circuit doesnt give the perfect or at least near precise values to the arduino.

But it does. Why do you think it does not?
Please show a schematic of your circuit, say what you expect and say what you get.

1 Like

just a ordinary voltage divider.
code is.

float a,b,r;

void setup() {
  // put your setup code here, to run once:

void loop() {
 // put your main code here, to run repeatedly:

  a = analogRead(A1);    // read the value from the sensor
  b =(a/1023)*3.3;
  r = (330*b)/(3.3-b);
  Serial.print( "resistivity =  ");

No wonder your drawing to much current, If RX resistor was 1ohm you would get 0.01V out and a lot of current draw. I would say you need to use either a 10K or 6.8K(you could use higher value) for RX resistor and Resistor value unknown goes where the 330R resistor is.

And I would use a 16Bit ADC rather than the uno 10Bit ADC means your measuring from 1R to 1K the voltage increments are small and 10bit would not be good enough

1 Like

Yes - but not like that.

You dont say which arduino you are using. Lets suppose its a 3.3V model with a linear ADC that can resolve to 1/1024

b is your voltage reading in Volts. (incidentally you should multiply before dividing)

If your resistor is 1k you will get 1000 times 3.3 / 1330 = 2.48V out.
You can measure that to 2 sig figs.

If your resistor is 1 ohm you will get 1 times 3.3 / 331 = 10mV out - you cant measure that at all.

1 Like

Ok sir, i will try it. thank you for the response.

is there any suggestion for a new method sir.

One decimal place: I'd say maybe. Two decimal places: very unlikely. One problem is the ADC resolution, the other problem is the tolerance of the components you use themselves. With regular resistors, the resistance drift versus temperature will probably be higher than the accuracy you want to obtain.

All in all, "2 decimal places" is a little vague: the accuracy is better expressed in percentage of the measurement. For high precision, an arduino is out of the question, and even a good handheld multimeter is probably not enough: you'll need a benchtop instrument of hefty weight and cost.

If this is for a one-off project, you'll be better served if you buy some precision resistors. They may cost 100 or 1000 times more than regular 5% resistors, but still much less than an instrument capable of telling them apart. A ±0.1% tolerance is more than plenty and the price is still reasonable. Above that, the wires themselves become influent and you'll need very careful engineering to take tiny tolerances into account.

1 Like

So in other words it is less possible right. any other design methods sir. thank you

Perhaps multirange, switching in different resistor values. However measuring low value resisitors accurately is tricky. Do you really need to measure a 1 ohm resistor accurately to 10 milliohms?

1 Like

lets limit range to 50 ohm to 800 ohm. can we do this

No that is wrong. The 330R resistor would limit the current flow through the Rx resistor. You would not get excess current flowing anywhere.

@ravirulz you did not say that bit, which is very important.

You would need a 20 bit or more A/D converter to get the accuracy you need. Getting that in such a noisy environment like a microprocessor environment is going to be hard. You can’t just throw components on a bread board to do this. You would need a PCB and the skill to produce a good layout. The fact that you are having to ask these questions shows you do not have these skills yet.

Better than an A/D would be a four and a half digit DVM chip, these use the much slower dual ramp method.

No, you have not been understanding what you have been told. Although sadly we had a rouge misinformation post.

The use of high precision resistors is vital in getting any accuracy at all.

You are not measuring resistivity you are measuring resistance. Resistivity is measured in ohms per unit distance.

1 Like

Might be better having a current source supplying your test resistor . If the current source was control by the Arduino , then you could alter it to suit different resistor ranges and get better range.

You need to use internal reference voltage and calibrate it !

Have a think about the maths for this, you’d need a higher current to measure a lower value resistor to get enough voltage drop

1 Like

And always the "XY problem". :grin:

Why would you want to "measure a resistance value for 2 decimal points in 1 to 1k ohm range"?


A very good point ….

1 Like

It is not possible with an Arduino internal A/D.

If we assume:

  • The series resistor (330 ohms or whatever) has 0 error. i.e. we know exactly its value.
  • As the resistors heat up there is not change in resistance due to temperature.
  • You have the full 1024 steps (which you don't, you will be limited to about 1/2 the steps)

at 50 ohms and 330 ohms and 3.3Volts.

Vx = 3.3 * 50 /(50 + 330) = 0.434210526
Vx+2digits = 3.3*50.01/ (50.01+330) = 0.43428594

the delta v for 2 decimal places = 0.0000754135

One step of the A/D converter = .003222656

So the Arduino falls short by 2 orders of magnitude....not even close

1 Like

If you are really concerned about ultimate accuracy, this should be 'b =(a/1024)*3.3;', and your 3.3V voltage source has to be accurate to at least 0.1%.

Also you didn't implement the math for the voltage divider at all.

1 Like