The input
The solar connector is a 2-pin JST-PH. The input window is 6 to 22 V, and the charger tracks the panel's maximum-power point on its own. There is no setup: plug the panel in and the charger starts drawing at the panel's MPPT voltage within a few seconds of sunlight.
Behind the connector are a reverse-polarity ideal diode, a 26 V TVS and the charger's programmable input overvoltage protection, set to 24 V. A panel plugged in backwards does nothing. A panel that overshoots the window is disconnected until it falls back inside it.
USB-C and solar have automatic priority with no back-feed between them. With both present the charger takes USB first and tops up from solar.
Panel classes
| Class | Vmp | Voc at 25 °C | Power on a 1S board | Power on the Pack |
|---|---|---|---|---|
| 6 V | about 6 V | 7 to 7.5 V | up to 12 W, limited by the 3.3 A input current ceiling | up to 12 W |
| 12 V | 17 to 18 V | 21 to 22 V | up to 10 W continuous, 15 W peak | up to 20 W |
Panels with Voc above 22 V are outside the window. A "24 V" panel is not an option on any board.
Ratings per board
| Board | Continuous | Peak |
|---|---|---|
| Snowbird Feather 1S, Snowbird Core 1S, Snowbird 18650, Snowbird Lite 1S | 10 W | 15 W |
| Snowbird Pack | 20 W | 20 W |
The limit is the board's area for shedding heat, not the charger. A 1S cell cannot use 20 W anyway: at the 3 A ceiling and 4.2 V the most a 1S cell takes is 12.6 W. On the Pack, 20 W is 1.2 A of charge at 4S and 2.4 A at 2S, which is where it does real work. Above 40 °C ambient the 1S boards derate to 8 W continuous and the Pack to 16 W, and the charger reports Charge::Held with Fault::OverTemp if the board itself crosses 65 °C.
Rate the draw, not the panel
A larger panel does no harm within the voltage window. The charger draws what the charge current and the load need and MPPT holds the panel at its maximum-power point; a 20 W 12 V-class panel on a Snowbird Feather 1S is simply run at 10 W. So there are two separate numbers: the input window (6 to 22 V) and the maximum draw (10 W or 20 W). Choose the panel by what the node needs per day, not by the board's rating.
Sizing a panel
Work from the daily energy budget to the panel, not the other way round.
- Daily load. Average current at 3.3 V times 24 h. A LoRa sensor node sleeping at 40 µA and transmitting for 2 s at 120 mA every 10 min averages about 0.44 mA, which is 35 mWh a day. An ESP32 Wi-Fi node waking for 5 s at 150 mA every 5 min averages about 2.5 mA, which is 200 mWh a day.
- Losses. Divide by 0.85 for the charger (94 % peak, lower at low power), the battery round trip and the 3.3 V regulator.
- Sun-hours. Equivalent full-sun hours per day for the worst month at the site. Southern British Columbia in December is about 1.0; in June about 6.5. Use the worst month.
- Panel power. Daily load after losses divided by sun-hours, with a margin of two for cloudy weeks.
Worked example: the ESP32 node at 200 mWh a day, divided by 0.85, is 235 mWh. At 1.0 sun-hour in December that is 235 mW of panel, times two for margin, so a 0.5 W panel would cover it on paper. Small 6 V panels start at 1 W, so a 1 W or 2 W 6 V-class panel is the answer, and the battery carries the node through the cloudy weeks: a 2000 mAh LiPo holds about 7.4 Wh, or 37 days of this load.
A node drawing ten times that (2 Wh a day) at the same site wants a 5 W panel and still a 2000 mAh cell for the dark weeks. The solar LoRa node reference build has the full worked budget with the measured figures.
Cold panels
Crystalline silicon gains about 0.3 % of open-circuit voltage per degree of cooling. A 12 V-class panel with Voc of 22 V at 25 °C reaches about 24.3 V at −10 °C and about 26 V at −35 °C, above the charger's 24 V operating maximum. A panel in full sun runs warmer than the air, but at the moment the charger is not drawing, with the battery full or the OVP just tripped, the panel is at open circuit and near air temperature. The protection can therefore hold the charger off on exactly the cold, clear mornings a winter node needs.
The rule:
| Site | Panel class |
|---|---|
| Panel temperature stays above about −10 °C | 12 V-class, up to 20 W on the Pack |
| Colder than that | 6 V-class, which caps the input near 12 W and never approaches the window |
For a winter node that needs more than 12 W, use two 6 V-class panels in parallel rather than one 12 V-class panel. Below 0 °C the cell cannot be charged either; the charger powers the load from the panel directly while the TS pin holds charging off, and the battery waits for a warmer hour. The Safety page has the temperature windows.
Reading it from the library
if (pmic.inputSource() == Input::Solar) {
Serial.printf("panel %u mW, today %u mWh\n",
pmic.solarPower_mW(), pmic.harvestedToday_mWh());
}
pmic.onEvent(Event::SolarDay | Event::SolarNight, onSolar);
solarPower_mW() is the panel power at the MPPT point, read from the charger's ADC. harvestedToday_mWh() accumulates from local midnight if setClock() has been called, otherwise from boot. The BLE broadcast carries the same two numbers, so a Home Assistant dashboard can plot a node's harvest without a line of code.
setMPPT(false) pins the input to a fixed voltage set by setInputVoltage_mV(), for bench supplies pretending to be panels. Leave it on for a real panel.