Overview
The 1S 3.7V 3A 2MOS BMS is a compact lithium-ion battery protection circuit designed for a single 3.7V Li-ion or LiPo cell (typically an 18650, 14500, or pouch cell). It guards against over-charge, over-discharge, and over-current using dual DW01 + 8205A protection ICs, allowing safe use of a single cell to power microcontrollers, small motors, LED projects, and DIY power banks.
The board provides up to 3A continuous discharge current, automatic recovery after fault clearance, and extremely low quiescent current — perfect for keeping your batteries safe during long-term portable projects. It is small enough to be soldered directly to a single 18650 cell holder and is widely used in ESP32 and Raspberry Pi Pico battery-powered builds.
At a Glance
Specifications
| Parameter | Value |
| Cell Configuration | 1S (single cell) |
| Nominal Battery Voltage | 3.7V |
| Full Charge Voltage | 4.2V |
| Over-Charge Protection | 4.25V - 4.35V |
| Over-Discharge Protection | 2.3V - 2.5V |
| Over-Current Protection | ~3A (trip threshold) |
| Short Circuit Protection | Yes, auto-recovery |
| Protection ICs | DW01A + Dual 8205A MOSFETs |
| Quiescent Current | < 6 uA |
| Internal Resistance | < 50 mOhm |
| Operating Temperature | -40 to +85 C |
| PCB Dimensions | ~33 x 7 x 3 mm |
Pinout Diagram
Wiring Guide
Battery Wiring
Solder a single 3.7V Li-ion or LiPo cell to the B+ and B- pads on one end of the board. Use short, heavy-gauge wire (22 AWG or thicker) to minimize voltage drop under load.
| BMS Pad | Battery Terminal |
|---|---|
| B+ | Battery Positive (+) |
| B- | Battery Negative (-) |
Load Wiring
Your project (microcontroller, motor, LED strip, etc.) connects to the P+ and P- pads. The protection circuit sits between the battery and the load, so all current to and from your load flows through the BMS.
| BMS Pad | Load Terminal |
|---|---|
| P+ | Load Positive (+) input |
| P- | Load Negative (-) / GND |
Charging the Battery
This board protects the battery but does not charge it. To charge, connect a dedicated 1S Li-ion charger (such as the ShillehTek TP4056 charging board) to the P+ and P- pads. The protection IC monitors charge voltage and disconnects at ~4.25V to prevent over-charge.
| Charger Pin | BMS Pad |
|---|---|
| OUT+ (Charger) | P+ |
| OUT- (Charger) | P- |
Powering Microcontrollers
A 3.7V cell can directly power ESP32, Raspberry Pi Pico, and Arduino Pro Mini (3.3V) boards through their battery input pins. For 5V boards (Arduino Uno, Raspberry Pi), use a boost converter between the BMS P+/P- output and your board's 5V input.
| BMS Output | Microcontroller | Details |
|---|---|---|
| P+ | ESP32 VIN / Pico VSYS | Direct 3.7V |
| P+ | Arduino Uno 5V | Via MT3608 boost converter |
| P+ | Raspberry Pi 5V | Via boost converter (3A+ rated) |
| P- | GND | Common ground |
Code Examples
This is a passive protection module — there is no I2C, SPI, or UART interface to read from microcontroller code. However, you can monitor battery voltage on an ADC pin using a voltage divider to display state of charge.
Arduino (Battery Voltage Monitor)
// 1S BMS Battery Voltage Monitor
// Connect P+ to a voltage divider (100k / 100k) and read midpoint with A0
// Vbat range: 2.5V (cutoff) to 4.2V (full)
const int adcPin = A0;
const float dividerRatio = 2.0; // 100k + 100k = halves the voltage
const float vRef = 5.0; // Arduino Uno reference
void setup() {
Serial.begin(9600);
}
void loop() {
int raw = analogRead(adcPin);
float vAdc = (raw / 1023.0) * vRef;
float vBat = vAdc * dividerRatio;
// Map to a percentage (very rough)
float pct = ((vBat - 3.0) / (4.2 - 3.0)) * 100.0;
if (pct > 100) pct = 100;
if (pct < 0) pct = 0;
Serial.print("Battery: ");
Serial.print(vBat, 2);
Serial.print(" V (");
Serial.print(pct, 0);
Serial.println(" %)");
delay(1000);
}
ESP32 (Battery Voltage Monitor)
// ESP32 reads P+ through a 220k/100k divider (max 3.3V at ADC)
// Connect: P+ -- 220k -- ADC34 -- 100k -- GND
const int adcPin = 34;
const float dividerRatio = (220.0 + 100.0) / 100.0; // = 3.2
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 vBat = vAdc * dividerRatio;
Serial.printf("Battery: %.2f V\n", vBat);
delay(1000);
}
Raspberry Pi Pico (MicroPython)
# Pico reads P+ through a 100k/100k divider on ADC0 (GP26)
# Connect: P+ -- 100k -- GP26 -- 100k -- GND
from machine import ADC, Pin
import time
adc = ADC(0) # GP26
divider_ratio = 2.0
v_ref = 3.3
while True:
raw = adc.read_u16()
v_adc = (raw / 65535) * v_ref
v_bat = v_adc * divider_ratio
print("Battery: {:.2f} V".format(v_bat))
time.sleep(1)