Sizing a battery for an embedded project requires more than dividing milliamp-hours by your circuit's current draw. When battery powering Arduino systems—especially those running 24/7 in off-grid or remote locations—you must account for voltage regulator inefficiencies, depth-of-discharge (DoD) limits, and the non-linear discharge curves of different chemistries. A 2000mAh Li-ion cell will not give you 20 hours of runtime on a 100mA load if the DC-DC buck converter wastes 15% of your energy as heat, or if your battery management system (BMS) cuts power at 20% remaining capacity to prevent cell death.

This guide provides the exact system architecture, cell configuration rules, and sizing math required to build a reliable, safe power system for your microcontroller projects.

System Block Architecture: Source to Load

A robust off-grid power system follows a strict source-to-load path. Never connect a raw battery directly to an Arduino's 5V pin unless the battery chemistry and state-of-charge perfectly match the logic level (which is almost never true in practice).

  1. Source (Battery Pack): Stores chemical energy. Outputs a variable DC voltage based on state-of-charge (SoC).
  2. Protection (BMS & Fuse): The Battery Management System monitors individual cell voltages and temperatures, disconnecting the pack if limits are breached. A physical fuse prevents catastrophic short-circuit currents.
  3. Charge Controller: Regulates incoming power (from solar panels or a wall adapter) to safely recharge the battery using Constant Current/Constant Voltage (CC/CV) profiles.
  4. DC-DC Regulator (Buck/Boost): Steps the variable battery voltage down to a rock-solid 5.0V (or 3.3V) required by the microcontroller. Switching regulators (like the LM2596 or TPS5430) are mandatory; linear regulators (like the L7805) will waste massive amounts of power as heat on higher-voltage packs.
  5. Load (Arduino & Peripherals): The microcontroller, sensors, and communication modules (e.g., LoRa, GSM, WiFi).

Cell Configurations: Series vs. Parallel Consequences

When building a battery pack from individual cells (like 18650 Li-ion or 32700 LiFePO4), you must choose how to wire them. The arrangement dictates your system voltage and capacity.

Configuration Voltage Consequence Capacity (Ah) Consequence Best Use Case for Arduino
Series (e.g., 3S1P) Voltages add together (3 x 3.7V = 11.1V nominal). Capacity remains the same as a single cell. Powering 12V peripherals (relays, motors) alongside a 5V buck regulator for the Arduino.
Parallel (e.g., 1S4P) Voltage remains the same as a single cell (3.7V nominal). Capacities add together (4 x 3000mAh = 12,000mAh). Directly powering 3.3V microcontrollers (ESP32, Arduino Nano 33 IoT) via a boost converter.
Series-Parallel (e.g., 4S2P) Voltage adds across series groups. Capacity adds across parallel groups. High-power, long-runtime off-grid weather stations with 12V/24V architectures.
CRITICAL LITHIUM FIRE-SAFETY & MISMATCH WARNING:
Never wire mismatched cells in parallel. If you parallel a new 3000mAh cell with an older 2000mAh cell, or mix different brands, their internal resistances will differ. The stronger cell will force high current into the weaker cell to equalize voltages, leading to overheating, venting, and thermal runaway. Always use cells from the same manufacturing batch, matched by capacity and internal resistance. Furthermore, every lithium pack must be wired through a properly rated BMS. Lithium-ion cells pushed below 2.5V or above 4.2V will suffer irreversible dendrite growth, creating an internal short circuit and severe fire hazard.

Sizing Math: Peukert’s Law, C-Rates, and Efficiency

Let's size a system for a remote agricultural node. The load consists of an Arduino Uno monitoring soil moisture, plus a 120V AC water pump triggered via a relay. We are using a 12V LiFePO4 battery.

1. Define the Daily Load and Inverter/Charger Sizing

  • Arduino & Sensors: 50mA average at 5V = 0.25W. Running 24 hours = 6 Wh/day.
  • AC Water Pump: 50W continuous, but AC motors have a startup surge of 3x to 5x. Running 2 hours/day = 100 Wh/day.
  • Total Daily Energy: 106 Wh/day.

Inverter Sizing: The pump draws 50W continuous, but the surge is 150W. You must size the inverter to handle the surge without tripping its low-voltage cutoff. A 300W Pure Sine Wave inverter is the correct choice here. Modified sine wave inverters will cause the AC motor to overheat and waste 20% more energy.

Charger Sizing: To replenish 106 Wh (approx. 9 Ah at 12V) during a 4-hour peak solar window, you need a minimum charge current of 2.25A. Factoring in 85% system efficiency and cloud cover, specify a 10A MPPT Solar Charge Controller.

2. Calculate Battery Capacity with DoD and Peukert's Law

Batteries cannot be drained to 0%. The Depth of Discharge (DoD) limit dictates your usable capacity. LiFePO4 allows a 90% DoD, while Sealed Lead-Acid (SLA) is limited to 50% to prevent sulfation.

For lead-acid batteries, you must also apply Peukert's Law, which accounts for the fact that a battery's effective capacity drops as the discharge current increases. The formula is t = H × (C / I)^k, where k is the Peukert exponent (typically 1.3 for SLA, but nearly 1.05 for LiFePO4).

Parameter LiFePO4 (Lithium Iron Phosphate) SLA (Sealed Lead-Acid)
Daily Load Requirement 106 Wh 106 Wh
Usable DoD Limit 90% (0.90) 50% (0.50)
Inverter/Regulator Efficiency 90% (0.90) 85% (0.85)
Peukert Derating (at this load) ~1.0 (Negligible) 0.85 (15% loss at high draw)
Required Nameplate Capacity 130 Wh (12V 10Ah) 277 Wh (12V 23Ah)

Note: While LiFePO4 costs roughly 2.5x more upfront per Ah than SLA, the usable capacity and cycle life (4000+ cycles vs 300 cycles) make it vastly cheaper per Wh delivered over the system's lifespan.

3. Charge and Discharge C-Rate Limits

The C-rate defines how fast you can safely pull or push current relative to the battery's capacity. A 1C rate on a 10Ah battery means 10A of current.

  • Standard Li-ion (NMC): Max discharge usually 1C to 2C. Max charge 0.5C to 1C.
  • LiFePO4: Max discharge 1C. Max charge 0.5C (charging faster degrades the cathode).
  • SLA: Max discharge 0.2C for long life. Max charge 0.1C to 0.2C. Fast-charging a lead-acid battery will boil the electrolyte and warp the plates.

If your Arduino project includes a high-current peripheral (like a motor or a GSM module transmitting at 2A peaks), ensure your battery's continuous C-rate can handle the surge, or add a supercapacitor bank near the load to buffer the transient current.

FAQ: Battery Powering Arduino Long-Tail Questions

Can I connect a 3.7V Li-ion battery directly to the Arduino 5V pin?

No. A fully charged Li-ion cell sits at 4.2V, which is below the 5V required for stable logic levels and USB communication. As the battery drains to 3.0V, the microcontroller will experience brownouts, corrupting the EEPROM and causing erratic sensor readings. You must use a DC-DC boost converter (like the MT3608) set to exactly 5.0V. Conversely, never feed 4.2V into the Arduino's "VIN" or barrel jack; the onboard linear regulator requires at least 6.5V to output a stable 5V, and feeding it 4.2V will result in a ~3.5V output, causing the ATmega328P to crash.

How long will a standard 9V alkaline battery power an Arduino Uno?

Surprisingly little time. A standard 9V alkaline battery has a capacity of roughly 400mAh to 500mAh. An Arduino Uno draws about 45mA just to run the microcontroller, onboard USB-to-serial chip, and power LED. If you connect the 9V to the barrel jack, the onboard linear regulator must drop 9V down to 5V, wasting over 40% of the energy as heat. Factoring in regulator inefficiency, a 9V battery will power an Uno for roughly 6 to 8 hours. For anything longer, use 3S or 4S AA NiMH packs or a Li-ion cell with a switching regulator.

What is the best battery chemistry for outdoor Arduino weather stations?

LiFePO4 (Lithium Iron Phosphate) is the superior choice for outdoor, solar-charged low-power embedded projects. Unlike standard Li-ion (NMC), which degrades rapidly when held at 100% state-of-charge in high ambient temperatures, LiFePO4 tolerates float-charging and high temperatures exceptionally well. It also features a flat discharge curve (holding ~12.8V for 90% of its cycle), which makes designing the DC-DC regulator stage much simpler. Furthermore, LiFePO4 is inherently safer and will not enter thermal runaway if a solar charge controller fails and overvoltages the pack.

How do I measure the actual battery voltage using the Arduino itself?

You can measure battery voltage using the Arduino's analog-to-digital converter (ADC), but you must use a voltage divider to step the battery voltage down below the ADC's 5V (or 3.3V) reference limit. For a 12V battery, use a 100kΩ and 47kΩ resistor divider, which scales 12V down to ~3.83V. Connect the midpoint to an analog pin (e.g., A0). To prevent the divider from constantly draining your battery, wire the top of the divider to a digital GPIO pin through a P-channel MOSFET, or use a high-resistance divider (e.g., 1MΩ and 470kΩ) paired with a 100nF capacitor in parallel with the lower resistor to stabilize the ADC's sample-and-hold circuit.