13-2 아두이노에서 millis() 함수 활용

공부하는 학생 A·2024년 2월 20일
0

아두이노 

목록 보기
67/74

delay() 함수의 문제점

아두이노에서 LED를 깜박이면서 부저를 울려야 하는 경우와 같이 두 가지 작업을 동시에 해야하는 경우가 있다. 1초마다 LED를 깜박일 경우 일반적으로 delay(1000) 함수를 활용하며 delay(1000)는 1초 동안 아무 일도 하지 않고 기다리기만 한다. delay(time) 함수가 실행되면 설정된 시간이 될 때까지 다음 코드로 넘어가지 않는다.

스케치 13-1, 13-2 회로 제작

스케치 13-1 delay()를 활용한 LED 점멸하기

void setup(){
    pinMode(13, OUTPUT);
}
void loop(){
    digitalWrite(13, HIGH);
    delay(1000);
    digitalWrite(13, LOW);
    delay(1000);
}

스케치 13-1 분석

스케치 13-1은 1초간 LED를 켜고, 1초간 LED를 끄는 응용이다. delay(1000);은 1초간 정지한다. 이 경우 delay() 함수는 한 가지 작업만 수행하므로 아무 문제가 되지 않는다.
그러나 LED를 깜박이면서 그 사이에 다른 작업을 하고 싶다면 이 방법으로는 해결이 되지 않는다.


함수 중에 millis()를 이용하면 시간 간격을 나누어 활용할 수 있다. millis( )함수는 1/1000초 간격으로 시간을 읽는 함수이다.


이전에 저장된 시간보다 현재 시각이 1000이 더 크면 1초가 지난 것이다. 이전 시각(pt)을 읽고, 현재 시각(ct)을 읽은 후 두 값을 비교해서 1초를 계산할 수 있다.

스케치 13-2 millis()를 활용한 LED 깜박이기

void setup(){
    pinMode(13, OUTPUT);
}
long pt=0;  // 이전 시간
int flag=1;  // LED 켜고 끄는 플래그
void loop(){
    long ct=millis();  // 현재시간
    if(ct-pt>1000){  // 1초가 지났는지 확인하기
        pt = ct;
        flag= !flag;     
        digitalWrite(13, flag);
    }
    // 코드를 여기에 넣으세요. 
}

스케치 13-2 분석

loop() 속의 if문 밖에 다른 프로그램을 넣으면 다중 작업을 실행할 수 있다. loop()에서 반복될 때마다 그때 경과된 밀리초(1/1000)를 읽고 1초가 되지 않은 경우 if()문 아래의 코드를 실행한다.

스케치 13-3 millis를 활용해서 시리얼 모니터로 1초에 1씩 증가시켜 보내기

void setup() {
  Serial.begin(9600);
}
long cnt, Mil;
void loop() {
  if (millis() - Mil >= 1000) { // 1초를 계산하는 프로그램
    Mil = millis();
    Serial.println(cnt++);
  }
}

스케치 13-3 실행결과

스케치 13-4 프로세싱으로 시리얼 포트에서 값을 받아 하드 디스크에 저장하기

"조금 더 생각하고 오겠음"

profile
Shine like a star, Just like a star

0개의 댓글