0% found this document useful (0 votes)
2 views

Voltage Measurement Using Arduino

Uploaded by

Esam Mohamad
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views

Voltage Measurement Using Arduino

Uploaded by

Esam Mohamad
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 7

Voltage Measurement Using Arduino 146K

by indoorgeek 54
47
Voltage Measurement using Arduino

Intro: Voltage Measurement Using Arduino

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!

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
Privacy Settings
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 = ");
Serial.println(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.
Determine the maximum voltage which is to be measured.
Decide a suitable and standard value for R1 in kilo-ohm range.
Using formula, calculate R2.
If the value of R2 is not (or close to) a standard value, change R1 and repeat
the above steps.
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!
27 Comments
Chadman25 1 year ago
Hi,
Thank you for the tutorial. I tried this with 200K and 10K ohms for the Rs,
which gives me up to 110V as far I understand. when I connect a 9V
battery to test, it gets around 15V measured.
Any ideas? I don't have 200Kohm so I did:

Any idea why the big difference?


Thank you
Chameleon 1 year ago
This was a fun little puzzle to work out.
First off, for the number to show up like that the values of the
voltage = value * (5.0/1023) * ((R1 + R2)/R2);
equation come out to:
15.39589... = 150 * (5.0/1023) * ((200+10)/10);
So the arduino is outputting a value of 150, which corresponds to it
seeing a voltage of 0.733... volts.
If the arduino was seeing a value of 150 when V_in was 9 volts the
((R1+R2)/R2) ratio would need to be:
9 / (150 * (5/1023)) = 12.276
Now, looking at the image you posted it's a bit hard to make out the
resistors, but from what I can see and translating the resistor colour
codes (https://www.arrow.com/en/research-and-events/articles/resistor-
color-code) you have 2 x 506k for R1 and 1 x 100k for R2 - ((R1+R2)/R2):
((506k*2 + 100k) / 100k) = 11.12
Which is pretty close to the 12.276 ratio above if V_in were 9v, so using
those values:
voltage = value * (5.0/1023) * ((R1 + R2)/R2);
8.152... = 150 * (5.0/1023) * ((1012 + 100) / 100);
So your display would show "V= 8.15" and 9v batteries are typically 6.5v
to 8.4v. It would be interesting to see if you had a multimeter that would
verify that number.
All of which is to say you should double check the actual resistor values
using the colour bands and something like the chart from the link above.
Chadman25 1 year ago
I decreased impedance and used 5000ohm for R1 and 220 ohm for R2,
but still I get similar result :(
out of ideas now. Thanks.
FotoAmgA 1 year ago
There is V1 = Vm * (R2/(R1+R2))
according to the beginning of the article but in the code you use ((R1 +
R2)/R2) so which one?
TuckEazy 1 year ago
Could you please post a schematic of the entire circuit
luketaiwan2019 3 years ago
I want to measure electricity below 200v, is this okay?
schroederM100 3 years ago
Yes it will. As long as your voltage divider creates a value equal to or
below 5 volts. In your case your voltage divider is (1/40) and would
produce 5 volts with a 200 volt input.
One way to protect your micro controller is to add a zener diode, with a 5
volt breakdown, in parallel to R2. This will protect your micro controller if
voltages above 200 volts are input into the circuit.
luketaiwan2019 2 years ago
Thank you!
majjvb3luna3 2 years ago
Hey! Do you think this could work but with a lower voltage and
sensitivity? Up to 150mV with a 0.1mV step?
luketaiwan2019 3 years ago
Nice project!
on4ssc 3 years ago
Hello!
I'm trying to measure a battery (AA battery, 1.5v) voltage from my STM32
using the ADC1 pin. However it's not working. It's only working fine if I
measure the 3.3v pin of my STM32. But when connecting the 1.5v
battery (instead of 3.3v) and the negative side of the AA battery to the
GND pin, I don't have any readings. Can you help me ? Thanks
Stéphane
noir97 5 years 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 ?
Hairyloon 5 years 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.
mrnegpants 3 years ago
voltage is 12 Volts. What you want to power measurement. I assumume
you need to record pulse on time over a time period.
JohnS1343 4 years ago
This solution often gets banded around, but it's a bad one. Voltage
dividers constantly drain power, which for an inherently low power device
like an arduino which is often battery operated, is terrible. For well
powered devices, it's just inefficient.
yhofalcao 4 years ago
Could you give a good solution? (This is not to criticize your reply). I'm
trying to learn exactly this. So any links would be very helpful
JohnS1343 4 years ago
Yes I can. The one I used as a solution for my project is an INA219. A
much more elegant solution that also comes with a ammeter and is
digital. If you search or scroll down on here:
https://www.facebook.com/pg/StockysElectronicsProjects
mrnegpants 3 years ago
this solution also will drain power
Davh10 4 years ago
Hello, how i can protect arduino if the voltage raises up the Vm expect
voltage?
lemansouri.med 4 years ago
why did you choose 47k for r1 ,is that random or it needs to be in a
certan range
More Comments
TOS | Privacy | Legal
© 2024

You might also like