Introduction: Milliohm Meter

Picture of Milliohm Meter

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.

Step 1: Parts and Wiring Diagram

Picture of 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

Picture of 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 easy 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

Picture of 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

Picture of 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

Picture of 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

Picture of 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

Picture of 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

Picture of Final Assembly

Step 9: Arduino Code

Step 10: Misc.

Picture of 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

Picture of 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:


JeremyC157 (author)2018-01-03

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

JeremyC157 (author)JeremyC1572018-01-06

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

danielrp (author)JeremyC1572018-01-06


JeremyC157 (author)danielrp2018-01-10

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 ?

danielrp (author)JeremyC1572018-01-14

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?

JeremyC157 (author)danielrp2018-01-14

Hello what will be the new measurement range ? thks

Good project

danielrp (author)JeremyC1572018-01-14

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.


JeremyC157 (author)danielrp2018-01-14

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

danielrp (author)JeremyC1572018-01-14

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

JeremyC157 (author)danielrp2018-01-14

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

danielrp (author)JeremyC1572018-01-05

Hi JeremyC157,

I didn't have that problem compiling the code but it seems it happens frequently. I don't know what is the solution but, there are much info in the Internet: I hope you solve it!!


florinprundu (author)2017-12-20

please send eagle filles, I want to make some changes, thx.

Howiesf (author)2017-12-14

What a great project.

Have you considered adding a switch to toggle between ohms and mhos (siemens).


danielrp (author)Howiesf2017-12-17

Thank you Howiesf. Why do you need to measure conductivity?

Howiesf (author)danielrp2017-12-18

The math is easier for resistance values less than 1 Ohm.

schabanow. (author)2017-12-17

Great! Now user will find abnormal consumption easily, by means of comparison of voltage drops along the similar pwr tracks on PCB (or maybe even along the pwr pins of SOICs, for instance) - if "finger tip method" won't work, because "palpation" sometimes fails. Well done! Thank you very much!

Surajit Majumdar (author)2017-12-17

Awesome project :)

Thank you Surajit Majumdar!!

MakerByMarco (author)2017-12-16

You did an amazing job on the project enclosure! It looks fantastic. I hate seeing great electronics projects only to be put into a plastic shoe box. The enclosure I believe is as important as what’s inside it.

danielrp (author)MakerByMarco2017-12-17

Thank you MakerByMarco!!! I agree with you.

florinprundu (author)2017-12-15

not disponible Eagle files ? , I want to make this miliohmeter

danielrp (author)florinprundu2017-12-17

Hi florinprundu, the Gerber files are in the Step 3, so you can order the PCB. I can send you the Eagle files in private if you want to modify them.

cocosoft (author)2017-12-14

Beautiful work Dan, I think I will give it a go when I am feeling brave and my eyes feel up do doing a bunch of SM soldering. Respect!

danielrp (author)cocosoft2017-12-17

Thank you cocosoft!!

gta18 (author)2017-12-15

Do you still have extra pcb for sale?

danielrp (author)gta182017-12-17

Hi gta18, I am not selling them.

schabanow. (author)2017-12-14

I would inevitably follow you If it has a uV-meter mode. Just in order to show the voltage' drop along the PCB's track, for instance. PLEASE !

danielrp (author)schabanow.2017-12-17

Hi, schabanow. I added the step "Updates" with the modification you recuested. I also made a hole for programming the Arduino without dissasembly.

danielrp (author)schabanow.2017-12-14

Hi schabanow, thank you for your coment. As it is configured now, an LSB of the ADC is equal to 15.6uV, that could be the resolution in that new mode, also the ADC has a internal voltage gain stage configurable up to 8, that may lower the resolution down to 1.95uV. But in ADC's datasheet sais that typical offset voltage is 15.6uV, so I don't know if it will be precise. Let me check it deeply this weekend.

schabanow. (author)danielrp2017-12-14

I look forward to hear from you soon!

studleylee (author)2017-12-14

This is an awesomely done instructable. The hookup and descriptions are dead on and easy to follow. I have an analog version of this that I've used since the mid 80's to help find shorted parts. It was indispensable when I did tour gear for George Thorogood and others back in the day. It located shorted output devices in large audio power amps. Without it, you had to unsolder multiple devices until you found the culprit. In hi power systems the heatsinking makes the old "inject controlled current and see what gets warm" method fails. At Hypercom a new proto build of a pos terminal design had a dead sort. Current limited injection alone didn't show any hot spots. It ended up being a solder splash under a decoupling cap. I will be building this! Thanks!

danielrp (author)studleylee2017-12-14

Hi studleylee, your comment has been amazing. Thank you! Hope you build it!!

1-big-dog (author)2017-12-14

Quote: "There are two pushbuttons (5). The black one is connected to the “SEL”
connector. When this button is pressed the scale change. The black one
is connected to “CAL”. When this button is pressed the meter enters in
HOLD MODE." I believe this should be amended to have one black and one red.

danielrp (author)1-big-dog2017-12-14

Thank you very much 1-big-dog, I've just changed it!

AlanS14 (author)2017-12-14

very good!

danielrp (author)AlanS142017-12-14

Thank you!!

YoramS2 (author)2017-12-14

Nice project

danielrp (author)YoramS22017-12-14

Thank you!!

JohnC956 (author)2017-12-11

Awesome project and craftmanship. Simple but effective. You have a good expertise in electronic circuit design, mechanical know-how and a flair for clean design. Thumbs up !

danielrp (author)JohnC9562017-12-12

Thank you very much JohnC956.

gm280 (author)2017-12-11

A very nice project. Have you tested it against known precision resistors or shorting wire to verify its readings? I may have to build one myself. Always interesting to see what wires and precision resistors in the extremely low values ranges really are reading. It would certainly make seeing dirty switch contact easy.

danielrp (author)gm2802017-12-11

Thank you gm280. In the video in the first step I'm measuring a precision 0.01ohm resistor. Also, shortcircuiting the leads produces 0ohm in all scales.

About This Instructable




Bio: DIY in general, woodworking and electronics enthusiast.
More by danielrp:Milliohm MeterSuperb Lab Power Supply3D Printed Holder for IKEA FRÖER Flowerpot
Add instructable to: