Overview
The HX-2S-JH20 is a 2S battery management system (BMS) designed for two 3.7V Li-ion or LiPo cells wired in series, producing a 7.4V nominal pack voltage (8.4V fully charged). It provides over-charge, over-discharge, over-current, and short-circuit protection with a built-in passive cell balancer that helps keep both cells at matching voltages during charging.
Rated for up to 10A continuous discharge, this BMS is ideal for powering Bluetooth speakers, small motors, ESP32 mesh nodes, LED strips, and DIY power banks that need a higher voltage than a single cell. The board uses dual N-channel MOSFETs and a 2S protection IC, with a clean 3-pin layout (B+, BM, B-) for the battery side and P+/P- for the load.
At a Glance
Specifications
| Parameter | Value |
| Cell Configuration | 2S (two cells in series) |
| Nominal Pack Voltage | 7.4V (2 x 3.7V) |
| Full Charge Voltage | 8.4V (2 x 4.2V) |
| Per-Cell Over-Charge Cutoff | 4.25V - 4.35V |
| Per-Cell Over-Discharge Cutoff | 2.4V - 2.6V |
| Continuous Discharge Current | 10A |
| Peak Discharge Current | ~15A (short bursts) |
| Balancing Method | Passive resistor bleed |
| Balancing Current | ~40 mA per cell |
| Quiescent Current | < 30 uA |
| Operating Temperature | -40 to +85 C |
| PCB Dimensions | ~50 x 22 x 3.5 mm |
Pinout Diagram
Wiring Guide
2S Battery Wiring
The HX-2S-JH20 requires three connections to the battery pack: the negative terminal of cell 1 (B-), the midpoint between the two cells (BM), and the positive terminal of cell 2 (B+). The BM tap is critical — without it the BMS cannot monitor or balance individual cells.
| BMS Pad | Battery Connection |
|---|---|
| B- | Cell 1 Negative (lowest) |
| BM | Cell 1 Positive + Cell 2 Negative (midpoint) |
| B+ | Cell 2 Positive (highest) |
Load Wiring
Connect your load (motor controller, boost regulator, ESP32 with buck, etc.) to the P+ and P- pads. The protection MOSFETs disconnect the load if either cell hits over-discharge or if total current exceeds 10A.
| BMS Pad | Load Terminal |
|---|---|
| P+ | Load Positive (+) input |
| P- | Load Negative (-) / GND |
Charging the Pack
Use a dedicated 2S Li-ion charger that outputs 8.4V at constant-voltage / constant-current (CC/CV). Connect the charger's positive output to P+ and negative output to P-. The BMS will monitor both cells, allow balancing current to flow during charge, and cut off automatically when both cells reach 4.2V.
| Charger Pin | BMS Pad |
|---|---|
| Charger + (8.4V) | P+ |
| Charger - (GND) | P- |
Powering Microcontrollers
7.4V is too high to feed directly into ESP32 or Pico VIN pins (their LDO regulators can't dissipate the heat). Use a buck converter or LDO to step down to 5V, then feed that to your dev board.
| BMS Output | Microcontroller | Details |
|---|---|---|
| P+ (7.4V) | Arduino Uno VIN | Direct (VIN accepts 7-12V) |
| P+ (7.4V) | ESP32 / Pico | Via 5V buck converter (LM2596 or MP1584) |
| P+ (7.4V) | Raspberry Pi 5V | Via 5V buck converter (3A+ rated) |
| P+ (7.4V) | 5V DC motors | Via 5V buck or motor driver |
| P- | Common GND | Ground reference for all |
Code Examples
The HX-2S-JH20 is a passive protection module without a digital interface. The code below shows how to monitor pack voltage with an ADC and voltage divider, useful for displaying a battery indicator or triggering low-battery warnings in your firmware.
Arduino (Pack Voltage Monitor)
// HX-2S-JH20 Pack Voltage Monitor for Arduino
// Voltage divider: P+ -- 220k -- A0 -- 100k -- GND (max ~8.4V/3.2 = 2.6V at A0)
const int adcPin = A0;
const float dividerRatio = (220.0 + 100.0) / 100.0; // = 3.2
const float vRef = 5.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 - 6.0) / (8.4 - 6.0)) * 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)
// ESP32 reads pack voltage through a 330k/100k divider
// 8.4V / 4.3 = 1.95V at ADC -- well within 3.3V range
const int adcPin = 34;
const float dividerRatio = (330.0 + 100.0) / 100.0; // = 4.3
const float vRef = 3.3;
void setup() {
Serial.begin(115200);
analogReadResolution(12);
}
void loop() {
int raw = analogRead(adcPin);
float vAdc = (raw / 4095.0) * vRef;
float vPack = vAdc * dividerRatio;
Serial.printf("Pack: %.2f V\n", vPack);
delay(1000);
}
Raspberry Pi Pico (MicroPython)
# Pico reads pack voltage through a 330k/100k divider on ADC0 (GP26)
# 8.4V / 4.3 = 1.95V at ADC -- safely below 3.3V
from machine import ADC
import time
adc = ADC(0)
divider_ratio = 4.3
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)