# 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):

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

## 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 &gt;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.

<table id="bkmrk-device-avg-ma-ah%2Fday"> <thead> <tr> <th>Device</th> <th>Avg mA</th> <th>Ah/day (at device V)</th> <th>Recommended Battery</th> <th>Recommended Panel</th> </tr> </thead> <tbody> <tr> <td>nRF52840 repeater</td> <td>~12 mA</td> <td>0.29 Ah @ device V</td> <td>3 - 5 Ah LiFePO4</td> <td>3 W minimum</td> </tr> <tr> <td>ESP32 repeater</td> <td>~60 mA</td> <td>1.4 Ah @ device V</td> <td>8 - 10 Ah LiFePO4</td> <td>5 - 10 W</td> </tr> <tr> <td>Pi Zero gateway (idle)</td> <td>~125 mA @ 5V</td> <td>3.0 Ah @ 5V (≈1.4 Ah/day at 12V + loss)</td> <td>15 - 20 Ah LiFePO4</td> <td>20 W</td> </tr> <tr> <td>Pi 3B+ gateway (idle)</td> <td>~350 mA @ 5V</td> <td>8.4 Ah @ 5V (≈3.8 Ah/day at 12V + loss; active load draws more)</td> <td>40 Ah LiFePO4</td> <td>50 W</td> </tr> </tbody></table>

# 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:

- CN3791-based boards (switching MPPT-style solar charger; widely available on AliExpress, ~$3 - 8 as of 2026-06-08)
- Waveshare Solar Power Manager (~$12 - 15 as of 2026-06-08)

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:

- **Renogy Wanderer 10A** - inexpensive, reliable, widely available
- **Victron SmartSolar 75/10** - premium, Bluetooth monitoring via the VictronConnect app, excellent LiFePO4 support. Higher cost but extremely reliable for permanent installs. (The 75/10 has no dedicated load output; the comparable Victron load-output controllers are rated 15 A on the load terminal.)

## 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):

- **Absorption voltage:** 3.55 - 3.65 V/cell (use ~3.60 V/cell as the canonical absorption)
- **Float voltage:** 3.375 - 3.40 V/cell (use 3.375 V/cell). Do NOT float at 3.60 V/cell — that holds the pack near 100% SoC continuously and accelerates aging.

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):

- 12 V system (4S LiFePO4): LVD = 12.0 V (about 10-20% SoC remaining)

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.

<table id="bkmrk-regionwinter-pshsumm"><thead><tr><th>Region</th><th>Winter PSH</th><th>Summer PSH</th><th>Annual Average PSH</th></tr></thead><tbody><tr><td>Phoenix, AZ</td><td>4.5</td><td>7.5</td><td>6.0</td></tr><tr><td>Los Angeles, CA</td><td>4.0</td><td>6.0</td><td>5.2</td></tr><tr><td>Denver, CO</td><td>3.8</td><td>6.5</td><td>5.1</td></tr><tr><td>Dallas, TX</td><td>3.5</td><td>6.5</td><td>5.0</td></tr><tr><td>Atlanta, GA</td><td>3.2</td><td>5.5</td><td>4.5</td></tr><tr><td>Chicago, IL</td><td>2.5</td><td>5.5</td><td>4.0</td></tr><tr><td>Seattle, WA</td><td>1.5</td><td>5.5</td><td>3.5</td></tr><tr><td>Portland, OR</td><td>1.5</td><td>5.5</td><td>3.3</td></tr><tr><td>Anchorage, AK</td><td>0.5</td><td>6.0</td><td>3.0</td></tr></tbody></table>

*PSH source: values are conservative sizing-design figures derived from [NREL PVWatts](https://pvwatts.nrel.gov/) / 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

- **High-sun climates (AZ, NM, TX):** Standard sizing with modest battery. More at risk from heat-related battery degradation than insufficient solar.
- **Variable climates (CO, GA, NY):** Size for winter worst-case. A controller with proper charge termination prevents overcharge, so excess panel capacity in summer is simply wasted rather than harmful — **but only if the controller terminates charging correctly**. Summer heat itself stresses lithium cells: keep the battery shaded and ventilated, and do not charge Li-ion/LiPo above ~45 °C.
- **Low-sun climates (PNW, AK):** Over-size significantly. A 20W panel for a 1W load is not overkill in Portland. Alternatively, use a second backup charging source (wind generator, AC trickle charge from nearby structure). In sub-freezing weather, ensure the BMS or charge controller inhibits charging below 0 °C — charging a frozen lithium cell causes plating and a permanent internal-short hazard.

# 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

<table id="bkmrk-featurepwmmppt-effic"><thead><tr><th>Feature</th><th>PWM</th><th>MPPT</th></tr></thead><tbody><tr><td>Efficiency</td><td>70-75%</td><td>93-97%</td></tr><tr><td>Cost</td><td>$5-20</td><td>$30-150</td></tr><tr><td>Solar panel voltage matching</td><td>Must match battery voltage closely</td><td>Works with any panel voltage above battery voltage</td></tr><tr><td>Best for small systems</td><td>Under 5W with matched panel/battery</td><td>5W+ or when panel voltage exceeds battery voltage</td></tr><tr><td>Cold weather performance</td><td>Good</td><td>Excellent (harvests more from cold-weather voltage boost)</td></tr></tbody></table>

**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:

- Input: up to 75V open-circuit panel voltage, 10A max battery charge current
- Supports 12V and 24V battery systems
- Bluetooth monitoring via Victron Connect app - see real-time voltage, current, and charge state from your phone
- Load output: switched 15A continuous output (short-circuit proof) with built-in low-voltage disconnect that protects the battery. Note the 10A figure is the battery charge current rating, not the load output rating.
- Temperature compensation for accurate charging - this adjusts charge voltage for lead-acid chemistry; LiFePO4 does not use it, so disable it even in cold climates (see configuration below)

```
# 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:

- **Advantages of load output:** Built-in low-voltage disconnect protects battery; the controller manages when to power the node vs. when to conserve battery for recovery
- **Disadvantages:** Load output current limit (typically 10-15A) may not support higher-power loads; adds a small voltage drop (0.1-0.5V)

**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
```