Milliohm Meter




About: DIY in general and electronics enthusiast.

This is an accurate milliohm meter with a maximum resolution of 0.1mOhm. The design is very simple, the whole assembly can be built in a couple of hours once all the parts are gathered. It is based on a precision current sink and a high-resolution ADC controlled by an Arduino Nano V3. It uses a Kelvin connection with the resistor under test to exclude the resistance of test leads from the measurements.

It can be very useful for measuring small resistors and the resistance of PCB traces, motor coils, inductance coils, transformer coils, or calculate the length of wires.

Measurement ranges:

  • Scale 0m1: 0.1mOhm to 12.9999 Ohm.
  • Scale 1m0: 1mOhm to 129.999 Ohm.
  • Scale 10m: 10mOhm to 1299.99 Ohm.

Calibration kit video:

Step 1: Parts and Wiring Diagram

  • The file WiringAndParts.pdf attached to this step shows all the parts of the milliohm meter with the buying link, and how to connect them.
  • The main circuit (1) contains the Arduino Nano and the rest of the electronics. This circuit has been designed by me and can't be purchased, but it is fully described in following steps.
  • The power comes from a wall adapter (D) that is connected directly to the 2.1mm power jack female socket (2).
  • The 2x16 display (3) shows the current scale set and the value of the resistor under test. It is connected using the I2C bus.
  • The binding posts/banana jacks (4) connect the circuit to the test clips (B).
  • There are two pushbuttons (5). The black one is connected to the “SEL” connector. When this button is pressed the scale change. The red one is connected to “CAL”. When this button is pressed the meter enters in HOLD MODE.
  • All the parts are contained in an orange Hammond 1590B aluminum box (A).

Step 2: Circuit Design and Schematic

  • Most of the parts in the circuit can be ordered at
  • IC4 is an LT3092 precision current source/sink. The SET pin produces a precise current of 10uA. R10 and R11 are 0.1% precision resistances arranged in parallel that form a value of 15623ohm, this leads to a SET voltage of 0.156V. The resistance between OUT and SET program the output current, in this case, there are three resistors R12, R13 and R14 that can be enabled or disabled by MOSFET transistors.
  • Enabling R12 (1ohm) the output current will be 156mA, enabling R13 (10ohm) the output current will be 15.6mA and enabling R14 (100ohm) the output current will be 1.56mA. T1 has less than 1mOhm of RDSon, that is less than 0.1% of the value of R12. T2 and T3 have 20mOhm of RDSon that is a very small value relative to R13 and R14.
  • IC4 could have worked as source or sink, but in this case, the sink mode is better because it makes it easier to have a higher gate voltage for T1, T2, and T3.
  • T1, T2, and T3 are driven directly by the supply voltage through a ULN2003 (IC3) I have chosen this IC because it is very simple and it actually requires less space in the board than discrete transistors, also, there is no need for fast switching the MOSFETs in this circuit.
  • R15 is a 250mA resettable fuse that avoids the 5V rail to be destroyed if accidentally the + lead touches the circuit's GND.
  • D3 and D4 are TVS that protect the circuit against static discharges from test leads.
  • C3, R16, and R17 form a 30Hz filter.
  • J5-1 (+), J5-2 (S+), J5-3 (S-), and J5-4 (-), are wired to the binding posts and form the Kelvin connection with the resistance under test.
  • IC2 is an MCP3422A0 I2C ADC. It has an internal voltage reference of 2.048V, a selectable voltage gain of 1, 2, 4, or 8V/V and a selectable number of 12, 14, 16 or 18bits. In this circuit, only the channel 1 of IC2 is used, and it is connected differentially to the R under test "S+ S-". The MCP3422 is configured as 18bit but as S+ is always going to be greater than S-, the effective resolution is 17bit.
  • With T1 on, T2 off, and T3 off, the current through the resistance under test is 156mA. With this current, each 1/10 milliohm will result in a voltage of 15.6uV, this value is exactly one LSB of the ADC (IC2). In the other two scales the situation is the same, but multiplying by 10 or 100.
  • The I2C bus is shared between IC2 and the external display. The external display is connected and powered using J3.
  • J4 is connected to a panel 2.1 power jack with 12V. D1 is a TVS to prevent damages from static discharges. D2 is just for protecting reverse polarity. D1 and D2 are bigger than the necessary but I've used them because I already have these parts around.
  • J1 connects the SCALE push button.
  • J2 connects the HOLD push button.

Step 3: Circuit PCB

  • I have used the free version of Eagle for both the schematic and the PCB. The PCB is 1.6 thick double-sided design.
  • The traces between IC4(SET), R12, T1, and IC4(OUT) are as short as possible. IC4(OUT) is soldered to a big copper area on both sides of the PCB, to meet the power dissipation requirements of IC4.
  • One failure in the design is that the 5V regulator of the Arduino Nano gets too hot with the maximum 200mA current it provides in the 0.1mOhm scale, it works but a separated regulator would have been better.
  • I am posting the following files: Gerber files: And the BOM(Bill Of Materials) + assembly guide: BOM_Assemby.pdf.
  • I ordered the PCB to PCBWay ( This time I have ordered the boards using the standard "ePacket" shipping method, the shipping time was higher but the price was significantly lower, $14 for 10 boards that arrived in two weeks and a half.

Step 4: Circuit Assembling

Most of the parts are SMT on this board. They can be assembled with a regular soldering iron, fine-tip tweezers, some solder wick, and a 0.02 solder.

  • Sort the parts.
  • Start soldering smaller parts.
  • Use solder wick to solder IC3.
  • In the case of IC4, solder first the leads and then, the thermal pad.
  • Assemble the rest of the THT parts and cut the leads.

Step 5: Box Lid Machining

I have attached an Inkscape file with the stencil: frontPanel.svg.

  • Cut the stencil.
  • Cover the panel with painter tape.
  • Glue the stencil to the painter tape. I have used a glue stick.
  • Mark the position of drills.
  • Drill holes to allow the fret saw or coping saw blade get into the internal cuts.
  • Cut all the shapes.
  • Trim with files.
  • Remove the stencil and the painter tape.

Step 6: Box Body Machining

  • Mark the position of the holes for the circuit spacers (screws).
  • Center punch the holes.
  • Drill the holes of the circuit spacers.
  • Countersink the holes of the circuit spacers on the bottom of the box.
  • Mark the position of the 2.1-panel jack.
  • Drill first a small hole and then a bigger one.
  • Trim to size with a file.
  • Soften the edges.

Step 7: Lid / Front Panel Assembly

  • Cut the leads of pushbuttons and the bolts of the banana connectors to avoid them touching the circuit.
  • Install the LCD using double-sided tape.
  • Build the cable-Molex connectors assemblies and solder the wires to the parts of the panel.

Step 8: Final Assembly

Step 9: Arduino Code

Step 10: Misc.

The Kelvin Leads I have purchased on eBay came with the nozzle springs a little bit loose and didn't make a good contact. I applied solder to fix it.

Step 11: Updates

  • In order to update the code easily, I have done a hole facing the mini USB connector of the Arduino.
  • I added a new mode for measuring uV as requested by schabanow, the Arduino code is attached to this step. To enter into this mode it is necessary to press the two buttons for ~2sec. It is necessary also to shortcut the +5V output (red) with the S+ input. To return to normal mode it is necessary to press the RUN button again. Here is a video showing how it works:

Arduino Contest 2017

Participated in the
Arduino Contest 2017

2 People Made This Project!


  • Classroom Science Contest

    Classroom Science Contest
  • Beauty Tips Contest

    Beauty Tips Contest
  • Planter Challenge

    Planter Challenge

50 Discussions


2 months ago on Step 9

Hi guys just a question. How can I buy this complete builded and tested milli ohmeter ? I'm not exactly expert on build this kind of circuits :( but I need one. It could be even without enclosure.
Thank You and Happy Easter Everybody !


6 months ago

I draw my board with marker pen. On bottom I soldered an 1117s voltage regulator, following your recommendations.

2 replies

Reply 6 months ago

You're welcome, now I must try to make an kelvin clips, because in my country they are extremely rare and very expensive


6 months ago

Thank you for that project, danielrp. It took me a month to build.


Question 1 year ago

Hi W00dman62,

I added a 7805 regulator screwed to the case, and also an LM61 to monitor the temperature inside the case (see photo). Unfortunately, I have not made a second version of the board yet. I have made the auto range feature and also a calibration kit (for being more precise with higher resistance values), but I need more time to finish it completely and to publish it.




Question 1 year ago on Step 11


I ordered the boards as you suggested and got them yesterday. They look great. Did you ever do an update or is it a new Instructable with the auto range feature? If so did you include the +5V seperate regulator in the drawing? I really like this project and am going to build some for gifts for my friends. Could you send me the original Eagle files or can I just use the ones in the article? I want to load them into Eagle to see how it all works?




1 year ago

Bonjour , votre projet et formidable j ai enfin tous en ma possession.Par contre lorsque je veux compilé le firmware j ai ce message d erreur :/

soft arduino 1.8.4

Merci d avance

google trad

Hello, your project and great j finally have all in my possession.By against when I want to compile the firmware j have this error message: /

soft arduino 1.8.4

Thank you in advance

mOhmMeter:120: error: 'POSITIVE' was not declared in this scope

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity (As descrived in the ebay link but with 0x3F address instead of 0x20)


Utilisation de la bibliothèque Wire version 1.0 dans le dossier: C:\Users\Lenovo\AppData\Local\Arduino15\packages\MightyCore\hardware\avr\1.0.8\libraries\Wire

Utilisation de la bibliothèque LiquidCrystal_I2C-1.1.2 version 1.1.2 dans le dossier: C:\Users\Lenovo\Documents\Arduino\libraries\LiquidCrystal_I2C-1.1.2

Utilisation de la bibliothèque EEPROM version 2.0 dans le dossier: C:\Users\Lenovo\AppData\Local\Arduino15\packages\MightyCore\hardware\avr\1.0.8\libraries\EEPROM

exit status 1

'POSITIVE' was not declared in this scope

11 replies

Reply 1 year ago

Hello danielrp, did you advance on your update with the autoscroll: p or any update? thanks to you


Reply 1 year ago

Bonjour ,pour information il suffit de prendre l avant dernière library disponible via la lien . J ai résolu le problème . Merci


Reply 1 year ago

Bonsoir , j ai fini le mien il et vraiment tip top . Je dit bravo a danielrp.

Petit question et il possible d envisager une mise a jour pour agrandir la plage de 0m1: 0.1mOhm to 1000 Ohm ?

Ou voir pour une v2 avoir plus de calibre ;p si oui je signe de suite pour la v2 . Travail remarquable

D autre projet de prevu ?


Reply 1 year ago

Thank you JeremyC157!

Actually I am working on a calibration kit and on a second version with some improvements, including an AutoScale function that could work cover your rage?


Reply 1 year ago

Hello what will be the new measurement range ? thks

Good project


Reply 1 year ago

The same, it just will have an automatic range change. The LM3092 can't give more than 200mA or less than 500uA, so other scales are no available without changing the circuit significantly.



Reply 1 year ago

Too bad I'm really interested in a modification that allows to have a scale of 0 to 2k.
but I am still curious to see the auto scall. Does this question the current circuit or it will be only a firmware update? Thank you again for all


Reply 1 year ago

Yes, it will be a question of updating FW. Modifying the hardware it is possible to reach 2K lowering the output current.


Reply 1 year ago

it would be really interesting to have a range up to 2k while keeping the precision: p