본문 바로가기

아두이노(arduino)

아두이노 딜레이 delay / delayMicroseconds 함수와 millis()

 

delay() / delayMicoroseconds() 딜레이 함수 사용 목적

 

delay() 함수와 delayMicroseconds() 함수는 프로그램 실행을 일정 시간 동안 중지시키는 함수입니다.  이 함수들은 일정 시간 동안 아무 작업도 수행하지 않고 대기하며, 대기하는 동안 전력을 소비합니다.

따라서 delay() 함수나 delayMicroseconds() 함수는 주로 외부 장치를 제어하는 등의 간단한 작업에서 사용됩니다. 예를 들어, LED를 깜빡이거나 버튼 입력을 처리하는 코드에서는 delay() 함수를 사용하여 일정 시간마다 작업을 수행합니다.



그러나 delay() 함수나 delayMicroseconds() 함수에는 치명적인 약점이 있습니다. 바로  실행 중에 다른 작업을 수행할 수 없습니다. 대체할 수 있는 방법을 고려해야 하는데, millis() 함수나 타이머 인터럽트를 사용하여 대기 기능을 대체할 수 있으며, 이를 활용하면 더욱 유연하고 효율적인 코드를 작성할 수 있습니다.

 

<요약>
delay / delayMicroseconds 함수는 실행되는 코드가 진행되지 않고 일정 시간 중지 시키는 함수

예시코드
void setup() {
pinMode(13, OUTPUT); // LED를 제어하기 위해 13번 핀을 출력 모드로 설정
}

void loop() {
digitalWrite(13, HIGH); // LED를 켬
delay(1000); // 1초 동안 대기
digitalWrite(13, LOW); // LED를 끔
delay(1000); // 1초 동안 대기

}

delay 가 있는 줄에서는 시간이 다 흐르기 전까지 다음 코드를 실행하지 않습니다.

 

 

 

해당 사진은 12번 핀을 이용해 led를 제어예시입니다.

 

 

 

 


 

 

 

 

 

 

 

delay() 함수와  delayMicoroseconds() 함수의 차이점 (딜레이 / 딜레이마이크로세컨즈)

 

아두이노(Arduino)의 delay() 함수와 delayMicroseconds() 함수는 둘 다 프로그램 실행을 일정 시간 동안 지연시키는 함수입니다. 그러나 두 함수의 차이점은 지연시킬 수 있는 시간 단위에 있습니다.

 

delay() 함수는 매개변수로 전달된 밀리초 단위의 시간만큼 지연시킵니다. 즉, 1/1000초 단위로 지연시킬 수 있습니다. 예를 들어, delay(1000)은 프로그램 실행을 1초 동안 지연시키는 함수 호출입니다.

반면에 delayMicroseconds() 함수는 매개변수로 전달된 마이크로초 단위의 시간만큼 지연시킵니다. 즉, 1/1000000초 단위로 지연시킬 수 있습니다. 예를 들어, delayMicroseconds(1000000)은 프로그램 실행을 1초 동안 지연시키는 함수 호출입니다.

따라서 delay() 함수는 상대적으로 더 긴 지연 시간을 필요로 하며, 주로 외부 장치를 제어할 때 사용됩니다. 반면에 delayMicroseconds() 함수는 매우 짧은 시간 동안의 지연이 필요할 때 사용됩니다. 예를 들어, 신호 처리나 타이밍 조절 등의 용도로 사용될 수 있습니다.

 

<요약>

delay(1000);                                // 1초 기다림 (지연)
delayMicroseconds(1000000);    // 1초 기다림 (지연)

동일하게 기다리는 것은 맞으나, 얼마나 더 정밀하게 시간을 기다리느냐에 따라 달리 사용합니다. 동작하는 것은 둘다 똑같습니다.

 

 

 

 


 

 

 

delay 함수의 단점

 

delay() 함수는 프로그램의 실행을 중지시키는 것이므로, 실행 중에 다른 작업을 수행할 수 없습니다. 이는 다음과 같은 단점을 가지고 있습니다.

1. 다른 작업을 수행할 수 없음: delay() 함수는 대기하는 동안 다른 작업을 수행할 수 없습니다. 이는 시간이 중요한 작업에서는 큰 문제가 될 수 있습니다.

2. 시간 지연이 정확하지 않을 수 있음: delay() 함수는 실제 시간과 달리 대략적인 시간 지연만을 제공합니다. 이는 다른 작업에 따라 시간 지연이 다르게 나타날 수 있으며, 정확한 타이밍이 필요한 작업에서는 문제가 될 수 있습니다.

3. 전력 소모량이 높음: delay() 함수를 사용하면 CPU가 대기하면서 전력을 소비하기 때문에 전력 소모량이 높아질 수 있습니다.

 

 

 

 


 

 

 

 

 

delay()함수의 단점을 millis() 함수를 이용해 극복

 

delay() 함수는 프로그램 실행을 중지하기 때문에 다른 작업을 수행할 수 없으며, 전력 소모량이 높아질 수 있습니다. 따라서 필요에 따라 적절히 사용해야 합니다.

반면에 millis() 함수는 시간을 측정하기 때문에 다른 작업을 수행할 수 있으며, 전력 소모량이 낮아지는 장점이 있습니다. 또한, millis() 함수와 delay() 함수를 함께 사용하여 일정 시간마다 작업을 수행하는 등의 유연한 코드를 작성할 수 있습니다.

 

코드를 통해 두 함수를 비교해봅시다.

 

 



// delay() 함수를 사용한 예제 코드


void setup() {
pinMode(13, OUTPUT); 13번 핀 led를 출력으로 설정
}
void loop() {
digitalWrite(13, HIGH); // 13번핀 전기 흘림(led켜짐)
delay(1000);  // 1초 기다림
digitalWrite(13, LOW);  // 13번핀 전기 끊음(led꺼짐)
delay(1000); // 1초 기다림
}


// millis() 함수를 사용한 예제 코드


unsigned long previousMillis = 0; // 이전에 LED를 켰거나 끈 시간을 저장하는 변수
const unsigned long interval = 1000;// LED를 켜거나 끄는 간격(밀리초)

void setup() {
pinMode(13, OUTPUT);
}

void loop() {

      unsigned long currentMillis = millis(); // 현재 시간을 밀리초 단위로 측정

      if (currentMillis - previousMillis >= interval) { // 이전 시간과의 차이가 간격 이상일 때
      previousMillis = currentMillis; // 현재 시간을 이전 시간으로 저장
      digitalWrite(13, !digitalRead(13)); // LED를 켜거나 끔
      }

}

loop문의 코드가 돌아가면서 내가 설정한 시간만큼 흘렀는지 계속 체크하면서 반복하고 내가 설정한 시간보다 넘어가게되면 원하는 동작 실행 즉, 그냥 기다리는것이 아니라 설정한 시간이 될때까지 시간만 체크하고 특정행동 하지 않음.