코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2014-08-04 14:41:36
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문을 사용하여 센서의 값에 따라 다른 문장을 출력하는 간단한 회로도를 만들어보자.
NO | 부품명 | 수량 |
1 | 아두이노 보드 | 1 |
2 | 아날로그 센서 | 1 |
3 | 10k 저항 | 1 |
4 | 브레드보드 | 1 |
5 | Hook-up wire |
/* 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
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!