참고자료

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

제어문-반복 (while)

2014-08-04 13:55:55

while 반복문

 

while loop (반복) 는 for loop와 같이 반복문 중 하나이다. loop (반복)문이기 때문에 임의의 명령문을 반복적으로 수행해야 할때 사용되지만 while loop는 반복 횟수에 관계없이 특정조건을 만족하는한 계속 반복하는 구문이고 for loop는 특정 횟수만큼 반복하는 문법이다. while loop또한 for loop처럼 많이 쓰이기 때문에 구조에 대해 알아두면 좋다.

 

while(특정조건) {
   .......
}

문법은 간단하다. if문처럼 특정 조건이 있지만 특정 조건을 만족할 때만 블록안을 반복한다는 것이 if문과의 차이점이다.

 

 

do {

   실행 명령문

}

while(특정조건)

do while문도 있다. 이 구문은 while문과 달리 한번은 무조건 실행한다. 기존 while문은 조건을 만족해야 반복문에 진입했지만, do while문은 처음에 한번은 무조건 실행하고 조건판별 후 반복문에 진입할지를 판별하게 된다.

 

 

int i = 0;

while(i < 5) {
   Serial.println("hello world");
   i++;
}

위와같은 while문일 경우에는 hello world는 총 5번 출력된다. 0에서 4가 되기까지 반복문을 5번 수행해야 하기 때문이다.

 

 

 

 

 

while loop를 이용한 간단한 회로도

while loop를 이용하여 센서와 스위치를 활용해 내장 LED와 LED를 깜빡여보자.

 

 

 

 

 

부품 목록

 

No 부품명 수량  
1 아두이노 보드 1개
2 스위치 1개
3 아날로그 센서 1개
4 10k 저항 2개
5 브레드보드 1개

 

부품명 아두이노 보드 스위치 아날로그 센서 10k 저항 브레드 보드
부품 사진
 

 

 

 

 


하드웨어 making

 

브레드보드

전자 회로도(스케메틱)

 

소프트웨어 coding

 

/*
제목 : 제어문 - 반복(while)
내용 : while문에 대해 알아보자(아두이노 홈페이지 발췌)
*/


//const가 붙은 값들은 소스내부에서 변경되지 않음
//센서 핀번호를 A2로 설정
const int sensorPin = A2;       
//LED핀번호를 9번으로 설정
const int ledPin = 9;    
//13번내장LED핀번호를 13번으로 설정
const int indicatorLedPin = 13; 
//버튼핀번호를 2번으로 설정
const int buttonPin = 2;        


//이 값들은 소스내부에서 변경될 수 있음
//센서 최소값의 초기값을 1023으로 지정
int sensorMin = 1023;  
//센서 최대값의 초기값을 0으로 지정
int sensorMax = 0; 
//sensorValue변수값을 0으로 지정
int sensorValue = 0;         


void setup() {
	// 각각 핀번호에 맞는 모드설정을 해줌
	pinMode(indicatorLedPin, OUTPUT);
	pinMode (ledPin, OUTPUT);
	pinMode (buttonPin, INPUT);
}

void loop() {
  // 버튼이 눌리면 조건에 의해 calibrate()함수가 실행된다
	while (digitalRead(buttonPin) == HIGH) {
		calibrate(); 
	}
	//13번 LED를 끔으로 calibrate()함수가 끝났다는 것을 알린다
	digitalWrite(indicatorLedPin, LOW);  
	// 센서의 값을 읽어온다
	sensorValue = analogRead(sensorPin);
	// 센서의 값을 map함수를 통해 0부터 255사이의 숫자로 상대변환한다
	sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);
	//센서값의 범위를 0부터 255사이로 제한한다
	sensorValue = constrain(sensorValue, 0, 255);
	// LED에 0부터 255사이의 밝기값을 전송하여 켠다
	analogWrite(ledPin, sensorValue);
}

void calibrate() {
	// 13번 LED를 켜서 calibrate()함수가 실행된다는 것을 알린다
	digitalWrite(indicatorLedPin, HIGH);
	// 센서값을 읽어서 sensorValue에 저장한다
	sensorValue = analogRead(sensorPin);
	// 측정한 센서값이 max값보다 클 경우 현재의 값을 max값으로 지정
	if (sensorValue > sensorMax) {
		sensorMax = sensorValue;
	}
	// 측정한 센서값이 min값보다 작을 경우 현재의 값을 min값으로 지정
	if (sensorValue < sensorMin) {
 		sensorMin = sensorValue;
	}
}

 

 

소스를 해석하면 loop에서는 while문을 통해 스위치가 눌렸는지의 여부를 확인하여 스위치를 누르고 있을 경우 calibrate()함수를 반복 호출하게되고
눌리지 않았을 경우에는 아날로그 센서값을 계속적으로 받아 map함수와 constrain함수를 사용(아두이노 함수 참조) 센서값을 0에서 255사이로 상대조절하여 LED의 밝기를 조절한다.
스위치를 누르고 있을 경우에는 calibrate()함수를 호출하게 되는데 calibrate()함수가 호출될 경우에는 LED는 켜지지 않고 그대시 아두이노 자체 내장 LED가 대신 켜지게 된다. 그 다음 아날로그 센서의 측정값을 계속 받아와서 최대값과 최소값을  sensorMax과 sensorMin변수에 각각 저장한다.
cailbrate()함수에서 받은 최소값과 최대값은 스위치가 눌려지지 않았을 경우에서 아날로그 센서값을 상대조절할때 범위를 지정할때 사용된다. 

 

 

 

 

 

kocoafabeditor

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

반복문, while, 기타