Overview
The 4S 30A 18650 Lithium Battery Protection Board (CF-4S30A-A) is a four-cell-series BMS that produces a nominal 14.8V output and fully charges to 16.8V. The 14.8V nominal voltage is widely used in cordless tools, e-bikes, solar power stations, drone batteries, and any 12-volt-replacement application that benefits from extra headroom for buck converters.
This board handles up to 30A continuous discharge with eight power MOSFETs in parallel, includes passive cell balancing on all four cells, and comes pre-wired with a 5-conductor balance cable for easy installation. Protection covers per-cell over-charge, per-cell over-discharge, total over-current, and short circuit.
At a Glance
Specifications
| Parameter | Value |
| Cell Configuration | 4S (four cells in series) |
| Nominal Pack Voltage | 14.8V (4 x 3.7V) |
| Full Charge Voltage | 16.8V (4 x 4.2V) |
| Per-Cell Over-Charge Cutoff | 4.25V - 4.35V |
| Per-Cell Over-Discharge Cutoff | 2.5V - 2.8V |
| Continuous Discharge Current | 30A |
| Peak Discharge Current | ~50A (short bursts) |
| Balancing Method | Passive resistor bleed |
| Balancing Threshold | Activated when a cell > 4.2V |
| Quiescent Current | < 50 uA |
| Balance Cable | 5-wire JST-style harness, included |
| Operating Temperature | -40 to +85 C |
| PCB Dimensions | ~56 x 45 x 8 mm |
Pinout Diagram
Wiring Guide
4S Battery Wiring
You need five wires (the pre-attached balance cable provides four of them, and the main B- and B+ pads carry the high-current path). Connect B- at the negative end, then B1, B2, B3 at each midpoint, and B+ at the positive end. Always connect in order from B- up to B+.
| BMS Pad | Battery Position | Voltage from B- |
|---|---|---|
| B- | Cell 1 Negative (lowest) | 0 V |
| B1 | Cell 1 + / Cell 2 - junction | 3.7 V |
| B2 | Cell 2 + / Cell 3 - junction | 7.4 V |
| B3 | Cell 3 + / Cell 4 - junction | 11.1 V |
| B+ | Cell 4 Positive (highest) | 14.8 V |
Load Wiring
Connect your load between the P+ and P- pads. The 30A continuous rating handles e-scooter ESCs, e-bike motors, inverter inputs, and high-power LED arrays. Use 12 AWG or thicker silicone wire for the main P+ and P- lines.
| BMS Pad | Load Terminal |
|---|---|
| P+ | Load Positive (+) input |
| P- | Load Negative (-) / GND |
Charging the Pack
Use a 4S Li-ion charger that outputs 16.8V CC/CV. Charge current should be 0.3C - 1C of the pack capacity. A 3 Ah 4S pack accepts 1 - 3A. The BMS handles overcharge cutoff; the balance cable allows hobby chargers (like the Imax B6) to balance each cell during charge for the most accurate result.
| Charger Pin | BMS Pad |
|---|---|
| Charger + (16.8V) | P+ |
| Charger - (GND) | P- |
| Balance Plug (optional) | JST-XH on balance cable |
Powering Microcontrollers and 12V/24V Loads
16V is too high for direct dev-board input. Step down with a buck converter to 5V or 12V depending on your project.
| BMS Output | Target | Details |
|---|---|---|
| P+ (14.8V) | Arduino Mega VIN | Direct (within 7-12V comfort but borderline — buck preferred) |
| P+ (14.8V) | ESP32 / Pico | Via 5V buck converter (LM2596 / MP1584) |
| P+ (14.8V) | Raspberry Pi 5V | Via 5V 3A buck converter |
| P+ (14.8V) | 12V loads | Via 12V buck converter |
| P+ (14.8V) | Brushed DC motors | Direct, with H-bridge driver |
| P- | Common GND | Tie all grounds |
Code Examples
The 4S 30A BMS has no digital interface. The code below measures pack voltage with a voltage divider on an ADC pin, useful for low-battery shutdowns or battery percentage displays on portable projects.
Arduino (Pack Voltage Monitor)
// 4S Pack Voltage Monitor for Arduino
// Voltage divider: P+ -- 680k -- A0 -- 100k -- GND
// Max ADC voltage at 16.8V: 16.8 * (100 / 780) = 2.15V
const int adcPin = A0;
const float dividerRatio = (680.0 + 100.0) / 100.0; // = 7.8
const float vRef = 5.0;
const float fullV = 16.8;
const float emptyV = 12.0;
void setup() {
Serial.begin(9600);
}
void loop() {
int raw = analogRead(adcPin);
float vAdc = (raw / 1023.0) * vRef;
float vPack = vAdc * dividerRatio;
float pct = ((vPack - emptyV) / (fullV - emptyV)) * 100.0;
if (pct > 100) pct = 100;
if (pct < 0) pct = 0;
Serial.print("Pack: ");
Serial.print(vPack, 2);
Serial.print(" V (");
Serial.print(pct, 0);
Serial.println(" %)");
delay(1000);
}
ESP32 (Pack Voltage Monitor with Low-Battery Cutoff)
// ESP32 reads 4S pack voltage via 680k/100k divider on GPIO34
// Trigger a "low battery" relay on GPIO25 when pack drops below 12.5V
const int adcPin = 34;
const int relayPin = 25;
const float dividerRatio = 7.8;
const float vRef = 3.3;
const float cutoffV = 12.5;
void setup() {
Serial.begin(115200);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW);
analogReadResolution(12);
}
void loop() {
int raw = analogRead(adcPin);
float vAdc = (raw / 4095.0) * vRef;
float vPack = vAdc * dividerRatio;
if (vPack < cutoffV) {
digitalWrite(relayPin, HIGH); // Shut down load
Serial.printf("LOW BATTERY %.2f V -- relay opened\n", vPack);
} else {
digitalWrite(relayPin, LOW);
Serial.printf("Pack: %.2f V\n", vPack);
}
delay(2000);
}
Raspberry Pi Pico (MicroPython)
# Pico reads 4S pack voltage through a 680k/100k divider on ADC0 (GP26)
from machine import ADC
import time
adc = ADC(0)
divider_ratio = 7.8
v_ref = 3.3
while True:
raw = adc.read_u16()
v_adc = (raw / 65535) * v_ref
v_pack = v_adc * divider_ratio
print("Pack: {:.2f} V".format(v_pack))
time.sleep(1)