Voltage Measurement Using Arduino

About: Electrical Engineering Student. I like to build stuff and learn along the way!

Measuring voltage is quite easy using any microcontroller as compared to the measurement of current. Measuring voltages becomes necessary if you are working with batteries or you want to make your own adjustable power supply. Though this method applies to any uC but in this tutorial, we will learn how to measure voltage using Arduino.

There are voltage sensors available in the market. But do you really need them? Let's find out!

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: Basics

A microcontroller cannot understand analog voltage directly. That is why we have to use an Analog to Digital Converter or ADC in short. Atmega328 which is the brain of the Arduino Uno has 6 channel (marked as A0 to A5), 10-bit ADC. This means that it will map input voltages from 0 to 5V into integer values from 0 to (2^10-1) i.e. equal to 1023 which gives a resolution of 4.9mV per unit. 0 will correspond to 0V, 1 to 4.9mv, 2 to 9.8mV and so on till 1023.

Step 2: Measuring 0-5V

First, we will see how to measure voltage with a maximum voltage of 5V. This is very easy as no special modifications are required. To simulate the varying voltage, we will use a potentiometer whose middle pin is connected to any one of the 6 channels. We will now write the code to read the values from ADC and convert them back into useful voltage readings.

Reading the analog pin A0

value = analogRead(A0);

Now, the variable 'value' contains a value between 0 to 1023 depending upon the voltage.

voltage = value * 5.0/1023;

The obtained value is now multiplied by the resolution (5/1023 = 4.9mV per unit) to get the actual voltage.

And finally, display the measured voltage on the Serial monitor.

Serial.print("Voltage = ");

Step 3: Measuring Voltage Above 5V

But the problem arises when the voltage to be measured exceeds 5 volts. This can be solved using a voltage divider circuit which consists of 2 resistors connected in series as shown. One end of this series connection is connected to the voltage to be measured (Vm) and the other end to the ground. A voltage (V1) proportional to the measured voltage will appear at the junction of two resistors. This junction can then be connected to the analog pin of the Arduino. The voltage can be found out using this formula.

V1 = Vm * (R2/(R1+R2))

The voltage V1 is then measured by the Arduino.

Step 4: Building the Voltage Divider

Now to build this voltage divider, we first need to find out the values of resistors. Follow these steps to calculate the value of resistors.

  1. Determine the maximum voltage which is to be measured.
  2. Decide a suitable and standard value for R1 in kilo-ohm range.
  3. Using formula, calculate R2.
  4. If the value of R2 is not (or close to) a standard value, change R1 and repeat the above steps.
  5. Since Arduino can handle a maximum of 5V, V1 = 5V.

For example, Let the maximum voltage (Vm) to be measured be 12V and R1 = 47 kilo-ohms. Then using the formula R2 comes out to be equal to 33k.

Now, Build a voltage divider circuit using these resistors.

With this setup, we now have an upper and lower limit. For Vm = 12V we get V1 = 5V and for Vm = 0V we get V1 = 0V. That is, for 0 to 12V at Vm, there will be a proportional voltage from 0 to 5V at V1 which can then be fed into the Arduino as before.

Step 5: Reading the Voltage

With a slight modification in the code, we can now measure 0 to 12V.

Analog value is read as before. Then, using the same formula mentioned previously, the voltage between 0 and 12V is measured.

value = analogRead(A0);
voltage = value * (5.0/1023) * ((R1 + R2)/R2);

The commonly available Voltage Sensor Modules are nothing but just a voltage divider circuit. These are rated for 0 to 25V with 30 kiloohm and 7.5 kilo-ohm resistors.

So, Why to BUY, when you can DIY!

Thank you for sticking till the end. I hope that this tutorial would have helped you.

Subscribe to my YouTube channel for more upcoming projects and tutorials. Thanks once again!

Be the First to Share


    • Made with Math Contest

      Made with Math Contest
    • Multi-Discipline Contest

      Multi-Discipline Contest
    • Robotics Contest

      Robotics Contest

    6 Discussions


    6 months ago on Step 2

    There is no problem with your solution but there is a problem with accuracy the variation is up to +-0.15 of a volt , this variation is unacceptable for measuring voltage.

    1 reply

    Question 9 months ago on Step 5

    I have set it up for 5v 18650 based powerbank but the problem is it outputs 4.96v until its drained out and then suddenly dies..any solution?

    1 answer

    Answer 2 months ago

    The 18650 is a 3.7V cell, so how are you getting 5V from them?
    I'm guessing either a boost module, to raise the voltage or a buck to lower it from cells in parallel.
    Either way the module will maintain the set voltage until it cannot: that is what they do.


    Question 5 months ago

    hi, can voltage divider measure the output of pulsating dc voltage (pwm) ? in this case the voltage across 12v dc motor that it's speed was controlled by pwm. I've been tried it but the result of its measurement as i saw it from serial monitor arduino was so fluctuating, like 6v goes to 5v and then up again to 4v down again to 6v all the time. But when i measure it using multitester it shows stable 6v. Maybe some advice or solutions ?

    1 answer

    Answer 2 months ago

    Your meter is probably just taking a better average reading than the arduino, which is taking each measurement at an instant.
    You could add a bit to the code so that the arduino takes a series of samples and averages them.