이번시간에는 아두이노의 고급 기능중 타이머에 대해 알아보겠습니다~



만약에 아두이노에 LED를 달고 1초 간격으로 깜빡이고 싶다면 어떻게 하시나요??


아마 예제에 있는 Blink처럼 짜면 되겠지요?ㅎㅎ



// the setup function runs once when you press reset or power the board

void setup() {

  // initialize digital pin LED_BUILTIN as an output.

  pinMode(LED_BUILTIN, OUTPUT);

}


// the loop function runs over and over again forever

void loop() {

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)

  delay(1000);                       // wait for a second

  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW

  delay(1000);                       // wait for a second

}



자 그럼, 1초간격으로 LED는 깜빡이면서, 1초에 10번 아날로그 신호를 읽으려면 어떻게 해야할까요??


// the setup function runs once when you press reset or power the board

void setup() {

  // initialize digital pin LED_BUILTIN as an output.

  Serial.begin(9600);

  pinMode(LED_BUILTIN, OUTPUT);

}


// the loop function runs over and over again forever

void loop() {

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)

  delay(1000);                       // wait for a second

  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW

  delay(1000);                       // wait for a second


  Serial.println(analogRead(A0));

  delay(100);

}


먼저 딜레이를 줘서 깜빡이는것 까지는 이해가 되지요?

그럼 이 상황에서 시리얼 모니터를 켜보면.... 엥??

1초에 10번이 아니라, 거의 2초에 한 번 정도 업데이트가 되죠?


이유는 바로 이 delay()함수 때문이에요!

delay()함수가 실행되면 해당된 시간이 지나기전까지는 그 뒤의 코드로 넘어가지 않습니다.


그럼 도대체 어떻게 해야


1) 1초 간격으로 LED를 깜빡이면서,

2) 1초에 10번 아날로그 신호를 받는 것


이 가능할까요??


바로 타이머(Timer)를 이용하는 겁니다.


타이머란,

아두이노 회로의 오실레이터에서 생성되는 클럭을 이용해 물리적인 시간을 측정하는 것으로,

딜레이의 경우, delay(1000) 이면 1000ms동안 생성되는 클럭이 있더라도 아무 일을 못하는 경우지만, 

타이머로 1000ms을 준다면, 1000ms 주기의 클럭이 생길 때 마다 특정일을 하므로

멀티테스킹(멀티쓰레드)과 비슷한 효과를 줄 수 있습니다.



http://playground.arduino.cc/Code/Timer

위 페이지로 가시면, 타이머 라이브러리에 대한 설명이 있고,


https://github.com/JChristensen/Timer

위 페이지에서는 해당 라이브러리를 다운받을 수 있습니다.


다운받고 압축을 푸시면 폴더가 생길텐데, 이 폴더를 내 문서->Arduino->Library 폴더에 통째로 넣어주시고

아두이노를 다시 실행하세요!


예제에 가시면 Timer-master -> blink2 가 있을거에요

열어서 실행해보시면 딱히 변한거 없이 LED가 깜빡이는걸 보실 수 있을겁니다


그럼 1초당 10번 아날로그 신호 모니터링은 어떻게 할까요?


바로 every 함수를 사용하면 해결할 수 있습니다.




#include "Timer.h"


const int LED1 = 13;

const unsigned long PERIOD1 = 1000;    //one second


Timer t;                               //instantiate the timer object

Timer led;                            //timer for analogRead function.


void setup(void)

{

    Serial.begin(9600);

    pinMode(LED1, OUTPUT);

    t.oscillate(LED1, PERIOD1, HIGH);

    led.every(100,readData);

}


void loop( )

{

    t.update();

    led.update();

}


void readData(){

  Serial.println(analogRead(A0));

  return 0;

}



자 그러면 깔끔하게 해결이 되지요ㅎㅎ


다만!! 메인 루프에 딜레이를 넣는순간 모든 타이머들이 뒤로 밀려나기때문에 조심하셔야되요!


이상 타이머를 이용한 멀티테스킹이었습니다^^

+ Recent posts