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,
    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
    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:
// 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: ");
  // 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");
  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!

[1] arduino analogReference