跳转到内容

100天电池寿命实现

100天电池寿命实现

本节展示如何通过硬件选择、功耗优化和高效固件相结合,实现 100 天以上的电池寿命。学习完本节后,您将能够:

  • 解释完整的功耗优化策略
  • 配置所有系统参数以实现最长电池寿命
  • 演示每项优化如何对最终结果做出贡献
  • 向客户传达 100 天电池寿命的实现情况

开始本节前,请确保:

  • 已完成 04-0504-08 各节
  • 理解每次按压的能耗(04-06 节)
  • 具备可用的硬件配置(XIAO + 电池 + 按键)

单次充电实现 100 天使用是工业 IoT 按钮常见的客户需求。通过适当的优化,这一目标是可以实现的:

100 天目标要求:
┌────────────────────────────────┐
│ 总能量预算: │
│ 350 mAh × 80% = 280 mAh │
│ 每日预算:2.8 mAh/天 │
├────────────────────────────────┤
│ 每天按压 2 次: │
│ 睡眠:0.12 mAh/天 │
│ 活跃:0.058 mAh × 2 = │
│ 0.116 mAh/天 │
│ 总计:0.236 mAh/天 │
│ 预期寿命:1,186 天 │
└────────────────────────────────┘

100 天电池寿命通过四个层次的优化实现:

第 1 层:硬件选择 ──── XIAO ESP32-C3(5 µA 深度睡眠)
第 2 层:深度睡眠逻辑 ──── 99.9% 的时间处于睡眠
第 3 层:快速 WiFi + MQTT ──── 每次按压活跃时间低于 5 秒
第 4 层:电池容量 ──── 350 mAh LiPo 电池
组件选择原因
开发板XIAO ESP32-C3深度睡眠:约 5 µA(普通 ESP32 约 10 µA)
稳压器XIAO 板载稳压器约 2 µA 静态电流
电池350 mAh LiPo容量和尺寸的良好平衡
按键带内部上拉的轻触开关无需外部电阻

设备几乎 100% 的时间处于深度睡眠状态:

void configureDeepSleep() {
// 确保所有 GPIO 处于低漏电状态
pinMode(BUTTON_PIN, INPUT_PULLUP); // 带内部上拉的按键
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW); // LED 关闭
// 禁用所有外设
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
// 配置唤醒源
esp_sleep_enable_ext0_wakeup(
(gpio_num_t)BUTTON_PIN,
0 // 在 LOW 电平唤醒(按键按下)
);
// 可选:定时器唤醒备份,用于健康检查
// esp_sleep_enable_timer_wakeup(24 * 3600 * 1000000ULL); // 每 24 小时
}

完整的活跃循环(唤醒 → WiFi → MQTT → 睡眠)经过速度优化:

void optimizedPressCycle() {
unsigned long cycleStart = millis();
// 1. 使用缓存的 BSSID 快速连接 WiFi(约 1.5s)
fastWiFiConnect();
if (WiFi.status() != WL_CONNECTED) {
goToSleep(); // 不要浪费能量重试
return;
}
// 2. 快速 MQTT 连接和发布(约 1s)
fastMQTTConnect();
mqttClient.publish(TOPIC, "{\"action\":\"toggle\",\"battery\":" +
String(readBatteryVoltage()) + "}");
// 3. 立即清理,无不必要的延迟
mqttClient.disconnect();
WiFi.disconnect(true);
unsigned long activeMs = millis() - cycleStart;
Serial.print("活跃循环:");
Serial.print(activeMs);
Serial.println(" ms");
goToSleep();
}
void goToSleep() {
Serial.flush();
esp_deep_sleep_start(); // 不会返回
}
容量可实现寿命(每天 2 次按压)物理尺寸重量
150 mAh约 500 天25×12×5 mm约 5 g
300 mAh约 1,000 天30×20×5 mm约 8 g
350 mAh约 1,180 天35×20×6 mm约 9 g
500 mAh约 1,685 天35×25×5 mm约 12 g

对于 100 天目标,即使是 150 mAh 电池也足够。350 mAh 电池提供了充足的安全余量。

#include <WiFi.h>
#include <PubSubClient.h>
// 引脚配置
const int BUTTON_PIN = 2;
const int BATTERY_ADC = 1;
// WiFi 凭据
const char* SSID = "FactoryWiFi";
const char* PASS = "password";
// MQTT 配置
const char* BROKER = "192.168.1.100";
const int PORT = 1883;
const char* TOPIC = "factory/button/01/press";
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
float readBattery() {
return (analogRead(BATTERY_ADC) / 4095.0) * 3.3 * 2;
}
void fastWiFiConnect() {
WiFi.mode(WIFI_STA);
WiFi.setSleep(false);
WiFi.begin(SSID, PASS);
unsigned long start = millis();
while (WiFi.status() != WL_CONNECTED &&
millis() - start < 5000) {
delay(50);
}
}
void fastMQTTConnect() {
String clientId = "BTN_" + String((uint32_t)ESP.getEfuseMac(), HEX);
mqttClient.setServer(BROKER, PORT);
mqttClient.connect(clientId.c_str());
}
void goToSleep() {
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
Serial.flush();
esp_sleep_enable_ext0_wakeup((gpio_num_t)BUTTON_PIN, 0);
esp_deep_sleep_start();
}
void setup() {
Serial.begin(115200);
delay(100);
Serial.println("按键已按下 - 执行操作");
// 快速循环:WiFi → MQTT → 睡眠
fastWiFiConnect();
if (WiFi.status() == WL_CONNECTED) {
fastMQTTConnect();
if (mqttClient.connected()) {
String payload = "{\"action\":\"toggle\",\"battery\":";
payload += String(readBattery());
payload += "}";
mqttClient.publish(TOPIC, payload.c_str());
mqttClient.disconnect();
}
}
goToSleep();
}
void loop() {} // 永不使用
  • 每次按键的总活跃时间 < 5 秒
  • 深度睡眠电流 < 10 µA(用万用表测量)
  • 使用 350 mAh 电池,每天按压 2 次,设备可持续运行 > 100 天
  • MQTT 消息在按下后 5 秒内到达 Broker
  • 电池电压测量准确(用万用表校核)

为验证电池寿命而无需等待 100 天:

// 加速测试模式:每 10 分钟按压一次
void testMode() {
for (int i = 0; i < 100; i++) {
performButtonAction(); // 正常按压循环
esp_sleep_enable_timer_wakeup(600 * 1000000ULL); // 10 分钟
esp_deep_sleep_start();
// 唤醒后:循环从 setup() 继续
}
Serial.println("100 次按压循环完成");
Serial.println("检查电池电压以估算寿命");
}

加速测试推算

测试时长按压次数电压降估算寿命
24 小时144约 0.1V约 200+ 天
7 天1,008约 0.5V约 150+ 天
30 天4,320约 1.0V约 100+ 天
问题回答
”电池能用多久?""按每天按压 2 次计算,可使用超过 100 天,350mAh 电池通常可用 2-3 个月。"
"什么影响电池寿命?""使用频率、WiFi 信号强度和电池质量。"
"怎么知道什么时候该充电?""每次按键都会报告电池电压——在电量耗尽前会收到警告。"
"100 天是保证的吗?""在正常工厂条件和良好 WiFi 覆盖下是的。极端温度或 WiFi 信号差可能会缩短寿命。“
  1. 100 天电池寿命是可以实现的,使用 XIAO ESP32-C3 和适当的优化
  2. 四个优化层次:硬件 → 睡眠 → 活跃速度 → 电池容量
  3. 350 mAh 电池提供 3 倍安全余量,远超 100 天目标
  4. 总活跃时间控制在 5 秒以内对节能至关重要
  5. 通过加速测试进行实际验证可确认计算结果