Community project

Single-Cell Satellite EPS

ESP32
Photo of Single-Cell Satellite EPS
Generated with AI

Hrach YARALYAN

Published October 27, 2026

This guide builds a complete electrical power system (EPS) for a single-cell satellite or remote device. The system prioritizes USB input power when available, falls back to a solar panel, and intelligently charges a protected 3.7 V lithium-ion battery while monitoring its temperature. All three power sources feed into a regulated 3.3 V output rail via a buck-boost converter, ensuring stable power delivery across a wide input voltage range.

The guide provides a complete wiring diagram, detailed parts list, and step-by-step assembly instructions organized by functional block: input protection and fusing, USB priority selection, battery charging with thermal monitoring, voltage regulation, and sensor integration. Included firmware demonstrates how to read battery and solar panel voltages using the ESP32's analog inputs, with divider ratios calibrated for accurate telemetry.

Wiring diagram

Wiring diagram for Single-Cell Satellite EPS

Gather all the parts

QtyComponent
1

USB Type-C receptacle, USB2.0 power-only sink

The connector that accepts a 5 V USB-C power supply.

1

5 V unidirectional TVS diode for USB VBUS

A surge clamp that protects the USB 5 V input from cable transients.

1

Resettable USB input fuse, 0.75 A hold

A resettable fuse that limits fault current drawn from USB.

1

2-pin solar-panel connector

The connector for the nominal 5 V, 100 mA maximum solar panel.

1

6 V unidirectional TVS diode for solar input

A surge clamp across the solar input whose final voltage rating depends on the panel open-circuit voltage.

1

Resettable solar-input fuse, 0.10 A hold

A resettable fuse that protects the panel wiring from a downstream fault.

1

TPS2121RUXR priority power multiplexer

The dual-input ideal-diode power switch that gives USB input priority and blocks reverse current between inputs.

1

BQ25185DLHR 1-cell charger with power path

The single-cell Li-ion/Li-Po charger that powers the system first and reduces charging when input power is limited.

1

Protected 3.7 V 1200 mAh single-cell Li-ion/Li-Po battery

The protected rechargeable cell that stores energy and powers the prototype when no external input can meet the load.

1

10 kΩ NTC, B25/85 = 3435 K, battery-mounted

A temperature-sensitive resistor attached to the battery so charging stops if the cell is too hot or too cold.

1

TPS63802DLAR 3.3 V buck-boost regulator

The converter that holds the payload rail at 3.3 V as battery and power-path voltage change.

1

1x6 2.54 mm EPS output header

The payload connector carrying regulated power, the two measured-voltage nets, and optional UART signals.

1

5.1 kΩ 1% USB-C CC resistor

5.1 kΩ

The pull-down resistor that tells USB-C sources this is a power sink.

1

5.1 kΩ 1% USB-C CC resistor

5.1 kΩ

The pull-down resistor that tells USB-C sources this is a power sink.

1

10.2 kΩ 1% resistor

10.2 kΩ

Upper resistor that makes USB the TPS2121 priority input above its valid threshold.

1

5.00 kΩ 1% resistor

5.00 kΩ

Lower resistor that sets the USB-priority threshold of the power multiplexer.

1

80.0 kΩ 1% resistor

80.0 kΩ

The TPS2121 current-limit programming resistor; its typical limit is 1.5 A.

1

100 nF 16 V X7R ceramic capacitor

100 nF

The TPS2121 soft-start capacitor that limits output inrush during switchover.

1

1 µF 10 V X7R ceramic capacitor

1 µF

Local USB-input bypass capacitor at the power multiplexer.

1

1 µF 10 V X7R ceramic capacitor

1 µF

Local solar-input bypass capacitor at the power multiplexer.

1

18.0 kΩ 1% resistor

18.0 kΩ

The BQ25185 setting resistor for 4.2 V regulation and a 500 mA input-current limit.

1

1.00 kΩ 1% resistor

1.00 kΩ

The BQ25185 setting resistor for a nominal 300 mA fast-charge current.

1

1 µF 25 V X7R ceramic capacitor

1 µF

Input bypass capacitor placed directly at the BQ25185 input pin.

1

10 µF 10 V X7R ceramic capacitor

10 µF

System-rail bypass capacitor placed directly at the BQ25185 SYS pin.

1

1 µF 10 V X7R ceramic capacitor

1 µF

Battery-pin bypass capacitor placed directly at the BQ25185 BAT pin.

1

Coilcraft XFL4015-471ME, 0.47 µH power inductor

0.47 µH

The low-resistance 5.4 A rated inductor used by the TPS63802 switching regulator.

1

10 µF 6.3 V X7R ceramic capacitor

10 µF

Input bypass capacitor placed directly at the TPS63802 VIN pin.

1

22 µF 6.3 V X7R ceramic capacitor

22 µF

Minimum regulated-output capacitor placed directly at the TPS63802 output pin.

1

511 kΩ 1% resistor

511 kΩ

Upper TPS63802 feedback resistor that sets the regulator to 3.3 V.

1

91.0 kΩ 1% resistor

91.0 kΩ

Lower TPS63802 feedback resistor that sets the regulator to 3.3 V.

1

220 kΩ 1% resistor

220 kΩ

Upper battery monitor divider resistor.

1

100 kΩ 1% resistor

100 kΩ

Lower battery monitor divider resistor.

1

100 nF 10 V X7R ceramic capacitor

100 nF

Battery sense low-pass filter capacitor.

1

330 kΩ 1% resistor

330 kΩ

Upper solar monitor divider resistor.

1

68.0 kΩ 1% resistor

68.0 kΩ

Lower solar monitor divider resistor.

1

100 nF 16 V X7R ceramic capacitor

100 nF

Solar sense low-pass filter capacitor.

1

Loop test point

A probe point for checking protected USB input voltage.

1

Loop test point

A probe point for checking protected solar input voltage.

1

Loop test point

A probe point for checking battery voltage.

1

Loop test point

A probe point for checking charger SYS voltage.

1

Loop test point

A probe point for checking regulated 3.3 V output.

Assemble it in 6 steps

1. Place the input protection parts

Place the USB-C connector and solar connector at the board edge. Put the USB TVS diode and USB resettable fuse beside the USB connector, and put the solar TVS diode and solar resettable fuse beside the solar connector. Keep each TVS diode's ground end short and wide to the ground plane so it can divert a surge before it reaches the EPS.

  • Do not connect a solar panel until its open-circuit voltage has been checked; an over-voltage panel can damage the input protection and charger.

2. Build the USB-priority selector

Place the TPS2121 beside the two protected inputs. Connect USB through the USB fuse to IN1 and solar through the solar fuse to IN2. Fit the 10.2 kΩ and 5.00 kΩ resistors from USB input to PR1 and then to ground, so a valid USB source wins. Fit the 80.0 kΩ ILIM resistor and 100 nF SS capacitor to ground, and place both 1 µF input capacitors directly beside the IC.

  • Keep IN1, IN2, OUT, and their bypass capacitors in a tight group; these are the high-current paths.

3. Wire the battery charger and temperature check

Place the BQ25185 close to the battery connector. Connect the protected cell positive lead to BAT and the negative lead to GND. Attach the 10 kΩ NTC tightly to the battery pouch or cell holder, then wire it from TS/MR to ground. Fit the 18.0 kΩ and 1.00 kΩ setting resistors to ground and place the 1 µF, 10 µF, and 1 µF capacitors directly beside IN, SYS, and BAT.

  • Make sure battery positive and negative are not swapped — reverse battery wiring can damage the charger even when the cell itself is protected.
  • Do not charge a swollen, punctured, or unlabelled lithium cell.

4. Build the regulated 3.3 V rail

Place the 0.47 µH inductor, 10 µF input capacitor, 22 µF output capacitor, and the 511 kΩ / 91.0 kΩ feedback resistors immediately around the TPS63802. Connect SYS to VIN and tie EN high to SYS. Tie MODE to ground for low-load power-save operation. Route the switching loop between L1, L2, and the inductor as short and wide copper traces.

  • Do not run the battery-sense or solar-sense traces through the inductor area; switching noise can make the readings inaccurate.

5. Add the monitor dividers and output header

Fit the 220 kΩ over 100 kΩ battery divider and its 100 nF capacitor, then route its midpoint to BAT_SENSE and ESP32 GPIO34. Fit the 330 kΩ over 68.0 kΩ solar divider and its 100 nF capacitor, then route its midpoint to SOLAR_SENSE and ESP32 GPIO35. Connect the output header's 3V3 and GND pins to the regulated rail and ground, and connect UART_TX to GPIO17 and UART_RX to GPIO16.

  • GPIO34 and GPIO35 are input-only pins, which is exactly what these voltage measurements need.

6. Fit and use the test points

Fit the five loop test points on protected USB input, protected solar input, battery positive, SYS, and 3.3 V. Before connecting the ESP32 payload, check each point with a multimeter: battery must never exceed 4.2 V while charging and the output must be close to 3.3 V.

  • Do not short a test-point loop with a probe tip; a lithium battery can supply enough current to overheat traces or wires.

Review all connections

1. Connections between "usb_c" and "ESP32"

Functionusb_cESP32
powerVBUS → Resettable USB input fuse, 0.75 A hold INEXT
groundGNDGND
groundSHIELDGND
digitalCC1 → 5.1 kΩ 1% USB-C CC resistor 1EXT
digitalCC2 → 5.1 kΩ 1% USB-C CC resistor 1EXT

2. Connections between "r_cc1" and "ESP32"

Functionr_cc1ESP32
ground2GND

3. Connections between "r_cc2" and "ESP32"

Functionr_cc2ESP32
ground2GND

4. Connections between "usb_esd" and "ESP32"

Functionusb_esdESP32
powerA → Resettable USB input fuse, 0.75 A hold INEXT
groundKGND

5. Connections between "usb_ptc" and "ESP32"

Functionusb_ptcESP32
powerOUT → TPS2121RUXR priority power multiplexer IN1EXT

6. Connections between "c_mux_usb" and "ESP32"

Functionc_mux_usbESP32
power1 → TPS2121RUXR priority power multiplexer IN1EXT
ground2GND

7. Connections between "tp_vbus" and "ESP32"

Functiontp_vbusESP32
powerTP → TPS2121RUXR priority power multiplexer IN1EXT

8. Connections between "solar_in" and "ESP32"

Functionsolar_inESP32
powerPV+ → Resettable solar-input fuse, 0.10 A hold INEXT
groundPV-GND

9. Connections between "solar_esd" and "ESP32"

Functionsolar_esdESP32
powerA → Resettable solar-input fuse, 0.10 A hold INEXT
groundKGND

10. Connections between "solar_ptc" and "ESP32"

Functionsolar_ptcESP32
powerOUT → TPS2121RUXR priority power multiplexer IN2EXT

11. Connections between "c_mux_solar" and "ESP32"

Functionc_mux_solarESP32
power1 → TPS2121RUXR priority power multiplexer IN2EXT
ground2GND

12. Connections between "tp_solar" and "ESP32"

Functiontp_solarESP32
powerTP → TPS2121RUXR priority power multiplexer IN2EXT

13. Connections between "power_mux" and "ESP32"

Functionpower_muxESP32
powerOUT → BQ25185DLHR 1-cell charger with power path INEXT
groundGNDGND
analogPR1 → 10.2 kΩ 1% resistor 2EXT
groundCP2GND
groundOV1GND
groundOV2GND
analogILIM → 80.0 kΩ 1% resistor 1EXT
analogSS → 100 nF 16 V X7R ceramic capacitor 1EXT

14. Connections between "r_pr1_hi" and "ESP32"

Functionr_pr1_hiESP32
analog1 → TPS2121RUXR priority power multiplexer IN1EXT

15. Connections between "r_pr1_lo" and "ESP32"

Functionr_pr1_loESP32
analog1 → TPS2121RUXR priority power multiplexer PR1EXT
ground2GND

16. Connections between "r_mux_ilim" and "ESP32"

Functionr_mux_ilimESP32
ground2GND

17. Connections between "c_mux_ss" and "ESP32"

Functionc_mux_ssESP32
ground2GND

18. Connections between "charger" and "ESP32"

FunctionchargerESP32
groundGNDGND
powerBAT → Protected 3.7 V 1200 mAh single-cell Li-ion/Li-Po battery B+EXT
ground/CEGND
analogISET → 1.00 kΩ 1% resistor 1EXT
analogILIM/VSET → 18.0 kΩ 1% resistor 1EXT
powerSYS → TPS63802DLAR 3.3 V buck-boost regulator VINEXT

19. Connections between "battery" and "ESP32"

FunctionbatteryESP32
groundB-GND

20. Connections between "battery_ntc" and "ESP32"

Functionbattery_ntcESP32
analogTS → BQ25185DLHR 1-cell charger with power path TS/MREXT
groundGNDGND

21. Connections between "r_chg_iset" and "ESP32"

Functionr_chg_isetESP32
ground2GND

22. Connections between "r_chg_ilimvset" and "ESP32"

Functionr_chg_ilimvsetESP32
ground2GND

23. Connections between "c_chg_in" and "ESP32"

Functionc_chg_inESP32
power1 → BQ25185DLHR 1-cell charger with power path INEXT
ground2GND

24. Connections between "c_sys" and "ESP32"

Functionc_sysESP32
power1 → BQ25185DLHR 1-cell charger with power path SYSEXT
ground2GND

25. Connections between "c_bat" and "ESP32"

Functionc_batESP32
power1 → BQ25185DLHR 1-cell charger with power path BATEXT
ground2GND

26. Connections between "tp_bat" and "ESP32"

Functiontp_batESP32
powerTP → BQ25185DLHR 1-cell charger with power path BATEXT

27. Connections between "tp_sys" and "ESP32"

Functiontp_sysESP32
powerTP → TPS63802DLAR 3.3 V buck-boost regulator VINEXT

28. Connections between "c_buck_in" and "ESP32"

Functionc_buck_inESP32
power1 → TPS63802DLAR 3.3 V buck-boost regulator VINEXT
ground2GND

29. Connections between "buckboost" and "ESP32"

FunctionbuckboostESP32
groundGNDGND
groundAGNDGND
digitalEN → BQ25185DLHR 1-cell charger with power path SYSEXT
groundMODEGND
powerVOUT → 1x6 2.54 mm EPS output header 3V3EXT

30. Connections between "l_buck" and "ESP32"

Functionl_buckESP32
power1 → TPS63802DLAR 3.3 V buck-boost regulator L1EXT
power2 → TPS63802DLAR 3.3 V buck-boost regulator L2EXT

31. Connections between "c_3v3" and "ESP32"

Functionc_3v3ESP32
power1 → 1x6 2.54 mm EPS output header 3V3EXT
ground2GND

32. Connections between "tp_3v3" and "ESP32"

Functiontp_3v3ESP32
powerTP → 1x6 2.54 mm EPS output header 3V3EXT

33. Connections between "r_fb_top" and "ESP32"

Functionr_fb_topESP32
analog1 → TPS63802DLAR 3.3 V buck-boost regulator VOUTEXT
analog2 → TPS63802DLAR 3.3 V buck-boost regulator FBEXT

34. Connections between "r_fb_bottom" and "ESP32"

Functionr_fb_bottomESP32
analog1 → TPS63802DLAR 3.3 V buck-boost regulator FBEXT
ground2GND

35. Connections between "output_header" and "ESP32"

Functionoutput_headerESP32
groundGNDGND
analogBAT_SENSEGPIO 34
analogSOLAR_SENSEGPIO 35
uartUART_TXGPIO 17
uartUART_RXGPIO 16

36. Connections between "r_bat_top" and "ESP32"

Functionr_bat_topESP32
analog1 → BQ25185DLHR 1-cell charger with power path BATEXT
analog2 → 1x6 2.54 mm EPS output header BAT_SENSEEXT

37. Connections between "r_bat_bottom" and "ESP32"

Functionr_bat_bottomESP32
ground2GND
analog1 → 1x6 2.54 mm EPS output header BAT_SENSEEXT

38. Connections between "c_bat_sense" and "ESP32"

Functionc_bat_senseESP32
ground2GND
analog1 → 1x6 2.54 mm EPS output header BAT_SENSEEXT

39. Connections between "r_solar_top" and "ESP32"

Functionr_solar_topESP32
analog1 → TPS2121RUXR priority power multiplexer IN2EXT
analog2 → 1x6 2.54 mm EPS output header SOLAR_SENSEEXT

40. Connections between "r_solar_bottom" and "ESP32"

Functionr_solar_bottomESP32
ground2GND
analog1 → 1x6 2.54 mm EPS output header SOLAR_SENSEEXT

41. Connections between "c_solar_sense" and "ESP32"

Functionc_solar_senseESP32
ground2GND
analog1 → 1x6 2.54 mm EPS output header SOLAR_SENSEEXT

Deploy the firmware

#include <Arduino.h>

constexpr int BAT_SENSE_PIN = 34;
constexpr int SOLAR_SENSE_PIN = 35;
constexpr float ADC_FULL_SCALE_COUNTS = 4095.0f;
constexpr float ADC_REFERENCE_VOLTS = 3.3f;
// Divider ratios: battery = 100k/(220k+100k); solar = 68k/(330k+68k).
constexpr float BATTERY_DIVIDER_RATIO = 100.0f / 320.0f;
constexpr float SOLAR_DIVIDER_RATIO = 68.0f / 398.0f;

float readScaledVoltage(int pin, float dividerRatio) {
  const uint32_t raw = analogRead(pin);
  const float adcVoltage = (static_cast<float>(raw) * ADC_REFERENCE_VOLTS) / ADC_FULL_SCALE_COUNTS;
  return adcVoltage / dividerRatio;
}

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
  analogSetPinAttenuation(BAT_SENSE_PIN, ADC_11db);
  analogSetPinAttenuation(SOLAR_SENSE_PIN, ADC_11db);
}

void loop() {
  const float batteryVoltage = readScaledVoltage(BAT_SENSE_PIN, BATTERY_DIVIDER_RATIO);
  const float solarVoltage = readScaledVoltage(SOLAR_SENSE_PIN, SOLAR_DIVIDER_RATIO);

  Serial.print("BAT_SENSE: ");
  Serial.print(batteryVoltage, 3);
  Serial.print(" V, SOLAR_SENSE: ");
  Serial.print(solarVoltage, 3);
  Serial.println(" V");

  delay(1000);
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik