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

void setup(){
pinMode(13, OUTPUT);
}
void loop(){
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
스케치 13-1은 1초간 LED를 켜고, 1초간 LED를 끄는 응용이다.
delay(1000);은 1초간 정지한다. 이 경우delay()함수는 한 가지 작업만 수행하므로 아무 문제가 되지 않는다.
그러나 LED를 깜박이면서 그 사이에 다른 작업을 하고 싶다면 이 방법으로는 해결이 되지 않는다.
함수 중에millis()를 이용하면 시간 간격을 나누어 활용할 수 있다.millis( )함수는 1/1000초 간격으로 시간을 읽는 함수이다.
이전에 저장된 시간보다 현재 시각이 1000이 더 크면 1초가 지난 것이다.이전 시각(pt)을 읽고,현재 시각(ct)을 읽은 후 두 값을 비교해서 1초를 계산할 수 있다.
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);
}
// 코드를 여기에 넣으세요.
}
loop()속의 if문 밖에 다른 프로그램을 넣으면 다중 작업을 실행할 수 있다.loop()에서 반복될 때마다 그때 경과된 밀리초(1/1000)를 읽고 1초가 되지 않은 경우if()문 아래의 코드를 실행한다.
void setup() {
Serial.begin(9600);
}
long cnt, Mil;
void loop() {
if (millis() - Mil >= 1000) { // 1초를 계산하는 프로그램
Mil = millis();
Serial.println(cnt++);
}
}

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