본문 바로가기

Dev/C언어

아두이노 millis와 interrupt로 LED 제어하기

728x90
반응형

이번 회로는 두 개의 LED를 하나는 millis로 blink 동작을 하게 설정하고 나머지 하나는 interrupt를 사용하여

버튼이 눌리면 LED 상태가 반전되도록 구성했습니다.

 

첫 번째 LED인 빨간 LED는 0.5초마다 깜박거리는 동작을 하게 되고 파랑 LED는 스위치를 누를 때마다

상태가 반전될 겁니다.

 

여기서 millis를 사용하는 이유는 빨간 LED의 blink 동작을 delay로 설정하게 되면 다른 동작을 동시에

수행할 수 없기 때문에 millis를 사용해 준 것입니다.

 

int pin_button=2;
int pin_LED1=13, pin_LED2=10;
boolean LED_state1=false;
boolean LED_state2=false;
unsigned long time_previous, time_current;

void setup()
{
  pinMode(10, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0, sw_isr, FALLING);
  time_previous=millis();
}

volatile int sw_pressed=0;
void sw_isr(){
  sw_pressed=1;
}

void loop()
{
  time_current=millis();
  if(time_current - time_previous >= 500){
    time_previous = time_current;
    LED_state1=!LED_state1;
    digitalWrite(pin_LED1, LED_state1);
  }
  
  if(sw_pressed){
    LED_state2=!LED_state2;
    digitalWrite(pin_LED2, LED_state2);
    sw_pressed=0;
  }
}

그리고 코드를 보시면 스위치를 INPUT_PULLUP 으로 동작을 설정하고, 인터럽트를 FALLING으로 했는데요.

 

스위치를 PULLUP으로 설정해놨기 때문에 기본이 HIGH값입니다.

 

결국 LOW값으로 FALLING될 때 인터럽트를 실행한다는 의미죠.

 

그럼 다시 누르면 LOW에서 HIGH로 상태가 바뀌는데

이 때는 인터럽트가 실행이 안되지 않냐는 분들도 있으실 수 있습니다.

 

if문을 보시면 LED 상태를 반전시켜주고 마지막에 sw_pressed를 0으로 다시 만들어주기 때문에

스위치가 눌리기 전으로 설정되는 것이죠.

 

그리고 1번 LED는 현재 시간이 이전 시간보다 500ms, 0.5초가 넘으면 LED 상태를 반전시키기 때문에 계속하여

0.5초마다 LED상태가 바뀌면서 깜박거리는 동작을 하게되는 겁니다.

 

Interrupt나 millis같은 기능은 Arduino Reference에서도 찾으실 수 있습니다.

728x90
반응형

"); wcs_do();