ELECTRONICS

TP4056 Type-C с защитой: зарядка 18650, подключение, распиновка B+ B− OUT

Питание и зарядкаСкетч проверен компиляцией

Маленькая синяя плата заряжает одну литиевую банку 3,7 В — 18650, плоский LiPo — от любого USB на 5 вольт и сразу же питает от неё устройство. Контроллер TP4056 сам ведёт заряд: держит ток 1 А, потом напряжение 4,2 В и останавливается, когда аккумулятор полон. Красный светодиод — идёт заряд, синий — готово.

Вторая половина платы — защита на DW01A и сдвоенном транзисторе 8205A. Она стоит между аккумулятором и нагрузкой и отключает выход, если банка разрядилась ниже 2,5 вольта, ток превысил 3 ампера или случилось короткое замыкание. Поэтому у модуля шесть контактов: вход, аккумулятор и выход для нагрузки.

Распиновка

ПроводКуда и зачем
+ и − (верхние)Вход 5 В — дублируют разъём Type-C. Можно подать 4,5–5,5 В проводами, например от солнечной панели через стабилизатор.
B+Плюс аккумулятора.
B−Минус аккумулятора.
OUT+Плюс нагрузки — на плате соединён с B+.
OUT−Минус нагрузки — через защиту. Нагрузку подключают только сюда, иначе защита не работает.

Характеристики

Контроллер заряда
TP4056 (линейный, CC/CV)
Защита
DW01A + 8205A
Вход
5 В: Type-C или контакты + и −, допустимо 4,5–5,5 В
Ток заряда
1 А (резистор R3 1,2 кОм)
Напряжение окончания заряда
4,2 В ± 1 %
Отключение при переразряде
около 2,5 В
Защита по току
около 3 А и короткое замыкание
Индикация
красный — заряжается, синий — заряжен
Размер платы
17 × 28,5 мм

Схема: фонарик на 18650

Схема фонарика на TP4056 Type-C: аккумулятор 18650 к B+ и B−, OUT+ к VCC Arduino Pro Mini, два белых светодиода на выводах 9 и 10, кнопка на выводе 2
Аккумулятор — к B+ и B−, Pro Mini питается с OUT+ и OUT−: всё устройство идёт через защиту модуля. Зарядка — в Type-C, фонарик при этом продолжает работать.
Запустить в симулятореЭта схема со скетчем — поменяйте что угодно и посмотрите токи · как работает симулятор

Библиотека

не нужна— Модулю код не нужен — он заряжает сам. Скетч фонарика обходится без библиотек: analogWrite для яркости и регистры АЦП, чтобы измерить своё питание.

Скетч: фонарик с режимами и предупреждением о разряде

// Фонарик на 18650: Pro Mini питается от аккумулятора через TP4056 (OUT+ → VCC).
// Кнопка на выводе 2 листает режимы, светодиоды на выводах 9 и 10 (ШИМ).
// Когда аккумулятор садится, фонарик сам уходит в слабый свет и мигает.

const int BUTTON = 2;
const int LED_A = 9;
const int LED_B = 10;

const int MODES = 5;                      // выкл, слабый, средний, яркий, стробоскоп
const int LEVELS[] = {0, 20, 90, 255};
const char* NAMES[] = {"off", "low", "mid", "high", "strobe"};
const long LOW_BATTERY_MV = 3400;         // около 10 % заряда: дальше литий быстро проседает

int mode = 0;
bool lastButton = HIGH;
bool lowBattery = false;
unsigned long lastCheck = 0;

// Напряжение аккумулятора, мВ: он подключён прямо к VCC, а АЦП меряет внутренние
// 1,1 В относительно VCC — ни делителя, ни свободного вывода не нужно.
long readVcc() {
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2);
  ADCSRA |= _BV(ADSC);
  while (bit_is_set(ADCSRA, ADSC));
  return 1125300L / ADC;
}

void setBrightness(int value) {
  analogWrite(LED_A, value);
  analogWrite(LED_B, value);
}

void setup() {
  pinMode(BUTTON, INPUT_PULLUP);
  pinMode(LED_A, OUTPUT);
  pinMode(LED_B, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  bool button = digitalRead(BUTTON);
  if (lastButton == HIGH && button == LOW) {   // нажали
    mode = (mode + 1) % MODES;
    Serial.print("Mode: ");
    Serial.println(NAMES[mode]);
    delay(30);                                  // дребезг
  }
  lastButton = button;

  if (millis() - lastCheck > 2000) {            // заряд — раз в две секунды
    lastCheck = millis();
    long vcc = readVcc();
    lowBattery = vcc < LOW_BATTERY_MV;
    Serial.print("VCC: ");
    Serial.print(vcc);
    Serial.println(lowBattery ? " mV - low battery" : " mV");
  }

  if (mode == 4) {
    setBrightness((millis() / 80) % 2 ? 255 : 0);              // стробоскоп
  } else if (lowBattery && mode > 0) {
    setBrightness(millis() % 3000 < 100 ? 0 : LEVELS[1]);      // сел: слабо и короткая вспышка
  } else {
    setBrightness(LEVELS[mode]);
  }
}

Скетч собирается arduino-cli под Arduino UNO

Свободный вывод под замер аккумулятора не нужен: аккумулятор подключён прямо к VCC, а readVcc() меряет внутренние 1,1 В относительно питания и пересчитывает в милливольты. Для настоящего фонарика берите Pro Mini на 3,3 В / 8 МГц: на 16 МГц ATmega по паспорту нужно от 4,5 В, хотя от лития обычно работает.

Частые ошибки

От зарядки телефона с Type-C не заряжает

На плате нет резисторов на линиях CC, по которым зарядка с разъёмом Type-C на обоих концах понимает, что подключено устройство, — и не подаёт 5 вольт. Нужен обычный USB-A блок на 5 В и кабель USB-A → Type-C.

Нагрузка подключена к B+ и B−

Так защита оказывается в стороне: переразряд и короткое замыкание никто не остановит. Аккумулятор — на B, всё остальное — только на OUT.

Синий светодиод не загорается при включённой нагрузке

TP4056 считает зарядом весь ток, который уходит в B+, а нагрузка берёт часть на себя. Ток не падает до 100 мА, и контроллер не видит конца заряда. Заряжайте с отключённой нагрузкой или ставьте модуль с разделением питания.

Модуль сильно греется

Это нормально: TP4056 линейный, лишние вольты он превращает в тепло — при 5 В на входе и 3,7 В на банке это больше ватта. Не кладите плату под корпус вплотную, а для маленького LiPo на 300–500 мА·ч уменьшите ток, поменяв R3 на 2,4–5,1 кОм.

Две банки последовательно

TP4056 заряжает только одну банку — 4,2 В. Две последовательно (8,4 В) им не зарядить, нужен контроллер для 2S. Параллельно — можно, это просто банка большей ёмкости.

Что понадобится