3D프린터와 아두이노/아두이노

반복문 : for문과 while문

메카럽 2020. 9. 10. 08:48

안녕하세요. 메카럽입니다.

이번 포스팅에서는 반복문에 대해 알아보려 합니다. C언어의 세계로 들어오니 외워야할 것도 많고 이해해야할 것도 많은 것이 사실입니다. 물론 이해를 하면서 외운다는 것이 쉽지만은 않은 것도 알고 있습니다. 하지만 처음 마음 먹은 것처럼 끝까지 가봐야 죽인지 된장인지를 아는 것처럼 끝까지 해서 노력의 결실을 맺어보려 합니다.

그럼 본론으로 들어가 보도록 하겠습니다.

 

■ for문

반복문은 크게 for문과 while문 두 가지로 나뉘며, 동이레한 작업을 원하는 횟수만큼 반복할 때 적용하게 됩니다.

for문의 형태는 아래와 같습니다. 조건문과 같이 for 이후에 소괄호 ( )가 위치하고, 그 안에 세 가지 요소를 지정합니다. 사용할 변수의 초기화, 조건, 증분을 지정한 후 중괄호 { }에 반복할 내용을 기입합니다.

for문의 형태

초기화 이후 for 루프 내에서 증가(또는 감소)를 카운트하여 해당 조건이 거짓이 될 때까지 반복하는 구조입니다. 다시 말해서, 초기화(또는 초기식)는 한 번만 실행되고, 이어지는 조건이 참이면 중괄호 내의 "반복할 내용"을 수행합니다(조건이 거짓이면 종료).

실행과정은 아래와 같습니다.

1. 초기화 수행

2. 조건 검사

3. 조건이 참이면 이어지는 증분(또는 반복) 구문을 수행, 거짓이면 종료.

4. 증분(증감)을 수행

5. 조건을 확인하여 참이면 반복할 내용을 수행하고, 거짓이면 반복 종료.

 

LED 하나의 밝기를 점진적으로 올리는 코드를 작성한다고 생각해보겠습니다. 아주 간단하게는 다음과 같이 analogWrite( ) 함수값과 analogRead( ) 함수를 이용해서 디지털 신호를 아날로그 신호처럼 활용하는 방법입니다. PWM제어라고도 합니다. 하지만 이 방법은 아래의 코드처럼 너무 번거롭고 코드가 길어진다는 단점이 있습니다. analogWrite( ) 함수를 통해 0에서 255까지 255번 반복해야 밝기 제어가 완성됩니다. 반면, for문을 활용하면 이런 반복적 기능을 짧고 간단하게 구현할 수 있습니다.

int LED_1 = 3;

void setup ( )

{
  // 시리얼 모니터를 활용해서 디스플레이하지 않으므로 Serial.begin( ) 함수는 필요하지 않습니다.
}

void loop ( )
{
  analogWrite(LED_1, 0);
  delay(100);
  analogWrite(LED_1, 1);
  delay(100);
  analogWrite(LED_1, 2);
  delay(100);
  analogWrite(LED_1, 3);
  delay(100);
  analogWrite(LED_1, 4);
  delay(100);
  ...
  중략
  ...
  analogWrite(LED_1, 255);
  delay(100);
}

다음은 D3 핀에 LED가 연결되어 있고, 전원이 연결되면 100ms 단위로 D3 핀에 연결된 LED의 밝기가 점점 올라가는 예제입니다. 앞선 예제와 같은 기능이지만, 코드 길이가 아주 짧습니다. PWM 제어를 활용하여 D3 핀에 연결된 LED에 100ms 단위로 0V에서 5V까지 1/255 간격으로 높아지는 전압이 공급되어 밝기가 증가합니다. 참고로 PWM 제어를 위한 핀이 별도로 있습니다. 아두이노 우노는 D3, 5, 6, 9, 10, 11핀으로 핀 번호 위에 물결 모양의 표시가 있습니다. D12, D13 등 PWM 제어가 불가한 핀은 analogWrite( ) 함수로 밝기 제어가 되지 않고 오직 켜지거나 꺼지는 현상만 확인할 수 있습니다.

int LED_1 = 3;

void setup ( )

{
}

void loop ( )
{
  for (int i=0; i <= 255; i++)  // 초기값(i)=0, 값이 255가 될 때까지 매번 반복
  {
  analogWrite(LED_1, i);
  delay(100);
  }
}

앞선 예제에서 loop( )문 내에 있는 for문은 다음과 같이 구성되어 있습니다.

1. int i=0, 정수형 변수 i가 만들어진 후 초기화 됩니다.

2. i<=255, 변수 i의 조건(255 이하가 될 때까지)을 검사합니다.

3. i++, i를 1씩 증가시키며, 다시 2번항을 검사하여 255를 초과하면 for 반복문에서 빠져나옵니다.

 

한가지 for문 예제를 더 살펴보겠습니다. 이번에는 여러개의 LED를 순차적으로 켜고 꺼보는 것입니다. D3, D4, D5 단자에 저항과 LED를 연결하고 각각 차례로 제어해보겠습니다. for문이 아니라면 다음과 유사한 코드로 구성될 것입니다. 0.5초 간격으로 3,4,5번 포트에 연결된 LED를 켜고 끕니다.

void setup ( )
{
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop ( )
{
  digitalWrite(3, HIGH);
  delay(500);
  digitalWrite(4, HIGH);
  delay(500);
  digitalWrite(5, HIGH);
  delay(500);

  digitalWrite(3, LOW);
  delay(500);
  digitalWrite(4, LOW);
  delay(500);
  digitalWrite(5, LOW);
  delay(500);
}

위 내용을 아래와 같이 for문으로 구성해보겠습니다.

void setup ( )
{
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop ( )
{
  for(int i=0; i<4; i++)
  {
    digitalWrite(3+i, HIGH);
    delay(500);
  }

  for(int i=0; i<4; i++)
  {
    digitalWrite(3+i, LOW);
  }
}

3개의 LED를 사용했기 때문에 코드 길이는 큰 차이가 없어 보이지만, 그 보다 많은 수의 LED를 제어해야 한다고 생각해보면 for문을 사용하는 것이 훨씬 효율적입니다.

 

■ while문

while문은 for문 보다 구조가 더 간단합니다. while 루프는 소괄호( )내의 조건이 거짓이 될 때까지 중괄호 { } 내의 내용을 계속 반복합니다(무한대로). for 문과는 달리 초기화, 증분 조건이 없고 조건만으로 구성되어 있습니다.

while문의 형태

다음은 앞선 for문 예제와 같은 D3 핀에 연결된 LED의 밝기를 100ms 단위로 증가시키는 예제입니다.

int LED_1 = 3;
int i = 0;


void setup ( )
{
  pinMode(LED_1, OUTPUT);
}

void loop ( )
{
  while (i<=255)
  {
    analogWrite(LED_1, i++);
    delay(100);
  }
}

while문은 for문에 비해 초기화, 변수 증분 관련 코드가 없고 while 뒤 소괄호 내의 조건만 검사합니다. 앞의 코드에서 정수형 변수 i를 초기화해주고, i를 중괄호 { } 내에서 증가시켜 255가 될 때까지 반복하는 예제입니다. for문보다 조금 더 간단하게 구성되어 있는 것을 확인하실 수 있을 겁니다.

728x90

'3D프린터와 아두이노 > 아두이노' 카테고리의 다른 글

디지털과 아날로그  (2) 2020.09.12
아두이노 IDE 라이브러리  (2) 2020.09.11
제어문 - 조건문 : if문  (2) 2020.09.09
함수 : FUNCTIONS  (4) 2020.09.08
전역변수와 지역변수  (2) 2020.09.07