Arduino Voltmeter

16,585

45

6

Introduction: Arduino Voltmeter

Arduino boards are equipped with analog inputs. Using the input
voltage as 5V reference, one can read the analog input of any given 0-5V voltage with a granularity of 5V/1024 = 4.88 mV (hint: don't expect accuracy to be anywhere near that number). Arduino in fact can take a different input as its voltage reference [1].

In our example, we use USB as our power source and make the assumption that reference input voltage is a constant 5V.

Step 1: Example Implementation

What follows is a simple voltmeter used to monitor a 7.4V LiPo 2S battery pack.
The charge balancer connector of a 2S (2 cell) LiPo has 3 terminals (black - GRND, blue - end of first cell, red - end of second cell). We measure the voltage difference between GRND and the second cell, which has a nominal voltage 7.4V.

Since the analog input maxes out at 5V, we use 2 2.2kΩ resistors in series as a voltage divider. This means that when the battery pack is connected to the voltmeter, at least 7.4V/4.4kΩ = 1.7mA or (7.4^2)/4400=12.5mW are consumed.

The battery's GRND is connected to Arduino's GRND and the point between the two resistors (where the voltage is halved) is connected to Arduino's Analog Input 0.

Step 2: Arduino Code

Upload the following code to your arduino:

/*Simple Voltmeter
    Copyright 2013-2020 Pavlos Iliopoulos, techprolet.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see .
 */
 
//set reference voltage;
float refVcc = 5.0;
 
 
// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}
 
// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // print out the value you read:
  Serial.print("Analog read: ");
  Serial.println(sensorValue);
  // print out the converted (voltage) value
  Serial.print ("Voltage: ");
  Serial.print (sensorValue*refVcc/1023); //analog read ranges from 0 to 1023 (1024 values)
  Serial.println ("V");
  Serial.println("--------------------");
  delay(1000);        // delay a whole second before reading again
}

Your LiPo's current juice is two times the reading you get from the Arduino (Remember, we halved the voltage before measuring)
Likewise, you can measure 3S LiPos (11.1V) by dividing voltage by 3, 4S LiPos (14.8V) by dividing by 4 etc.
This is it, enjoy your new LiPo voltmeter!

The best thing is, your Arduino can do a lot other stuff while also monitoring your LiPo!

Reference:
[1] arduino analogReference

http://arduino.cc/en/Reference/AnalogReference

Be the First to Share

    Recommendations

    • Make it Glow Contest

      Make it Glow Contest
    • First Time Author Contest

      First Time Author Contest
    • PCB Challenge

      PCB Challenge

    6 Discussions

    0
    techprolet
    techprolet

    Reply 6 months ago

    The constant should be 1023, indeed. I have changed the code accordingly.

    0
    techprolet
    techprolet

    Answer 2 years ago

    You don't divide the voltage at all. 1cell LiPos have a nominal voltage of 3.7V, which is within the 5V analog input reading capabilities of Arduino

    0
    tab328
    tab328

    Reply 7 months ago

    Keep in mind that a fully charged LiPo is 4.2v a cell. This is still below 5v, but you need to make sure that the power supply is in fact 5.0v (or close to it), and while you're at it, adjust the sketch to reflect the actual value for a more accurate reading.