오늘의 주제는 MCU의 타이머와 인터럽트를 활용해 센서 데이터를 정해진 주기마다 자동으로 수집하는 구조에 대해서이다.
이건 실시간 모니터링, 로깅 시스템, 저전력 제어 등에서 매우 핵심적인 기술이라고 한다.
1. 왜 타이머/인터럽트가 필요한가?
1.1 기존 구조의 문제점
loop() {
readSensor();
delay(1000); // 1초마다 반복
}
- delay()는 MCU를 강제로 대기시켜서 다른 작업 불가능
- 동시에 여러 작업을 하거나 정확한 타이밍 유지 어려움
1.2 해결 방법 → 타이머 + 인터럽트
- 백그라운드에서 주기적인 알람을 발생
- 특정 시간이 되면 자동으로 함수 호출 (인터럽트 발생)
2. 핵심 개념 정리
2.1 타이머 (Timer)
- MCU 내부의 카운터 회로
- 초 단위가 아닌 마이크로초/밀리초 단위 시간 측정 가능
2.2 인터럽트 (Interrupt)
- 정해진 이벤트 발생 시, MCU가 즉시 특정 함수(인터럽트 핸들러) 실행
- 메인 루프와 별도로 동작 → 비동기 처리 가능
3. 아두이노 타이머/인터럽트 실습 (Timer1 사용)
3.1 라이브러리 설치
#include <TimerOne.h> // 별도 설치 필요
3.2 예제 코드 – 1초마다 센서 읽기
volatile bool flag = false;
void setup() {
Serial.begin(9600);
Timer1.initialize(1000000); // 1초 = 1,000,000μs
Timer1.attachInterrupt(timerCallback); // 인터럽트 등록
}
void loop() {
if (flag) {
flag = false;
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0);
float temp = voltage * 100.0;
Serial.print("Temp: "); Serial.println(temp);
}
}
void timerCallback() {
flag = true;
}
* 핵심: loop()는 가볍게 유지하고, 센서 측정 타이밍은 타이머에 맡김
4. 구조도
[타이머1 설정: 1초 간격]
↓
[타이머 인터럽트 발생]
↓
[콜백 함수에서 flag = true]
↓
loop()에서 flag 감지 후 센서 읽기
5. 요약
타이머와 인터럽트를 적절히 사용하면 Main loop에만 의존해 delay()로 기다리는 구조가 아닌
MCU 스스로 “시간이 됐음을 감지”하고 처리하는 능동적 구조를 사용할 수 있다.
이 방식은 여러 작업을 병행하거나, 저전력 모드에서 깨어날 때, 주기적 데이터 수집 및 송신 시 자주 쓰이는 방식이다.
6. 참고자료
'TIL > Embedded' 카테고리의 다른 글
[임베디드] 전원 관리와 Sleep 모드 (0) | 2025.06.15 |
---|---|
[임베디드] I2C, SPI 개념 정리 (0) | 2025.06.15 |
[임베디드] 디지털 입출력 예시 (0) | 2025.06.10 |
[임베디드] ADC란 무엇인가 (0) | 2025.06.09 |
[임베디드] Mosquitto란? (0) | 2025.06.07 |