锂电池电源管理
锂电池电源管理
本节介绍电子纸显示项目的锂电池(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 会永久损坏锂电池。请使用保护电路或电压截止。
电池管理系统
Section titled “电池管理系统”BMS 负责:
- 过充保护:在 4.2V 停止充电
- 过放保护:在约 3.0V 断开负载
- 短路保护:即时断开
- 均衡:用于多节电池(单节不需要)
带内置 BMS 的 ESP32 开发板
Section titled “带内置 BMS 的 ESP32 开发板”几种 ESP32 开发板集成了电池管理,使电池操作变得简单:
| 开发板 | 电池连接器 | 充电 IC | 最大充电电流 | 备注 |
|---|---|---|---|---|
| XIAO ESP32-C3 | JST-PH(2 针) | BQ25100 | 300 mA | 此项目理想选择 |
| ESP32-S3-DevKitC-1 | 无内置 | 需要外部 | — | 添加外部模块 |
| M5Stack Atom | JST-PH | IP5306 | 500 mA | 内置电源管理 |
| TTGO T-Display | JST-PH | TP4054 | 500 mA | 含显示屏 |
XIAO ESP32-C3 电池特性:
- 通过 USB-C 内置电池充电
- 自动电源切换(USB ↔ 电池)
- 通过 ADC 监测电池电压
- 睡眠模式下低静态电流
步骤 1:选择电池
Section titled “步骤 1:选择电池”对于电子纸显示项目:
计算所需电池容量:
# 功耗计算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 mAhsleep_energy = sleep_current * (sleep_time / 3600) # 0.05 * 0.9972 = 0.050 mAhtotal_per_cycle = active_energy + sleep_energy # 0.383 mAh
# 每日消耗cycles_per_day = 24daily_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 mAh | 30×20×5 mm | ~54 天 | 12g | $5-8 |
| 1200 mAh | 50×35×6 mm | ~130 天 | 25g | $10-15 |
| 2000 mAh | 65×40×6 mm | ~217 天 | 38g | $15-20 |
| 5000 mAh | 100×40×8 mm | ~543 天 | 80g | $25-35 |
步骤 2:连接电池
Section titled “步骤 2:连接电池”对于 XIAO ESP32-C3:
1. 准备电池 ┌───────────────────┐ │ 锂电池 │ │ 3.7V / 1200 mAh │ └──────┬──────┬─────┘ │ │ 红色(+) 黑色(-) │ │ ↓ ↓ ┌───────────────────┐ │ XIAO ESP32-C3 │ │ (JST-PH 排针) │ └───────────────────┘- 将电池 JST 连接器连接到 XIAO 的电池排针
- XIAO 自动检测电池
- 插入 USB 时,设备通过 USB 供电并给电池充电
- 拔掉 USB 时,设备无缝切换到电池供电
对于不带 BMS 的 ESP32:
添加外部 TP4056 充电模块:
USB 电源 ─→ [TP4056 充电器] ─→ 锂电池 │ ↓ [ESP32 Vin]接线:
TP4056 ESP32────── ─────OUT+ ───→ Vin(5V)OUT- ───→ GNDBAT+ ───→ 锂电池 +BAT- ───→ 锂电池 -步骤 3:监测电池电压
Section titled “步骤 3:监测电池电压”监测电池电量以在关机前提醒用户:
// 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);步骤 5:充电电路保护
Section titled “步骤 5:充电电路保护”安全建议:
- ✅ 始终使用带保护的电池——内置保护 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 分钟)
问题 2:电池电量迅速耗尽
Section titled “问题 2:电池电量迅速耗尽”症状:
- 电池续航低于预期
- 设备在睡眠时消耗 >100 µA
解决方案:
- 验证深度睡眠是否实际生效(测量电流)
- 检查 GPIO 上拉电阻是否消耗电力
- 在睡眠期间断开外部组件
// 睡眠前禁用所有外设digitalWrite(EPD_CS, HIGH); // 取消选中显示屏pinMode(EPD_RST, INPUT); // 高阻抗pinMode(EPD_DC, INPUT);问题 3:电池电压读数不准确
Section titled “问题 3:电池电压读数不准确”症状:
- 电压读数始终为 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 放电——电池可能过热
- 锂电池(3.7V)非常适合便携式 ESP32 电子纸项目
- 带内置 BMS 的开发板(如 XIAO ESP32-C3)简化了电池集成
- 电池容量选择取决于唤醒间隔和活动功耗
- 电压监测提供低电量警告并防止数据丢失
- 正确充电和处理对锂电池安全至关重要
- 使用 1200 mAh 电池和 1 小时间隔,可实现约 130 天的运行时间