티스토리 뷰

 아두이노 조건문 if, switch ~ case

  대부분의 프로그래밍 언어로 작성되는 프로그램은 순차 구조, 선택 구조(조건), 반복 구조 등을 사용합니다. 이 3가지 구조를 사용하면 거의 모든 동작 시나리오 구현이 가능합니다. 본 포스트에서는

프로그래밍 제어 흐름에 사용되는 조건문 사용 방법에 대해 작성하고 이해를 돕기 위한 예제 코드

를 추가하였습니다.

조건문

  조건문은 조건에 따라 선택적으로 코드를 실행 할 수 있도록 해줍니다. 아래는 프로그래밍 조건에 따른 행동을 하는 예시를 보여줍니다.

  • 스위치가 눌러지면 LED를 켠다
  • 조도 센서의 전압이 1.5V 이하이면 조명을 어둡게 한다.
  • 실내 온도가 26도 넘으면 에어컨을 켠다.
  • 실내 온도가 25 이하면 에어컨을 끈다

  아두이노 프로그램에서 제공하는 조건문은 if 문, switch ~ case 문이 있습니다.

if문

[각주:1]if 문은 제어 흐름에 사용되는 조건문 중의 하나 입니다. if문에 사용되는 조건boolean 데이터 타입으로 표현되는 변수 리턴값을 가지는 함수 조건 연산자 식 입니다. 참일 확률이 높은 조건부터 if 문 -> 첫 번째 else if 문 순서로 작성해야 속도의 개선이 있을 수 있습니다. 하지만, 크게 속도가 중요한 것이 아니면, 가독성이 높은 코드로 작성하길 권장합니다. 

if 구조

1
2
3
if(조건){
    실행 코드1 /* 조건이 참일 때 실행 */
}
cs

if ~ else 구조

1
2
3
4
5
6
if(조건){
    실행 코드1 /* 조건이 참일 때 실행 코드 */
}
else{
  실행 코드2 /* 조건이 참이 아닐 때 실행 되는 코드 */
}
cs

if, else if, else 구조

1
2
3
4
5
6
7
8
9
10
11
12
13
if(조건1){
    실행 코드1 /* 조건이 참일 때 실행 코드 */
}
else if(조건2){
  실행 코드2 /* 조건이 참이 아닐 때 실행 되는 코드 */
}
       .
       .
       .
       .
else{
   실행 코드 /* 조건1 ~ 조건n 이 모두 참이 아닐 때 실행 되는 코드 */
}
cs

예제1 : 스위치로 LED 켜기

아래 그림과 같이 2번핀 스위치 연결, 13번핀 LED 연결시, 스위치가 눌러지면 LED를 켜는 예제입니다.

스위치로 LED 껏다 켜기 예제 회로도스위치로 LED 껏다 켜기 예제 회로도

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const int SWITCH = 2;
const int LED = 13;
 
void setup() {
  pinMode(SWITCH, INPUT);
  pinMode(LED, OUTPUT);
}
 
void loop() 
{
  if(digitalRead(SWITCH) == HIGH){ // 스위치 Off
    digitalWrite(LED, LOW);            // LED On
  } 
  else {                                     // 스위치 On
    digitalWrite(LED, HIGH);           // LED Off
  }                            
}
cs

if(digitalRead(SWITCH) == HIGH) 2번 핀 스위치에 HIGH(5V)가 입력될 때 동작하는 조건문 (Switch OFF)

else 구문은 2번 스위치에 LOW(0V) 가 입력된 경우 동작하는 조건문 (Switch ON)

예제2 : 시리얼 통신으로 LED 켜기 끄기

시리얼 통신으로 데이터가 '1'이 수신 되면 Arduino Uno 보드 내장 LED를 켜고, '0'이 수신 되면 LED를 끄는 예제입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const int LED = 13;
int iUartRecvData;
 
void setup(){
    pinMode(LED, OUTPUT);
    Serial.begin(9600);
}
 
void loop(){
    if(Serial.available() > 0){ // 수신 버퍼에 수신된 데이터가 있는 경우..
        iUartRecvData = Serial.read();
        
        if(iUartRecvData == '1'// 수신한 데이터가 1 인경우
        {
            digitalWrite(LED, HIGH); // 아두이노 우노 내장 LED 켜기
        }
        else if (iUartRecvData == '0'// 수신한 데이터가 0인 경우
        {
            digitalWrite(LED, LOW); // 아두이노 우노 내장 LED 끄기
        }
    }
}
cs

if(Serial.available() > 0) UART 수신 버퍼에 데이터가 1개 이상 저장 되어있는 경우 수행

if(iUartRecvData == '1') 수신한 데이터가 1인 경우 수행하는 조건문

else if(iUartRecvData == '0') 수신한 데이터가 1이 아니고, 0인 경우 수행하는 조건문

조건 연산자

조건 연산자 종류와 예시는 아래와 같으며, If문의 조건 입력으로 사용 될 수 있습니다.

  • a == b : a와 b가 같을 때 TRUE 를 반환
  • a != b  : a와 b가 같지 않을 때 TRUE 를 반환
  • a < b   : a가 b보다 작을 때 TRUE 를 반환
  • a > b   : a가 b보다 클 때 TRUE 를 반환
  • a <= b : a가 b보다 작거나 같을 때 TRUE 를 반환
  • a >= b : a가 b보다 크거나 같을 때 TRUE 를 반환

※ 참고사항 : a = b 는 a 변수에 b 값을 대입, a == b 는 a와 b가 같은지 비교하는 조건문입니다.


switch ~ case 문

  [각주:2]switch 문은 if 문과 함께 프로그래밍 제어 흐름에 사용되는 조건문 종류 중 하나 입니다. if문은 주로 조건, 범위의 조건 등에 사용되지만, switch ~ case 은 특정 변수 값지정된 다양한 값으로 비교하고, 그 결과에 맞는 case 에 따라 코드를 실행시킵니다.

  switch 문은 if문과 다르게 break 명령과 함께 쓰입니다. break 명령은 해당 case 가 일치하는 경우 switch ~ case 문을 빠져 나오는 명령입니다. break 명령이 없으면 첫 번째 case 문의 조건이 만족 하더라고, 두 번째 case 문은 조건과 비교하고, 프로그램에 작성된 흐름대로 계속해서 조건을 비교합니다. 즉, 각 case 마다 break 함수를 쓰는 것이 보편적입니다.

switch 문 구조

switch ~ case 구문의 변수와 상수는 데이터 타입은 int char 형태만 사용 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
switch (변수) {
    case 상수1 :
        // 실행 코드1 : 변수의 값 == 상수1 인 경우
        break;
    case 상수2 :
        // 실행 코드2 : 변수의 값 == 상수2 인 경우
        break;
        .
        .
        .
    default// 옵션으로 미 작성 무관함
        // 만족하는 case 없는 경우 실행 코드
}
cs

예제 : 시리얼 통신으로 여러개 LED 제어

시리얼 통신으로 부터 0 ~ 4값을 받아 각 case 마다 아래의 기능을 구현하는 코드 입니다.

  • '0' 수신 : 모든 LED 끄기
  • '1' 수신 : LED1 Toggle
  • '2' 수신 : LED2 Toggle
  • '3' 수신 : LED3 Toggle
  • '4' 수신 : LED4 Toggle
  • '0' ~ '4' 이외의 값 : 경고 메세지 출력

시리얼 통신으로 여러개 LED 제어시리얼 통신으로 여러개 LED 제어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
const int LED1 = 10;
const int LED2 = 11;
const int LED3 = 12;
const int LED4 = 13;
 
int iUartRecvData;
 
void setup(){
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    pinMode(LED4, OUTPUT);
    Serial.begin(9600);
}
 
void loop(){
    if(Serial.available() > 0){ // 수신 버퍼에 수신된 데이터가 있는 경우..
        iUartRecvData = Serial.read();
 
        switch(iUartRecvData){
            case '0':                       // 시리얼 수신 값 '0' 인 경우 모두 끄기
                digitalWrite(LED1, LOW);
                digitalWrite(LED2, LOW);
                digitalWrite(LED3, LOW);
                digitalWrite(LED4, LOW);
                break;
            case '1':
                digitalWrite(LED1, !digitalRead(LED1));
                break;
            case '2':
                digitalWrite(LED2, !digitalRead(LED2));
                break;
            case '3':
                digitalWrite(LED3, !digitalRead(LED3));
                break;
            case '4':
                digitalWrite(LED4, !digitalRead(LED4));
                break;
            default:
                Serial.print("Input range : 0 ~ 4");
                break;
        }
    }
}
cs

if 문, switch 뭐가 더 좋은가?

  if문 switch 문 같은 경우 어떤 분기 형태인지, 어떤 데이터 타입을 사용하는지, 어떤 프로세서인지, 어떤 컴파일러인지에 등 다양한 상황과 환경에 따라 무엇이 더 빠르고 용량을 적게 쓰는지 알기 위한 방법은 참으로 비효율적이라고 생각합니다.  극단적인 경우가 아니면, 가독성을 높일 수 있는 조건문을 적용하는 것이 더 현명하다고 생각합니다. 

  아두이노 프로그램을 하는 이유는 쉽고 빠르게 프로그램을 제작하기 위함이므로, 추후 재 사용성을 고려하여 큰 고민 없이 읽고 해석하기 쉬운 코드로 작성하는 것이 바람직하다고 생각합니다. 아래는 간단하게 제가 생각하는 if 문 switch 문 사용하는 기준 입니다.

  큰 범위에서는 if 문으로 2-3구역으로 나누고, 세부 분기는 switch 문 등으로 하는 방법도 있으니, 필요에 따라 참고하시면 될 것 같습니다.


마무리

  본 포스트에서 프로그램 제어 흐름에 사용되는 조건문에 대해 알아 보았습니다.  다음 포스트는 반복 분기에 사용되는 반복문에 대해 정리할 예정입니다.

  끝까지 읽어주셔서 감사합니다.^^



  1. if문 아두이노 사이트 참조 : https://www.arduino.cc/reference/en/language/structure/control-structure/if/ [본문으로]
  2. switch 문 아두이노 사이트 참조 : https://www.arduino.cc/reference/en/language/structure/control-structure/switchcase/ [본문으로]
댓글
댓글쓰기 폼
최근에 올라온 글
«   2020/10   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Total
10,483
Today
228
Yesterday
192