아두이노 조건문 if, switch ~ case
프로그래밍 제어 흐름에 사용되는 조건문 사용 방법에 대해 작성하고 이해를 돕기 위한 예제 코드
를 추가하였습니다.조건문
조건문은 조건에 따라 선택적으로 코드를 실행 할 수 있도록 해줍니다. 아래는 프로그래밍 조건에 따른 행동을 하는 예시를 보여줍니다.
- 스위치가 눌러지면 LED를 켠다
- 조도 센서의 전압이 1.5V 이하이면 조명을 어둡게 한다.
- 실내 온도가 26도 넘으면 에어컨을 켠다.
- 실내 온도가 25 이하면 에어컨을 끈다
아두이노 프로그램에서 제공하는 조건문은 if 문, switch ~ case 문이 있습니다.
if문
if 문은 제어 흐름에 사용되는 조건문 중의 하나 입니다. if문에 사용되는 1조건은 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 껏다 켜기 예제 회로도
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 문
switch 문은 if 문과 함께 프로그래밍 제어 흐름에 사용되는 조건문 종류 중 하나 입니다. if문은 주로 조건, 범위의 조건 등에 사용되지만, switch ~ case 은 2특정 변수 값을 지정된 다양한 값으로 비교하고, 그 결과에 맞는 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 제어
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 문 등으로 하는 방법도 있으니, 필요에 따라 참고하시면 될 것 같습니다.
마무리
본 포스트에서 프로그램 제어 흐름에 사용되는 조건문에 대해 알아 보았습니다. 다음 포스트는 반복 분기에 사용되는 반복문에 대해 정리할 예정입니다.
끝까지 읽어주셔서 감사합니다.^^
'Embedded > Arduino' 카테고리의 다른 글
아두이노 강좌 #10 디지털핀 인터럽트 (EXTI, digitalPin Interrupt) (1) | 2020.07.09 |
---|---|
아두이노 강좌 #9 프로그래밍 기초 - 반복문 while, for 로 로또 번호 생성 (0) | 2020.07.08 |
아두이노 강좌 #7 프로그래밍 기초 - 데이터 타입, 변수, 상수, 선언자 (0) | 2020.07.06 |
아두이노 강좌 #6 시리얼 통신 3. UART 수신 프로그래밍 (1) | 2020.07.05 |
아두이노 강좌 #5 시리얼 통신 2. UART 초기화 및 송신 프로그래밍 (2) | 2020.07.04 |