跳转到内容

锂电池电源管理

锂电池电源管理

本节介绍电子纸显示项目的锂电池(LiPo)集成。正确的电池管理对于实现长期、免维护运行至关重要。完成本节后,你将能够:

  • 为 ESP32 项目选择合适的锂电池
  • 理解锂电池充电和保护电路
  • 将电池电源与具有内置电池管理的 ESP32 开发板集成
  • 监测电池电压以实现低电量警告

开始本节前,请确保:

  • 理解深度睡眠配置(参见 02-08
  • 对锂电池安全有基本了解
  • 带电池管理的 ESP32 开发板(推荐:XIAO ESP32-C3 或类似型号)

锂电池因其高能量密度和轻重量而成为便携式 IoT 设备的首选电源。

关键规格

参数描述典型值
电压(标称)放电期间的平均电压每节 3.7V
电压(满电)充满电时的最高电压每节 4.2V
电压(截止)最低安全电压每节 3.0-3.2V
容量总能量存储500-5000 mAh
C 倍率最大放电电流1C-5C
连接器物理连接类型JST-PH、Molex、引线

电压与电量水平

4.2V ── 100%(满电)
4.0V ── 80%
3.8V ── 50%
3.6V ── 20%
3.4V ── 5%
3.0V ── 0%(空电——立即断开)

警告:放电低于 3.0V 会永久损坏锂电池。请使用保护电路或电压截止。

BMS 负责:

  • 过充保护:在 4.2V 停止充电
  • 过放保护:在约 3.0V 断开负载
  • 短路保护:即时断开
  • 均衡:用于多节电池(单节不需要)

几种 ESP32 开发板集成了电池管理,使电池操作变得简单:

开发板电池连接器充电 IC最大充电电流备注
XIAO ESP32-C3JST-PH(2 针)BQ25100300 mA此项目理想选择
ESP32-S3-DevKitC-1无内置需要外部添加外部模块
M5Stack AtomJST-PHIP5306500 mA内置电源管理
TTGO T-DisplayJST-PHTP4054500 mA含显示屏

XIAO ESP32-C3 电池特性

  • 通过 USB-C 内置电池充电
  • 自动电源切换(USB ↔ 电池)
  • 通过 ADC 监测电池电压
  • 睡眠模式下低静态电流

对于电子纸显示项目

计算所需电池容量:

# 功耗计算
active_current = 120 # mA(WiFi + 显示刷新)
active_time = 10 # 每周期秒数
sleep_current = 0.05 # mA(50 µA 深度睡眠)
sleep_time = 3590 # 秒(1 小时 - 10 秒)
# 每周期能耗(mAh)
active_energy = active_current * (active_time / 3600) # 120 * 0.00278 = 0.333 mAh
sleep_energy = sleep_current * (sleep_time / 3600) # 0.05 * 0.9972 = 0.050 mAh
total_per_cycle = active_energy + sleep_energy # 0.383 mAh
# 每日消耗
cycles_per_day = 24
daily_consumption = total_per_cycle * cycles_per_day # 9.2 mAh
# 电池寿命估算
battery_capacity = 1200 # mAh(示例)
days_of_operation = battery_capacity / daily_consumption # 130 天

推荐电池

容量尺寸ESP32 运行时间(1 小时间隔)重量价格
500 mAh30×20×5 mm~54 天12g$5-8
1200 mAh50×35×6 mm~130 天25g$10-15
2000 mAh65×40×6 mm~217 天38g$15-20
5000 mAh100×40×8 mm~543 天80g$25-35

对于 XIAO ESP32-C3

1. 准备电池
┌───────────────────┐
│ 锂电池 │
│ 3.7V / 1200 mAh │
└──────┬──────┬─────┘
│ │
红色(+) 黑色(-)
│ │
↓ ↓
┌───────────────────┐
│ XIAO ESP32-C3 │
│ (JST-PH 排针) │
└───────────────────┘
  1. 将电池 JST 连接器连接到 XIAO 的电池排针
  2. XIAO 自动检测电池
  3. 插入 USB 时,设备通过 USB 供电并给电池充电
  4. 拔掉 USB 时,设备无缝切换到电池供电

对于不带 BMS 的 ESP32

添加外部 TP4056 充电模块:

USB 电源 ─→ [TP4056 充电器] ─→ 锂电池
[ESP32 Vin]

接线

TP4056 ESP32
────── ─────
OUT+ ───→ Vin(5V)
OUT- ───→ GND
BAT+ ───→ 锂电池 +
BAT- ───→ 锂电池 -

监测电池电量以在关机前提醒用户:

// XIAO ESP32-C3 的电池监测
// XIAO 有一个内部电压分压器连接到 GPIO 2
#define BATTERY_PIN 2 // XIAO ESP32-C3 电池测量引脚
void setup() {
Serial.begin(115200);
// 配置 ADC
analogReadResolution(12); // 12 位分辨率(0-4095)
// 读取电池电压
int rawValue = analogRead(BATTERY_PIN);
// 转换为电压
// XIAO 使用 2:1 电压分压器
float voltage = (rawValue / 4095.0) * 3.3 * 2;
Serial.print("电池电压:");
Serial.print(voltage);
Serial.println("V");
// 估算电池百分比
int batteryPercent = mapBatteryToPercent(voltage);
Serial.print("电池电量:");
Serial.print(batteryPercent);
Serial.println("%");
// 低电量警告
if (voltage < 3.4) {
Serial.println("警告:电量不足!");
// 在显示屏上显示低电量指示
}
}
int mapBatteryToPercent(float voltage) {
// 锂电池的近似映射
if (voltage >= 4.2) return 100;
if (voltage >= 4.0) return 80;
if (voltage >= 3.8) return 50;
if (voltage >= 3.6) return 20;
if (voltage >= 3.4) return 5;
return 0;
}

步骤 4:在电子纸上显示电池状态

Section titled “步骤 4:在电子纸上显示电池状态”

在显示屏上添加电池指示器:

void drawBatteryIcon(int x, int y, int percent) {
// 电池轮廓
display.drawRect(x, y, 30, 15, GxEPD_BLACK);
display.fillRect(x + 30, y + 4, 4, 7, GxEPD_BLACK); // 端子
// 填充电量
int fillWidth = map(percent, 0, 100, 0, 28);
if (fillWidth > 0) {
display.fillRect(x + 1, y + 1, fillWidth, 13, GxEPD_BLACK);
}
// 低电量指示
if (percent < 10) {
display.setFont(&FreeMono9pt7b);
display.setCursor(x, y + 25);
display.print("电量不足");
}
}
// 在显示更新中使用
drawBatteryIcon(210, 5, batteryPercent);

安全建议

  • 始终使用带保护的电池——内置保护 IC 的电池
  • 在防火区域充电——切勿在无人看管时给电池充电
  • 使用正确的充电器——具有恒流/恒压特性的锂电池专用充电器
  • 切勿刺穿或短路锂电池
  • 不要在 0°C 以下充电——永久损坏电池
  • 不要长时间满电存放——在 3.7-3.8V(50-60%)存放
  • 设备仅靠电池供电即可开机(USB 断开)
  • 插入 USB 时设备可充电
  • 电池电压读数在预期范围内(3.3V-4.2V)
  • 电压下降时显示屏上出现低电量警告
  • 设备在电池供电下至少运行 24 小时

问题 1:设备无法通过电池供电开机

Section titled “问题 1:设备无法通过电池供电开机”

症状

  • 设备在 USB 下工作但电池不行

解决方案

  • 用万用表检查电池电压(需要 >3.3V)
  • 验证 JST 连接器极性(红 = 正极,黑 = 负极)
  • 检查电池保护电路是否已触发(尝试充电 10 分钟)

症状

  • 电池续航低于预期
  • 设备在睡眠时消耗 >100 µA

解决方案

  • 验证深度睡眠是否实际生效(测量电流)
  • 检查 GPIO 上拉电阻是否消耗电力
  • 在睡眠期间断开外部组件
// 睡眠前禁用所有外设
digitalWrite(EPD_CS, HIGH); // 取消选中显示屏
pinMode(EPD_RST, INPUT); // 高阻抗
pinMode(EPD_DC, INPUT);

症状

  • 电压读数始终为 0V 或 4.2V

解决方案

  • 检查 ADC 引脚配置
  • 用已知电压校准 ADC
  • 添加平均滤波
// 平均电池读数
float readBatteryAverage() {
int total = 0;
for (int i = 0; i < 10; i++) {
total += analogRead(BATTERY_PIN);
delay(10);
}
float avg = (total / 10.0) / 4095.0 * 3.3 * 2;
return avg;
}
  • 选择带内置保护 IC 的电池——防止过放
  • 使用 JST-PH 连接器——锂电池的标准接口
  • 监测电池电压——在显示屏上显示状态
  • 不要混合使用不同化学性质的电池——坚持使用 3.7V 锂电池
  • 避免使用无保护的电池——存在永久性损坏风险
  • 不要超过 1C 放电——电池可能过热
  1. 锂电池(3.7V)非常适合便携式 ESP32 电子纸项目
  2. 带内置 BMS 的开发板(如 XIAO ESP32-C3)简化了电池集成
  3. 电池容量选择取决于唤醒间隔和活动功耗
  4. 电压监测提供低电量警告并防止数据丢失
  5. 正确充电和处理对锂电池安全至关重要
  6. 使用 1200 mAh 电池和 1 小时间隔,可实现约 130 天的运行时间