이번에는 실전 임베디드 시스템에서 배터리 수명을 늘리는 핵심 기술, 즉 Sleep 모드와 저전력 설계를 알아본다.
소형 IoT 기기를 오래 사용하려면 꼭 필요한 실무 기술이라고 한다.
1. 왜 전원 관리가 중요한가?
1.1 배터리 기반 IoT 기기의 현실
- 항상 켜두면 전류 소모 ↑ → 배터리 수명 ↓
- 예: 100mA로 24시간 동작 = 2.4Ah 필요 → 비효율적임
1.2 해결책 → Sleep 모드
- 센서를 항상 감시하지 않고, 주기적으로 깨워서 동작 후 다시 Sleep으로 전환
- 평균 소비 전류를 수 μA~mA 수준으로 낮춤
2. Sleep 모드의 종류 (Arduino/AVR 기준)
모드 | 소비전력 | 깨어나는 방식 |
Idle | 낮음 | 타이머, 인터럽트 |
ADC Noise | 더 낮음 | ADC 완료 인터럽트 등 |
Power-down | 매우 낮음 | 외부 인터럽트 (핀 등) |
Standby | RTC 기반 기기 |
3. 실습 예제: Power-down 모드 + 외부 인터럽트로 깨어나기
3.1 준비 사항
- Arduino + 버튼 스위치
- 핀 D2에 버튼 입력
- Low level interrupt로 깨어나기
3.2 예제 코드
#include <avr/sleep.h>
const int wakePin = 2; // 외부 인터럽트 핀 (INT0)
void setup() {
pinMode(wakePin, INPUT_PULLUP); // 풀업 저항 사용
Serial.begin(9600);
delay(1000); // 부팅 안정 시간
Serial.println("Sleep 준비 완료. 버튼을 누르면 깨어납니다.");
attachInterrupt(digitalPinToInterrupt(wakePin), wakeUp, LOW); // LOW 신호로 인터럽트 발생
}
void loop() {
Serial.println("Sleep 모드 진입...");
delay(100); // 메시지 출력 시간 확보
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu(); // 실제 Sleep 진입 (여기서 잠듦)
// 인터럽트 발생 후 이 아래로 복귀
sleep_disable();
Serial.println("깨어남! 측정 작업 수행 중...");
delay(1000); // 여기서 센서 읽기 등을 수행
}
void wakeUp() {
// 깨어날 때 실행되는 ISR (Interrupt Service Routine)
}
4. 작동 흐름 요약
setup() → loop() → sleep_cpu() → (버튼 눌림) → wakeUp() 호출 → 센서 측정
5. 추가
슬립 모드는 “파워다운”만 있는 게 아니다!
슬립(Sleep) ≠ 파워오프(Power Off)
슬립은 MCU의 일부 기능만 꺼서 대기 상태로 만드는 것으로, 완전히 전원이 끊기는 “파워다운”과 다르다
* 슬립모드의 종류 (대표적인 저전력 모드들)
MCU마다 이름은 다르지만, 보통 다음과 같이 구분한다
모드 종류 | 특징 |
Idle | CPU만 정지, 타이머·인터럽트 동작 가능 |
Sleep | 일부 주변회로도 OFF, 특정 인터럽트로만 깨어남 |
Power-down | 거의 모든 회로 OFF, 매우 적은 소비전력 |
Standby/Stop | RAM 유지, 일부 타이머만 동작, RTC로 깨우기 가능 |
→ 대부분 Sleep ↔ Wakeup 구조로 순환 사용해.
* 슬립모드에서 깨어날 수 있는 방법들
꼭 버튼(외부 인터럽트) 말고도 다양한 방법으로 깨어날 수 있다.
Wake up - Source | 설명 |
외부 인터럽트 (EXTI) | 버튼, 센서 신호 등 |
RTC / 타이머 인터럽트 | 정해진 시간마다 기상 (예: 1초마다) |
UART 인터럽트 | 시리얼 통신 수신 시 깨움 |
ADC 인터럽트 | 아날로그 값이 특정 기준을 넘으면 |
I2C/SPI 인터럽트 | 마스터에서 호출 시 |
// 타이머로 깨우기 예제
// 슬립모드 설정 (Power-down)
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
// 타이머 인터럽트로 1초마다 깨어나도록 설정
// ex) Timer2, RTC 등 사용
sleep_cpu(); // 실제로 슬립 진입
// 여기서 인터럽트가 발생하면 깨어남
6. 전력 설계 팁
- 센서도 Sleep을 지원하는지 여부 확인 (DHTxx, ESP32 등)
- LED, LCD 같은 부하 회로 전원 차단 회로 추가
- 모든 unused 핀을 Pull-down or Output으로 설정 (노이즈 방지)
6. 참고자료
'TIL > Embedded' 카테고리의 다른 글
[임베디드] 타이머와 인터럽트 (0) | 2025.06.15 |
---|---|
[임베디드] I2C, SPI 개념 정리 (0) | 2025.06.15 |
[임베디드] 디지털 입출력 예시 (0) | 2025.06.10 |
[임베디드] ADC란 무엇인가 (0) | 2025.06.09 |
[임베디드] Mosquitto란? (0) | 2025.06.07 |