참고자료

아두이노, 오렌지보드 등의 오픈소스하드웨어를 사용하는데 필요한 것들을 알아봅니다.

제어문-switch

2014-08-04 14:41:36

switch 문

 

 

switch문은 if/else문과 같은 조건문의 종류중 하나이다. 다만 if문은 하나의 조건에 대해 하나의 값만 비교를 하는 반면에 switch문은 하나의 식에 여러가지 값을 따져 조건을 분기할 수 있다. if문을 많이 사용해야하는 상황에서 switch문을 사용할 수 있다면 보기 좋게 정리가 가능하다.

 

 

switch(식) {
case 값1:
   명령문;
   break;
case 값2:
   명령문;
   break;
case 값3:
   명령문;
   break;

default:
   명령문;
   break;
}

 

 

switch문은 위와 같은 구조를 가지고 있다. switch옆 소괄호안에는 비교할 값이 들어가고 그 값이 어떤값인지에 따라 case가 나눠지게 된다. 만약 값이 어떤 case에도 존재하지 않을 경우에는 default가 실행되는데 default는 생략이 가능하다. 각 case별로 break가 존재하는데 break는 그 case를 실행한 다음 switch문을 빠져나오겠다는 의미의 명령이다. break또한 생략이 가능하다. 다만 break가 생략될 경우에는 조건에 맞는 case를 실행한다음 switch문을 벗어나는것이 아닌 다음 case와 비교하게 된다.

 

 

int i = 0;

switch(i) {
case 1:
    Serial.println("1");
    break;
case 2:
    Serial.println("2");
    break;
case 3:
    Serial.println("3");
    break;
default:
    Serial.println("0");
    break;
}

 

 

 

 

위와 같은 식의 경우에는 int형 변수 i의 값으로 case가 나눠지는데 i = 0이므로 모든 case에 해당하지 않는다. 따라서 위 구문에서는 default가 실행되고 0이 출력된다.

 

 

 

 

switch문을 이용한 간단한 회로도

 

switch문을 사용하여 센서의 값에 따라 다른 문장을 출력하는 간단한 회로도를 만들어보자.

 

 

부품 목록

 

NO 부품명 수량
1 아두이노 보드 1
2 아날로그 센서 1
3 10k 저항 1
4 브레드보드 1
5 Hook-up wire  


하드웨어 making

 

브레드보드

전자 회로도


소프트웨어 coding

 

/*
  Switch statement
 
 Demonstrates the use of a switch statement.  The switch
 statement allows you to choose from among a set of discrete values
 of a variable.  It's like a series of if statements.
 
 To see this sketch in action, but the board and sensor in a well-lit
 room, open the serial monitor, and and move your hand gradually
 down over the sensor.
 
 The circuit:
 * photoresistor from analog in 0 to +5V
 * 10K resistor from analog in 0 to ground
 
 created 1 Jul 2009
 modified 9 Apr 2012
 by Tom Igoe 
 
 This example code is in the public domain.
 
 http://www.arduino.cc/en/Tutorial/SwitchCase
 */

// const가 적힌값들은 변경이 불가능하다
// 내가 읽을 수 있는 센서의 최소값과 최대값을 지정한다
const int sensorMin = 0;      // 센서의 최소값을 설정
const int sensorMax = 600;    // 센서의 최대값을 설정

void setup() {
  // 시리얼 통신 초기화. 통신속도를 9600으로 한다
  Serial.begin(9600);  
}

void loop() {
  // 센서값을 읽는다
  int sensorReading = analogRead(A0);

  // 0부터 600사이의 센서값을 0부터 3사이의 숫자로 상대변환한다
  int range = map(sensorReading, sensorMin, sensorMax, 0, 3);

  // 변환된 값에 따라 switch문을 통해 분기된다
  switch (range) {
  case 0:    // 0일 경우 dark출력
    Serial.println("dark");
    break;
  case 1:    // 1일 경우 dim출력
    Serial.println("dim");
    break;
  case 2:    // 2일 경우 medium출력
    Serial.println("medium");
    break;
  case 3:    // 3일 경우 bright출력
    Serial.println("bright");
    break;
  } 
  delay(1);        // 프로그램 안정성을 위해 딜레이를 준다
}

소스는 간단하다. A0핀에 연결된 아날로그의 센서값을 읽어와서 그 값을 map함수를 통해 아날로그 센서값의 범위를 사상변환 시킨다.

 

 

 

1 map(value, fromLow, fromHigh, toLow, toHigh) fromLow와 fromHigh값을 toLow값과 toHigh값으로 줄였을때 value값의 상대변환값을 구한다


전역변수로 최소값 0 최대값600으로 설정했는데 사상변환을 통해 0부터 3까지의 범위로 축소한다.
이렇게 축소된 센서값을 switch문으로 여러 조건으로 분기시킨다.
0일경우에는 dark출력(센서값이 0~150), 1일 경우에는 dim출력(151~300),
2일 경우에는 medium출력(301~450), 3일 경우에는 bright을 출력한다.(451~600)

 

 

 

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

제어문, switch, 기타