아두이노 레시피

아두이노 레시피 : 여러 LED 깜빡이기 - 기초편

arduinochef 2025. 2. 25. 18:35

# Recipe 15. LED 정복하기 시리즈 : Blink's'

여러분은 LED 100개를 제어할 수 있나요?

안녕하세요~ 아두이노셰프입니다. 어제부터 LED를 이용해서 간단한 제어연습, 알고리즘 연습을 하고 있는데요. 아직까지는 꽤 쉽죠?(아닌가요?ㅎㅎ) 제가 아두이노를 처음 배울 때, LED 한 개를 켜는 건 그렇게 어렵지 않았는데 막상 2개 3개 이상을 제어하려니까 무지 어렵더라고요. "만약 100개를 제어하려면 pinMode와 digitalWrite함수를 100번 호출해야 되나?" 하며 고민하던 시절이 있었습니다. 여러분은 어떻게 생각하세요? 100개를 제어하실 수 있으시겠어요?? 자, 한 번 답을 찾아보죠.

오늘은 그 두 번째 시간. ‘BLINKs’; ‘여러 개 깜빡이기’입니다.

오늘의 재료 Ingredient


<메인 재료>

LED (4개)

<그 외 재료>

아두이노 우노

브레드보드

1kΩ 저항(4개)

수-수 케이블(9개)


메이킹 방법 Steps

Step 1. 선 연결하기 Wiring

a. LED 두 다리(극) 중 긴 쪽이 + , 짧은 쪽이 - 에요.(반대로 연결하시면 불이 안 들어와요!)

b. LED의 +(긴 극)를 저항의 한쪽과 연결해 주세요.

c. 저항의 남은 한쪽은 아두이노의 디지털 핀에 연결해 주세요. (이렇게 8,9,10,11번에 각각 연결해 주세요.)

d. 그리고 - 극들은 브레드보드를 이용해서 아두이노와 한 번에 연결해 줍니다.

(그림을 참고해 주세요!)

- - - - - - - - - -

Step 2. 아두이노 코드 Code review

여러분의 요리가 훨씬 간편해질 수 있도록, 숙성이 필요한 코드는 언제나 제가 준비할게요ㅎㅎ

Q. 질문 : LED 4개를 동시에 1초 간격으로 깜빡이려면 어떻게 해야 할까요?

//첫 번째 방법
void setup(){
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop(){
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  delay(1000);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  delay(1000);
}
//두 번째 방법
void setup(){
 for(int x=8; x<12; x++){
  pinMode(x, OUTPUT);
 }
}

void loop(){
 for(int x=8; x<12; x++){
  digitalWrite(x, HIGH);
 }
 delay(1000);
for(int x=8; x<12; x++){
  digitalWrite(x, LOW);
 }
 delay(1000);
}

Q. 질문 : LED 4개를 개별적으로 1초 간격으로 깜빡이려면 어떻게 해야 할까요?

(이전 LED가 켜지고 꺼지면, 다음 LED가 켜지고 꺼지는 식으로요)

void setup(){
 for(int x=8; x<12; x++){
  pinMode(x, OUTPUT);
 }
}

void loop(){
 for(int x=8; x<12; x++){
  digitalWrite(x, HIGH);
  delay(1000);
  digitalWrite(x, LOW);
  delay(1000);
 }
}

Q. LED 4개를 개별적으로 3초간 켜고, 1초간 끄려면 어떻게 해야 할까요?

(이전 LED가 켜지고 꺼지면, 다음 LED가 켜지고 꺼지는 식으로요)

void setup(){
 for(int x=8; x<12; x++){
  pinMode(x, OUTPUT);
 }
}

void loop(){
 for(int x=8; x<12; x++){
  digitalWrite(x, HIGH);
  delay(3000);
  digitalWrite(x, LOW);
  delay(1000);
 }
}

Q. 이전 LED가 5번 깜빡이고 다음 LED가 똑같이 5번 깜빡이려면?

void setup(){
 for(int x=8; x<12; x++){
  pinMode(x, OUTPUT);
 }
}

void loop(){
 for(int x=8; x<12; x++){
  for(int y=0; y<5; y++){
  digitalWrite(x, HIGH);
  delay(500);
  digitalWrite(x, LOW);
  delay(500); //시간이 꽤 걸리니 0.5초간격으로 깜빡일게요.
  }
 }
}

Step 3. 동작시키기 Working

● 코드를 아두이노 우노에 업로드해 주세요.

● 코드를 하나씩 업로드하여 동작시켜 보세요. 질문한 대로 잘 동작되나요?


코드의 동작 알고리즘

알고리즘은 쉬운 말로 ‘진행절차’라고 할 수 있습니다.

코드가 어떻게 동작되는지 알아볼까요?

어제의 주요 함수가 pinMode()와 digitalWrite()였다면

오늘 중요한 문법은 바로 for문입니다.

어제 설명했었는데

다시 간략히 정리하자면

시작조건과 종료조건, 조건의 변화를 지정해 주어

조건이 '참'일 동안만 반복시키는 것이

바로 for문입니다.

이 for문으로 단순히 반복만 하는 것이 아니라,

시작조건에 있는 변수 x를

반복문 안의 코드들에 적용시켜서

다양한 알고리즘을 짤 수 있습니다.

한번 살펴볼까요?

Q. 질문 : LED 4개를 동시에 1초 간격으로 깜빡이려면 어떻게 해야 할까요?

LED를 4개를 1초 간격으로 깜빡이려면

LED 4개를 동시에 켰다가, 동시에 끄면 되겠네요.

일단 무식하게 한번 해볼까요?

pinMode로 8번부터 11번까지 OUTPUT모드로 바꿔주고

digitalWrite함수로 4개를 동시에 HIGH,

그리고 1초 쉬고

4개를 동시에 LOW

다시 1초 쉬면 되겠네요.

그런데 만약...

LED100개를 제어하려면

위의 코드를 100번 반복해서 써야 할까요?

여기서 FOR문의 힘이 나옵니다.

어제 FOR문에서 얘기했었지만,

for(int x=8; x <12; x++)

이 코드를 보면

변수 x의 초기값은 8이고, x가 12 미만이 되기까지 1씩 더해집니다.

즉 x의 값은 함수가 실행될 때마다

8,9,10,11

이렇게 4번 바뀔 겁니다.

그런데 이거 어디서 많이 보지 않았나요?

우리가 연결한 핀번호와 같죠?

for문 함수가 한번 실행될 때마다 x의 값이 핀번호와 같네요.

그러면 이 x를 만약 pinMode(x, OUTPUT)으로 하면 어떨까요?

첫 번째 실행될 때는 x가 8이니

pinMode(8, OUTPUT)이 되겠군요.

다음번에는요?

x가 9일 테니

pinMode(9, OUTPUT)이 될 거고요.

오오오오

이런 식이라면 100개의 LED가 있어도

간단하게 코드로 쓸 수 있어요!

그럼 digitalWrite도 똑같이 적용할 수 있겠죠?

켤 때는

4개를 동시에 깜빡이는 거니까,

delay는 반복하지 않고(for문에서 뺄게요)

4개를 빠르게 연속으로 켜고

1초 쉬고

4개를 빠르게 연속으로 끄고

1초 쉬면

동시에 깜빡일 수 있습니다!

Q. 질문 : LED 4개를 개별적으로 1초 간격으로 깜빡이려면 어떻게 해야 할까요?

위의 코드가 이해된다면 이것도 어렵지 않게 만들 수 있어요.

for문에서 제외했던 delay를 다시 집어넣으면 되겠네요.

깜빡이는 것을 4번 반복하면 되니까요~

digitalWrite(x, HIGH);

delay(1000);

digitalWrite(x, LOW);

delay(1000);

이렇게 하면 원하는 핀을 원하는 개수만큼 '깜빡'일 수 있겠네요~~

Q. LED 4개를 개별적으로 3초간 켜고, 1초간 끄려면 어떻게 해야 할까요?

이건 뭐 말장난하는 것도 아니고..ㅎ

켤 때의 delay를 3초로 하면 되겠죠?

1000이 1초이니, 3000으로 바꾸면 되겠네요!

Q. 이전 LED가 5번 깜빡이고 다음 LED가 똑같이 5번 깜빡이려면?

이거는 조금 어려울 수 있겠는데요. 천천히 살펴봐요.

우리가 만든 for문이

한번 실행될 때마다

LED 1개에 대한 코드를 한 번만 실행하고

끝나면 다음 LED로 넘어가잖아요.

그럼 한 번만 실행되는 게 아니라 여러 번 실행시키려면 어떻게 해야 할까요?

"한 번 더 for문으로 반복하면 되겠죠?"

대신 x는 사용하지 못해요.

이미 변수 x는 첫 번째 for문에 사용되는 조건이라서

새로운 for문에는 새로운 조건이 필요해요.

그래서 저는 y라는 변수를 만들어주었어요.

y라는 변수에 값과 조건을 지정해서 5번 반복시켜 주고

대신 digitalWrite에는 x변수 그대로를 사용하는 거죠.(핀번호 때문에요.)

두 번째 for문은 정말 반복만 시키는 거랍니다~

말이 조금 어려울 수 있는데,

직접 코드를 업로드해 보고

반복 횟수를 바꿔보면서

천천히 익히고 이해해 보세요~

오늘 봤듯이

for문은 여러분이 알고리즘을 만들 때,

아주 유용하게 쓰일 조건문입니다.

조건들을 직접 바꿔보면서 연습해 보세요~!!

고생하셨습니다~!!ㅎㅎ