Practical Power System Design

Solar System Sizing Guide

Goal

Size your battery to survive N cloudy days, and size your panel to fully recharge that battery against your worst-month (winter) sun — with real positive margin, never sized "exactly" to the minimum.

Step 1 - Measure Your Device's Actual Current Draw

Use a coulomb-counting USB power meter (or a meter that logs mAh/Wh) over a multi-hour test. A plain multimeter in series reads only instantaneous current and will under-estimate average draw — radios spend most of their time receiving (low current) and only briefly transmitting (high current), so you must integrate consumption over time (mAh/Wh), not read a single instantaneous value. Do not rely solely on datasheet figures — real-world draw depends on firmware, radio duty cycle, and accessories.

Representative average current values (measure your own; these are examples, not specs):

DeviceAvg Current
ESP32 repeater (Heltec V3, no display, BT/Wi-Fi off)~40 - 80 mA (light traffic toward the low end; default/higher-traffic configs higher)
nRF52840 repeater (RAK4631 / T114), RX-mode average~10 - 15 mA (aggressive power-saving firmware can reach ~7.5 mA)
Pi Zero 2W gateway (idle/light load)~100 - 150 mA at 5V (an active gateway under Wi-Fi traffic can exceed 150 mA)
Pi 3B+ gateway (idle)~300 - 400 mA at 5V (a busy gateway draws 500 mA+, peaking near 950 mA under load)

Step 2 - Calculate Daily Energy

Work in watt-hours so device voltage is explicit. Daily energy: Wh/day = average current (mA) × 24 h × system voltage (V) ÷ 1000. To get amp-hours at a given bus voltage, divide Wh/day by that voltage. (mA × h alone gives Ah at the device's own voltage — you must multiply by voltage to get Wh, and account for voltage when sizing a battery at a different bus voltage.)

Example: a 60 mA ESP32 repeater on a 3.7 V single-cell bus = 60 × 24 × 3.7 ÷ 1000 ≈ 5.3 Wh/day, which is ~1.4 Ah/day at 3.7 V. If you instead power it from a 12 V LiFePO4 pack through a buck converter, the same 5.3 Wh/day is only ~0.44 Ah/day at 12 V, plus converter losses.

Step 3 - Size the Battery for Cloudy Days (with margin)

Multiply daily energy by the number of consecutive no-sun days you must survive. For general installs plan 3 - 5 days of reserve; for emergency-comms nodes plan 5 - 7+ days, because panels contribute nothing during a multi-day overcast or snow-covered stretch.

Example (5.3 Wh/day ESP32, 5-day reserve): 5.3 Wh/day × 5 days = 26.5 Wh of usable reserve needed.

For LiFePO4, plan to 80% depth of discharge for longevity — usable capacity = rated × 0.80. Sizing the pack exactly to the minimum leaves zero margin and ignores self-discharge, BMS/converter losses, cold-temperature capacity loss, and aging. Add real margin — roughly 1.3 - 2× the bare minimum. For the 5-day ESP32 case above (~26.5 Wh usable need ≈ a ~33 Wh pack at 80% DoD), step up to a ~50 - 65 Wh pack (e.g. an 8 - 10 Ah pack on a 6.4 V or 12.8 V bus) rather than sizing it razor-thin.

Step 4 - Size the Solar Panel

A solar panel produces roughly its rated wattage for a number of "peak sun hours" (PSH) per day. Do not assume a flat "4 PSH year-round." Use your location's winter PSH from NREL PVWatts: northern-US winter is only ~1 - 2.5 PSH (Seattle/Portland ~1.5, Chicago ~2.5, Anchorage ~0.5). Size the panel against the worst-month PSH and size the battery for cloudy-day reserve.

Energy harvested: Wh/day = panel watts × PSH × derate, where the overall derate factor is 0.75 (it lumps controller, wiring, temperature, and soiling losses). To convert to amp-hours at the battery, divide by the battery charging voltage. For a PWM controller, current into the battery is roughly the panel's Imp (PWM clips panel Vmp to battery voltage); for MPPT, use the power form (panel W × PSH × derate) ÷ battery charging voltage, since MPPT converts power rather than clipping voltage.

Example: a 5 W panel at a winter minimum of 2 PSH →
5 W × 2 h × 0.75 = 7.5 Wh/day harvested
That still covers a ~5.3 Wh/day ESP32 repeater, but with thin margin and no allowance for consecutive overcast days. At a northern latitude, step up to a 10 W panel for reliable winter recharge.

Step 5 - Account for Worst-Case Latitude and Season

Latitude >45° (northern US, Canada) in winter may have only ~1 - 2.5 peak sun hours — and that figure describes clear winter days. During storms, prolonged overcast, and snow cover, real harvest can fall to near zero for days at a time. Size the panel for the winter minimum and size the battery for 5 - 7+ consecutive no-sun days at high latitude. Check and clear snow from panels in winter.

Quick Reference Table

Device currents below are representative receive-mode/idle figures (measure your own). The mA values are at each device's own input voltage; the Ah/day column is computed at that voltage. When powering from a higher-voltage battery (e.g. 12 V LiFePO4) through a converter, convert via watt-hours and add converter loss. Battery and panel columns already include margin for cloudy-day reserve and winter PSH.

Device Avg mA Ah/day (at device V) Recommended Battery Recommended Panel
nRF52840 repeater ~12 mA 0.29 Ah @ device V 3 - 5 Ah LiFePO4 3 W minimum
ESP32 repeater ~60 mA 1.4 Ah @ device V 8 - 10 Ah LiFePO4 5 - 10 W
Pi Zero gateway (idle) ~125 mA @ 5V 3.0 Ah @ 5V (≈1.4 Ah/day at 12V + loss) 15 - 20 Ah LiFePO4 20 W
Pi 3B+ gateway (idle) ~350 mA @ 5V 8.4 Ah @ 5V (≈3.8 Ah/day at 12V + loss; active load draws more) 40 Ah LiFePO4 50 W

Charge Controller Selection and Wiring

Why You Need a Charge Controller

Solar panels produce unregulated voltage - a nominally "12 V" panel can output up to 22 V open-circuit. A charge controller protects the battery from overcharge, manages the multi-stage charge profile (bulk, absorption, float), and in many cases provides a protected load output to prevent deep discharge.

PWM vs. MPPT

PWM (Pulse Width Modulation)

Simple and cheap. The controller connects the panel more or less directly to the battery and chops the current. Efficient only when the panel's operating voltage is close to the battery voltage. Fine for small, well-matched systems where cost matters more than harvest efficiency.

MPPT (Maximum Power Point Tracking)

Continuously sweeps the panel's voltage-current curve to find the operating point that yields maximum power output. Typically delivers 10 - 30% more energy than PWM, especially in cool or partly-cloudy conditions, or when panel voltage is significantly higher than battery voltage. MPPT recovers the most when the panel's Vmp is significantly higher than the battery voltage; PWM suits panels whose Vmp is close to the battery voltage. Recommended for any challenging installation.

Recommendations for LoRa Mesh Nodes

Small systems: 5 W panel + 3.7 V LiPo or small LiFePO4

A dedicated solar LiPo charging board with built-in MPPT is the simplest and cheapest approach. Examples:

These handle cell-level charging directly and fit neatly into a small enclosure alongside the node. Note: these small charger ICs have no low-temperature charge cutoff — never charge any lithium chemistry below 0 C (32 F), and add a BMS with low-temp protection or a controller with a battery temp sensor for cold-climate builds.

Medium systems: 10 - 20 W panel + 12 V LiFePO4

A dedicated MPPT controller is warranted. Good options at modest cost:

Wiring Sequence

Always follow this order to protect the controller:

  1. Connect battery to controller first
  2. Connect panel to controller
  3. Connect load to controller

Disconnect in reverse order: load → panel → battery.

LiFePO4 Charge Profile

LiFePO4 uses a different charge profile from lead-acid. Key voltages per cell (4S = 12.8 V nominal):

For a 4-cell (12 V nominal) pack: absorption = 14.4 V (range 14.2 - 14.6 V), float = 13.5 V (range 13.5 - 13.6 V). Do not float a LiFePO4 pack at 14.4 V. Also do NOT equalize LiFePO4.

Warning: Most cheap PWM controllers are factory-calibrated for lead-acid (14.4 - 14.8 V absorption, with a ~13.5 - 13.8 V float). Using lead-acid absorption settings on LiFePO4 can overcharge and damage the cells. Verify that your controller has a LiFePO4 mode or use a controller specifically designed for LiFePO4.

Load Output and Low-Voltage Disconnect (LVD)

Many charge controllers have a dedicated "load" terminal that automatically disconnects the load when the battery drops below a programmable voltage. Connect your node to this terminal rather than directly to the battery. Set the operating LVD to ~3.0 V/cell (a conservative recommended value; the acceptable range is roughly 2.8 - 3.0 V/cell):

This operating LVD is distinct from the hard BMS undervoltage cutoff (~2.5 - 2.7 V/cell, ~10 - 10.8 V for a 4S pack). The conservative 12.0 V LVD leaves reserve before the BMS cell-undervoltage cutoff and prevents deep discharge, which is a primary cause of premature LiFePO4 cell death.

Fusing

Always fuse the battery positive lead as close to the battery terminal as practical (ABYC: within ~7 inches). A short circuit without a fuse can dump hundreds of amps through wiring and cause a fire. Use automotive blade fuses. Size the fuse to protect the WIRE, not the load: the fuse rating must be at or below the ampacity of the smallest conductor it protects, AND at least ~125% of the continuous load current. Choose the next standard fuse size that satisfies both conditions. Never simply use "2× the load" or "the next size above the wire's ampacity."

Example: a node drawing 500 mA peak - a 2 A fuse on the battery lead is fine, because 2 A is above ~125% of the load and well within the ampacity of typical hookup wire. Always confirm the chosen fuse is at or below the conductor's ampacity.

Sizing a Solar System for Your Climate

Solar panel sizing depends heavily on your geographic location. The same 5W panel produces dramatically different energy in Portland, Oregon vs. Phoenix, Arizona. This guide walks through climate-specific sizing calculations.

Peak Sun Hours by Region

Peak Sun Hours (PSH) is the number of hours per day when solar irradiance averages 1,000 W/m². It's the key variable in solar sizing calculations.

RegionWinter PSHSummer PSHAnnual Average PSH
Phoenix, AZ4.57.56.0
Los Angeles, CA4.06.05.2
Denver, CO3.86.55.1
Dallas, TX3.56.55.0
Atlanta, GA3.25.54.5
Chicago, IL2.55.54.0
Seattle, WA1.55.53.5
Portland, OR1.55.53.3
Anchorage, AK0.56.03.0

PSH source: values are conservative sizing-design figures derived from NREL PVWatts / NSRDB station data for representative cities in each region; look up your exact site in PVWatts before finalizing a build. Winter columns reflect the worst-month average (e.g. December). The "Annual Average" column is a design figure for rough comparison — NREL's pure annual mean runs a little higher in cloudy locations (e.g. Seattle's true annual mean is ~4.9 PSH, but its winter worst-month near 1.5 is what governs sizing). Always size the panel against the winter PSH, not the annual average. Phoenix winter is shown at a conservative 4.5; some sources put it nearer 5.0–5.5. (as of 2026-06-08)

Design for the worst month: Use winter PSH for sizing, not annual average. In most of the Northern Hemisphere, a system sized for the December PSH minimum will have surplus power in other months — but you still need battery autonomy for multi-day cloudy spells, and in snowy regions you must account for snow covering the panel.

Solar Sizing Calculation

# Formula: Panel watts needed = Daily energy need / (PSH * derate factor)
# Daily energy (Wh/day) = average current (mA) * system voltage (V) * 24 h / 1000
# Derate factor (~0.75) covers controller + wiring + temperature + soiling losses.
# This is a CLEAR-DAY average; the PSH figure assumes typical sun. Multi-day
# overcast is handled by BATTERY reserve (see Battery Sizing), not panel size.

# Example: RAK4631 (nRF52840) repeater in Chicago winter
# Representative average draw ~10-15 mA; measure your own node.
Daily energy: 15mA avg * 3.7V * 24hrs / 1000 = 1.33 Wh/day
PSH (Chicago winter, per NREL PVWatts): 2.5 hours
Derate factor: 0.75

Panel size = 1.33 Wh / (2.5 h * 0.75) = 0.71W

# This 0.71W is the clear-winter-day MINIMUM. A 1W panel meets the load only on
# a clear day and gives no headroom for the multi-day overcast that is normal in
# Chicago Nov-Feb. Cloudy-day survival comes from battery reserve, not panel size.
# Use at least a 5W panel (a ~7x safety multiple over the clear-day minimum, to
# recharge quickly between storms) AND size the battery for 5-7 no-sun days.

# For Raspberry Pi room server + RAK4631 in Chicago winter:
Pi Zero 2 W avg: 300mA * 5V = 1.5W = 36 Wh/day  # representative; verify your load
RAK4631 avg: 15mA * 3.7V = 0.055W = 1.33 Wh/day
Total: 37.33 Wh/day

# Computed minimum:
Panel needed: 37.33 / (2.5 * 0.75) = 19.9W
# Choose the next-larger standard size for margin -> use 25W panel minimum.

Battery Sizing for Autonomy

# Formula: Battery capacity (Ah) = Daily energy * Autonomy days / (usable fraction * voltage)
# Usable fraction (plan-to depth of discharge for longevity):
#   LiFePO4 ~0.80 (cells can do 0.80-0.90), LiPo/Li-ion ~0.80, SLA/lead-acid ~0.50
# For emergency-comms nodes, target 5-7+ days of autonomy: panels do not help
# during multi-day overcast, so the battery must carry the whole no-sun stretch.

# RAK4631 repeater with 3-day autonomy, 3.7V LiPo:
Battery Ah = (1.33 Wh/day * 3 days) / (0.80 * 3.7V)
 = 3.99 Wh / 2.96
 = 1.35 Ah minimum
# 3 days is a general minimum; for an emergency-comms node, size for 5-7 days.

# A 10Ah LiPo gives: 10Ah * 0.80 * 3.7V / 1.33 Wh/day = ~22 days of autonomy.
# That is a comfortable reserve for this very-low-draw node, but the reserve is
# only useful if the battery is kept above freezing and the panel can recharge it
# between cloudy spells. Do not treat panel size and battery reserve as
# interchangeable - the battery carries no-sun days, the panel recharges between them.

# For Pi + RAK at 3-day autonomy, 12V LiFePO4:
Battery Ah = (37.33 * 3) / (0.80 * 12V) = 11.7 Ah minimum
# Use a 20Ah battery for comfortable margin (and 5-7 day reserve if emcomm-critical).

Seasonal Charging Strategies

Charge Controller Selection and Configuration

The charge controller is the brain of your solar power system - it manages battery charging, prevents overcharge and deep discharge, and in MPPT controllers, optimizes power extraction from the solar panel. Choosing the right charge controller significantly affects system efficiency and longevity.

PWM vs. MPPT: Which to Choose

FeaturePWMMPPT
Efficiency70-75%93-97%
Cost$5-20$30-150
Solar panel voltage matchingMust match battery voltage closelyWorks with any panel voltage above battery voltage
Best for small systemsUnder 5W with matched panel/battery5W+ or when panel voltage exceeds battery voltage
Cold weather performanceGoodExcellent (harvests more from cold-weather voltage boost)

Recommendation: Use MPPT for any permanent deployment. The efficiency gain pays for the cost premium within 1-2 years in most climates, and MPPT controllers last longer and provide better battery protection.

Victron SmartSolar MPPT 75/10: The Standard Choice

The Victron SmartSolar 75/10 ($45-55, as of 2026-06-08) is the most popular choice for LoRa mesh solar nodes:

# Victron MPPT configuration for LiFePO4 battery (12V system):
Charge algorithm: Li-Ion
Absorption voltage: 14.4V (range 14.2-14.6V; do not float here)
Float voltage: 13.5V
Low voltage disconnect: 12.0V (operating LVD for longevity, ~10-20% SoC remaining; this is NOT 80% DOD protection. The hard BMS under-voltage cutoff is lower, ~10-10.8V)
Temperature compensation: Disabled for LiFePO4 (temp compensation is a lead-acid feature)

# For LiPo (3.7V single cell, 4.2V max):
# Use a TP4056 Li-Ion charger module, not a Victron
# Victron 75/10 is designed for 12V+ systems

Load Output vs. Direct Battery Connection

Most MPPT controllers have a "load output" - a switched output that turns off automatically when the battery voltage drops below a set threshold:

Best practice: Connect your node through the load output for automatic low-voltage protection. Connect any monitoring equipment (Pi) directly to the battery with its own cutoff relay if the Pi exceeds the load output current limit.

Solar Panel Tilt Optimization

# A good annual-average tilt is approximately equal to your latitude.
# (A common refinement is latitude * ~0.76 per NREL studies, since the
# true annual optimum is somewhat below latitude.) The latitude * 0.9
# + offset formulas you may see elsewhere are season-specific (winter),
# not the annual-maximum rule.

# Annual-average examples (tilt ~ latitude):
# Portland (45.5°N): ~45 degrees from horizontal
# Dallas (32.8°N): ~33 degrees
# Phoenix (33.4°N): ~33 degrees
# Chicago (41.8°N): ~42 degrees

# For winter optimization (maximize December-February output):
# Tilt angle = latitude + 15 degrees

# For snow-shedding (prevents accumulation that blocks panel):
# Tilt angle = 45 degrees minimum; 60 degrees ideal in heavy snow climates