ESR meter with Arduino

I have upgraded existing code with previous modifications to expand measurement range up to 50 Ohms and to make this ESR meter autoranging in the range of 0-50 Ohms which should be more than enough range for the ESR measurement. The code is included in the attachment and on the schematic you have to add one more PNP transistor with the same configuration as Q1 but with the 1k resistor instead of 100R (1k is for upper range measurement). Pinout in my sketch version is different in order to match my board so you will have to modify it according to your board settings.
Any comments/suggestions are welcome… (5.55 KB)

Hello everyone, and thank you for sharing your work.
I built the ESR meter using an Arduino UNO and a lcd display CDL4162-HD44780.
My version can work in two ways: with Arduino UNO connected to the board face down, and in standalone mode.
In the first case, only the bottom side of the pcb is required (single side)
I also added a function that allows me, by selecting the right value of the DUT, to know immediately if it is good or not.
BUT there is a problem: If I measure a 1ohm resistor, the reading is quite correct, but if I measure 150mohm or 75mOhm, the reading is totally wrong. :astonished:
Is there anyone who can help me? Thank you. :~




...mah: 20 days, 10 downloads, 0 replies :zipper_mouth_face:

You need to post the code you are using and the schematic of your hardware before someone can help you.

… 10 downloads of the attached .zip file with code, images, schematics and PCB design… (702 KB)

:sleeping: there anyone who has successfully measured low ohmic values??, for example 0.1 or 0.01; appropriate values ??to an ESR meter? ;)

Hi Baravantan,
To answer your last question, yes, I have measured what seem to be good values in the milliOhm range. I have a 100mOhm precision resistor and have measured many capacitors with what appears to be reasonable and repeatable results.
I took a quick look at your code and all appears to be OK with the actual calcESR routine. I didn’t look at your PCB layout so I can’t say more than that in my proto-board build I used the schematic exactly as in the original post EXCEPT that I used a 10microFarad cap and a 110Ohm resistor in the pulse circuit (47micro and 100 Ohm in the original).
I did notice in testing that the whole thing is very sensitive to the declared supply voltage and the value of this resistor. And I noticed in your code the following…

double Vin_LO = 4700; // milliVolts
uint16_t Rs_LO = 110; // Ohms

Are you actually using a 110 Ohm resistor? And is your supply voltage really only 4,7 V? Unless these (and the Vref voltage) are well defined, the calculation can be very non-linear.
Anyway, hope this helps.


Hi, Totoro, and thanks for your help! These days I've done some tests, including the correction of the parameters that you have shown me, but without solving the problem.

double vRef = 1.079; // Volts double Vin_LO = 4980; // milliVolts uint16_t Rs_LO = 99.8; // Ohms

All values ??measured with a €40 multimeter (what I have)

Considered that your ESR Meter works, surely my problem isn't in the code. I think there is a lot of work waiting for me...

Thank you again.

Totoro: Sorry, I am just a breadboard/point-to-point/proto-board type. My main need for an ESR meter is to troubleshoot old audio gear and test equipment.

Hello Totoro , I am having a hard time wrapping my head around which pins you hooked up to the 7 segment displays, can you possibly draw something quick showing pinouts? i dont want to use a lcd display, im going to make a smd version of the board and will post the results after i have a working prototype.

thanks so much!

ohh crap. :blush:

i need to take it easy on the drinking.. i think

let me guess: these are the common anodes (or cathode depending on display.) going to a transistor for each.

define PIN_DIG_0 10 // least significant digit

define PIN_DIG_1 11

define PIN_DIG_2 12

define PIN_DIG_3 13

these go to their respective pins on display..

define PIN_SEG_DP 8

define PIN_SEG_A 3

define PIN_SEG_B 2

define PIN_SEG_C 9

define PIN_SEG_D 6

define PIN_SEG_E 7

define PIN_SEG_F 4

define PIN_SEG_G 5

or do i need to stop drinking??? i think i can keep drinking. ]:D

Here is a shield I built for my Uno. It has a resolution of 0.02 Ohms. I'm currently finishing the video for the code demo/explanation on how it works.

Next I plan to simplify it a bit more and add a basic function generator on a shield designed for the Due.

I would like to thank Tim and his Visual Micro project. Using his add-in to program and debug the Arduino software made it easy.


Did anyone work on getting this to work with nF range capacitors, or to a resolution of mOhms or better?

What sort of time window is it taking to do the measurement for you guys?

Hi, is it possible in this scheme to measure the capacity of the capacitor? If so, by what formula? Thanks.

Can anyone tell me if this ESR can be used to test in circuit caps?



I built it as originally designed but to challenge myself I used all SMD components. The .1uF cap (0603) was a challenge as were the TO-23 cased transistors but it works just fine.

I used an Arduino MEGA 2560 and had to modify the code a bit. For those who have the MEGA and are using a standard 44780 2 line X 16 char LCD do the following:

LiquidCrystal lcd(6, 5, 10, 11, 12, 13);

comment out the setLEDpin lines - they dont work with this display
also analogReference(INTERNAL1V1); //setting vRef to internal reference 1.1V

INTERNAL won’t work on the MEGA - you must add the specifier “1V1” to the parameter.

This was indeed a fun project. I learned alot from building it. Thanks for sharing. Look forward to your next one.

  1. You cannot measure capacitance in-circuit.

  2. You can measure ESR, close enough for troubleshooting, in most circuits.

The key is to keep the sensing voltage below the peak voltage that could turn a semiconductor junction on, including Shottky.

  1. You cannot use the same method to measure ESR and ESL over a really wide range of capacitance.

But it doesn't really matter. Mostly it is electrolytic capacitors that fail by increasing ESR. And the values that matter are >=1uF, usually much larger.

ESR of a few ohms doesn't really matter for audio coupling capacitors, which are normally around 1uF to 10uF. For linear power supplies, ESR of a few ohms matters, but the capacitors are generally in the range of thousands of uF. For switching power supplies, ESR needs to be tenths of an ohm, but capacitance is still >>10uF.

And all those capacitors have varying amounts of parasitic inductance. But that doesn't change, so no real need to measure it. That is why a circuit will have Vcc bypassed by (in addition to the 100s or 1000s of uF of smoothing capacitor) both a 1uF and 1nF bypass capacitor.

For capacitors in the nF range, there are not really many mechanisms for ESR to increase as a failure mode. You can measure ESR as a function of circuit Q.

Baravantan: there anyone who has successfully measured low ohmic values??, for example 0.1 or 0.01; appropriate values ??to an ESR meter?

I'm working on it.

Baravantan: ... 10 downloads of the attached .zip file with code, images, schematics and PCB design...

Hallo Baravantan, in your posted listings is an function named UpCap. What is it for? If I press button at input 3, I get a display with 4,7, 6,8, 10, 15, 22 ... 10000 µF. But that is not the Value of the DUT.

To measure really low values, Kelvin leads would be a good idea.

Hi, just thought I'd say thanks for the design, I think I have got it to work, but have a few questions.

I copied the schematic in the first post, although I used a fubarino SD board (I had one lying around). This needed a couple of tweaks to remove avr-specific code (see I also used trimpots as I had no 1% resistors.

Are trimpots ok? I seem to remember they have a higher inductance than normal resistors, and I don't know whether this matters here. I have a fairly good LCR meter I used to trim the pots, so I think they are accurate to within 1%.

The fubarino SD board does not have an internal voltage reference, so I'm using the 3.3V supply (and 3.3V for everything apart from LCD power). I think this should be fine, although with less ADC precision. However, with vRef=3.31V (measured, and very stable), I need to set current to 0.02468 to get "good" results. By calculation, it should be 0.0331, a pretty big difference. When I say "good" results, I am getting correct readings to about 2% of 1ohm, 2 ohm, and 2.5ohm resistors. I have no way of testing ESR otherwise, but my results seem reasonable (my supply of caps is mostly very good, a few ones are terrible). Is my weird current value ok/is there a better way to calibrate the meter?

Thanks again :)