100天电池寿命实现
100天电池寿命实现
本节展示如何通过硬件选择、功耗优化和高效固件相结合,实现 100 天以上的电池寿命。学习完本节后,您将能够:
- 解释完整的功耗优化策略
- 配置所有系统参数以实现最长电池寿命
- 演示每项优化如何对最终结果做出贡献
- 向客户传达 100 天电池寿命的实现情况
开始本节前,请确保:
100 天目标
Section titled “100 天目标”单次充电实现 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 电池第 1 层:硬件选择
Section titled “第 1 层:硬件选择”| 组件 | 选择 | 原因 |
|---|---|---|
| 开发板 | XIAO ESP32-C3 | 深度睡眠:约 5 µA(普通 ESP32 约 10 µA) |
| 稳压器 | XIAO 板载稳压器 | 约 2 µA 静态电流 |
| 电池 | 350 mAh LiPo | 容量和尺寸的良好平衡 |
| 按键 | 带内部上拉的轻触开关 | 无需外部电阻 |
第 2 层:深度睡眠配置
Section titled “第 2 层:深度睡眠配置”设备几乎 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 小时}第 3 层:最小化活跃窗口
Section titled “第 3 层:最小化活跃窗口”完整的活跃循环(唤醒 → 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(); // 不会返回}第 4 层:电池选择
Section titled “第 4 层:电池选择”| 容量 | 可实现寿命(每天 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 电池提供了充足的安全余量。
完整固件示例
Section titled “完整固件示例”#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 信号差可能会缩短寿命。“ |
- 100 天电池寿命是可以实现的,使用 XIAO ESP32-C3 和适当的优化
- 四个优化层次:硬件 → 睡眠 → 活跃速度 → 电池容量
- 350 mAh 电池提供 3 倍安全余量,远超 100 天目标
- 总活跃时间控制在 5 秒以内对节能至关重要
- 通过加速测试进行实际验证可确认计算结果