이번 예제에서 사용자들은 switch case 문 사용법을 배우게 될 것입니다. switch case 문은 여러 개의 if 문 대신 사용됩니다. switch case를 사용하면, 프로그램은 변수, 아래 예제 코드에서는 “range”,를 사용해서 해당 변수를 여러 case 문에 지정된 값과 비교할 것입니다. 그런 다음, 일치하는 case를 찾으면 해당 case 문에 나열 된 코드를 실행하고 프로그램의 맨 처음으로 돌아가 코드를 다시 반복할 것입니다. 아래 예제 코드에서는 "range"를 숫자 0-3으로 매핑하였습니다. 프로그램이 switch case 문에 다다르면, 변수 "range"를 4개의 case 문과 비교해서 어떤 코드를 실행할지 선택합니다. 코드가 실행되어 break 명령에 걸리면 (맨 처음으로 돌아가)프로그램을 다시 반복하기 시작할 것입니다. (case 문)코드 내에 break가 없으면, 계속해서 다음 case를 실행하므로 break를 포함시키는 것은 매우 중요합니다.
예제 코드 시작
// sensor minimum, discovered through experiment
const int sensorMin = 320;
// sensor maximum, discovered through experiment
const int sensorMax = 870;
void setup() {
// Begin serial communication
Serial.begin(9600);
}
void loop() {
// read the photocell and store it in the variable
int sensorReading = analogRead(A0);
/* I added the following line to the example code to calibrate the photocell in the following section*/
//Print the reading from the photoresistor to the serial monitor. This will be used to set the
// Serial.println(sensorReading); constants sensorMin and sensorMax.
// map the sensor range to a range of four options
int range = map(sensorReading, sensorMin, sensorMax, 0, 3);
switch (range) { // this Switch case is used to choose which option to follow. Above we mapped it into 4 selections, 0-4
case 0: // your hand is on the sensor
// write dark on the serial monitor
Serial.println("dark");
break; //used to break away from the code and recheck the variable
case 1: // your hand is close to the sensor
// write dim on the serial monitor
Serial.println("dim");
break;
case 2: // your hand is a few inches from the sensor
// write medium on the serial monitor
Serial.println("medium");
break;
case 3: // your hand is nowhere near the sensor
// write bright on the serial monitor
Serial.println("bright");
break;
}
delay(1); // this will help the stability of the readings
}
광전지에 대한 상수 보정
광전지에 대한 상수를 보정하기 위해서는 다음 예제 코드와 같이 코드를 수정합니다.
// sensor minimum, discovered through experiment
const int sensorMin = 320;
// sensor maximum, discovered through experiment
const int sensorMax = 870;
void setup() {
// Begin serial communication
Serial.begin(9600);
}
void loop() {
// read the photocell and store it in the variable
int sensorReading = analogRead(A0);
//Print the reading from the photoresistor to the serial monitor. This will be used to set the constants sensorMin and sensorMax.
Serial.println(sensorReading);
// map the sensor range to a range of four options
//int range = map(sensorReading, sensorMin, sensorMax, 0, 3);
// switch (range) { // this Switch case is used to choose which option to follow. Above we mapped it into 4 selections, 0-4
// case 0: // your hand is on the sensor
// write dark on the serial monitor
// Serial.println("dark");
// break; //used to break away from the code and recheck the variable
// case 1: // your hand is close to the sensor
// write dim on the serial monitor
// Serial.println("dim");
// break;
// case 2: // your hand is a few inches from the sensor
// write medium on the serial monitor
// Serial.println("medium");
// break;
// case 3: // your hand is nowhere near the sensor
// }
delay(1); // this will help the stability of the readings
}
위의 코드와 같이 코드를 수정했다면 보드에 로딩 한 후 시리얼 모니터(Serial Monitor)를 실행하여 빛이 완전히 입사되는 상태에서의 광전지 값을 기록합니다. 그런 다음 손가락으로 광전지를 가려서 빛이 들어오지 않도록 하여 이 값도 기록합니다. 기록한 이 값들로 (원래의)예제 코드로 이동하여 값을 올바르게 읽을 준비가 되었습니다.
코드를 원래의 예제 코드로 다시 변경합니다. 다음으로 sensorMin 상수를 위의 보정 테스트에서 센서가 가려졌을 때 얻은 가장 낮은 숫자로 변경합니다. 그런 다음 sensorMax 상수를 센서가 가려지지 않은 때 얻은 가장 높은 숫자로 변경합니다. 이제 프로그램을 아두이노 보드에 다시 로딩 합니다.
이제 손가락을 센서 가까이 이동해보면, 센서가 가려져 있지 않을 때에는 시리얼 모니터에 "bright"라고 표시될 것입니다. 손가락을 센서에 가까이 이동할수록 "medium"에서 "dim"으로 바뀌고, 센서를 완전히 가리면 "dark"라고 표시될 것입니다. 시리얼 모니터에서 “bright” 또는 "dark"가 전혀 표시되지 않는 문제가 발생할 경우, 보정을 다시 수행하여 기록한 숫자가 바뀌었는지를 확인해 보시기 바랍니다.
초기 코드의 배선도
확장 코드
확장 코드에서는 회로에 LED 몇 개를 추가하여 광전지에서 발생하는 일을 시각적으로 보여줄 것입니다. 핀 11, 12 그리고 13에 330옴 저항과 함께 LED를 부착할 것입니다. 프로그램이 해야 할 일은 광전지가 최대 밝기를 감지하면 모든 LED를 켜는 것입니다. 그리고 어두워질수록 LED는 하나씩 꺼질 것이며, 어둠을 감지하면 모든 LED가 꺼질 것입니다.
// sensor minimum, discovered through experiment
const int sensorMin = 320;
// sensor maximum, discovered through experiment
const int sensorMax = 870;
void setup() {
// Begin serial communication
Serial.begin(9600);
//Set pin 13 as an ouput
pinMode(13, OUTPUT);
// Set pin 12 as an output
pinMode(12, OUTPUT);
// Set pin 11 as an output
pinMode(11, OUTPUT);
}
void loop() {
// read the photocell and store it in the variable
int sensorReading = analogRead(A0);
// map the sensor range to a range of four options
int range = map(sensorReading, sensorMin, sensorMax, 0, 3);
switch (range) {
case 0: // your hand is on the sensor
// write dark on the serial monitor
Serial.println("dark");
// turn off all LEDs
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
break;
case 1: // your hand is close to the sensor
// write dim on the serial monitor
Serial.println("dim");
// turn on just the LED connected to pin 11
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
break;
case 2: // your hand is a few inches from the sensor
// write medium on the serial monitor
Serial.println("medium");
// turn on the LEDs connected to pins 11 and 12
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
break;
case 3: // your hand is nowhere near the sensor
// write bright on the serial monitor
Serial.println("bright");
// turn on all LEDs
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
break;
}
delay(1); // this will help the stability of the readings
}
확장 코드의 배선도
자재 명세서
장바구니 링크: Digi-Key 장바구니