아두이노로 delay() 없이 두 개의 LED를 서로 다른 속도로 깜빡이기
부품 및 소모품
| 아두이노 우노 (Arduino UNO) |
1개 |
| 5mm 적색 LED |
2개 |
프로젝트 개요
이 프로젝트는 온라인에서 자주 접하는 질문에서 영감을 얻었습니다. "두 개의 LED를 서로 다른 주기로 깜빡이려면 어떻게 해야 할까?"
첫 번째 LED를 1000ms마다, 두 번째 LED를 500ms마다 깜빡이고 싶다면 delay()를 사용해도 구현 가능합니다. 1000ms 딜레이를 두 번의 500ms로 쪼개면 되기 때문입니다. 하지만 두 번째 LED의 주기를 300ms로 바꾸고 싶다면? delay()로는 타이밍 계산이 극도로 복잡해지거나 불가능해집니다.
해결책: delay() 사용 중단
아두이노 IDE에 내장된 BlinkWithoutDelay 예제가 정답입니다. 이 방식을 두 번째 LED에도 동일하게 적용하고, 각각 원하는 간격(interval)을 설정하면 됩니다.
초보자를 위한 예제이므로 코드를 의도적으로 단순하게 작성했습니다. 더 효율적인 구조(배열, 구조체, 클래스 등)로 리팩토링할 여지는 충분합니다.
코드
const int ledPin = LED_BUILTIN;
int ledState = LOW;
unsigned long previousMillis = 0;
const long interval = 1000;
const int ledPin2 = 12;
int ledState2 = LOW;
unsigned long previousMillis2 = 0;
const long interval2 = 300;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
// 첫 번째 LED (1000ms 간격)
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
ledState = (ledState == LOW) ? HIGH : LOW;
digitalWrite(ledPin, ledState);
}
// 두 번째 LED (300ms 간격)
if (currentMillis - previousMillis2 >= interval2) {
previousMillis2 = currentMillis;
ledState2 = (ledState2 == LOW) ? HIGH : LOW;
digitalWrite(ledPin2, ledState2);
}
}
회로도
내장 LED(핀 13)와 핀 12에 각각 LED를 연결합니다. 저항(220~330Ω)을 직렬로 연결하는 것을 권장합니다.