ESP32 딥슬립 슬롯 구조 설계
문제 상황
배터리로 동작하는 ESP32 센서 노드를 개발하면서 전력 소비가 예상보다 높아, CR2032 코인셀 배터리(220mAh)로 2주밖에 동작하지 못하는 문제가 발생했습니다.
원인 분석
전류 프로파일을 측정한 결과:
- Active 모드: ~160mA (Wi-Fi/BLE 동작)
- Light Sleep: ~800μA (여전히 높음)
- Deep Sleep: ~10μA (목표치)
문제는 센서를 5분마다 읽고 BLE로 전송하는데, Active 모드가 3~5초 지속되어 평균 전류가 ~500μA로 높았습니다.
해결 방법: 타임슬롯 최적화
1. Wake-up 시간 최소화
void setup() {
// RTC 메모리에 상태 저장 (재부팅 후에도 유지)
esp_sleep_enable_timer_wakeup(5 * 60 * 1000000); // 5분
}
void loop() {
uint32_t start = millis();
// 센서 읽기 (I2C)
float temp = sht31.readTemperature(); // ~50ms
float humid = sht31.readHumidity();
// BLE 광고 (1초만 활성화)
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->start();
delay(1000); // 1초간 광고
pAdvertising->stop();
uint32_t elapsed = millis() - start;
Serial.printf("Active time: %dms\n", elapsed); // ~1050ms
// Deep Sleep
esp_deep_sleep_start();
}
2. 전류 프로파일 개선
| 상태 | 전류 | 시간 | 전하량 (mAh) |
|---|---|---|---|
| Deep Sleep | 10μA | 298.95초 | 0.00083 |
| Active (센서+BLE) | 80mA | 1.05초 | 0.0233 |
| 평균 (5분 주기) | ~80μA | 300초 | 0.00667/5분 |
배터리 수명 계산:
220mAh / 0.080mA = 2,750시간 = 114일 ≈ 4개월
추가로 자가방전(~20%)을 고려하면 약 3개월 이상 동작합니다.
추가 최적화 기법
1. Brown-out Detector 비활성화
// platformio.ini
board_build.f_cpu = 80000000L // 240MHz → 80MHz
board_build.partitions = min_spiffs.csv
// setup()
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
2. Wi-Fi 완전 비활성화
// BLE만 사용, Wi-Fi는 비활성화
esp_wifi_stop();
esp_wifi_deinit();
3. RTC 메모리 활용
RTC_DATA_ATTR int bootCount = 0;
RTC_DATA_ATTR float lastTemp = 0;
void loop() {
bootCount++;
// 변화가 없으면 전송 생략 (전력 절약)
if (abs(temp - lastTemp) < 0.5) {
esp_deep_sleep_start();
return;
}
lastTemp = temp;
// BLE 광고
}
결과
평균 전류
80μA
500μA → 80μA (6.25배 개선)
배터리 수명
3~4개월
CR2032 220mAh 기준
Active 시간
1.05초
5분 주기 (0.35% duty cycle)
교훈
- 저전력 설계는 "평균 전류"가 핵심 - Active 시간을 최소화
- RTC 메모리로 상태 유지하면 재부팅 오버헤드 제거
- 변화 감지 알고리즘으로 불필요한 전송 줄이기
- 실측이 중요 - 시뮬레이션보다 전류계 측정