본문 바로가기

Arduino/[3] Arduino Cording

[Arduino Cording] #2. attachInterrupt(복합주기 설정 1)

728x90
반응형

앞선 포스팅에서 digitalRead 함수를 이용한 예제를 풀어보았다. 

https://udangtangtang-cording-oldcast1e.tistory.com/38?category=1019061 

 

[Arduino] #7. 아두이노 디지털/아날로그 출력하기 & 예제

저번 포스팅에서 입출력 함수를 배웠다면, 이번 포스팅에서는 디지털/ 아날로그 입출력 함수를 통해 직접 아두이노를 구동해보자. 입출력 선언 pinMode(variable,status); //variable(변수)를 status로 입출

udangtangtang-cording-oldcast1e.tistory.com

위의 예제를 응용하여 우리는 버튼 입력값을 받아 LED의 동작을 제어할 수 있다. 하지만 버튼을 때게 되면 LED의 불이 꺼지게 되는데, 이러한 문제점을 attachInterrupt을 사용하면 해결할 수 있다.

attachInterrupt

attachInterrupt란 특정한 핀에 특정한 조건에 맞는 외부 인터럽트가 발생할 경우 수행할 함수를 등록하는 함수이다.

아두이노 자체적으로 탑제되어 있으므로 따로 include를 하지 않아도 된다.

attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);
pin 핀 번호. 아두이노의 경우 2,3
ISR 인터럽트가 발행하면 하드웨어적으로 호출되는 인터럽트 처리함수.
일반적으로 사용자가 정의하는 함수이다.
mode 인터럽트 발생 조건

mode 조건

RISING LOW -> HIGH
FALLING HIGH -> LOW
CHANGE RISING -> FALLING
LOW pin : LOW 연결

인터럽트로 LED 제어하기

const int LED= 12;
const int BUTTON = 2;

int LED_STATE = LOW;
bool LED_STATE_CHANGE = false;

void BP(){

  LED_STATE_CHANGE = true;
  LED_STATE = (LED_STATE==LOW)?HIGH:LOW;
}

void setup (){

  pinMode(LED,OUTPUT);
  pinMode(BUTTON,INPUT);

  attachInterrupt(digitalPinToInterrupt(BUTTON),BP,RISING);
}

void loop(){

  if(LED_STATE_CHANGE){
    LED_STATE_CHANGE = false;
    digitalWrite(LED,LED_STATE);
  }
}

용어 설명

const int LED= 12;
const int BUTTON = 2;
  • LED 변수에 12번 핀 할당: LED
  • BUTTON 변수에 2번 핀 할당: 버튼
int LED_STATE = LOW;
bool LED_STATE_CHANGE = false;
  • LED의 상태(LED-STATE)를 LOW로 설정
  • bool 함수 이용하여 LED의 상태 변화(LED_STATE_CHANGE)를 불변(false)으로 설정
void BP(){//BUTTON PRESS
  LED_STATE_CHANGE = true;
  LED_STATE = (LED_STATE==LOW)?HIGH:LOW;
}

버튼이 눌렸을 때 실행할 함수 선언

  1. LED의 상태 변화를 true로 설정
  2. LED의 상태(LED_STATE)를 조건 연산자를 이용하여 LOW이면 HIGH, HIGH이면 LOW로 설정

즉, 버튼이 눌리면 LED가 변화할 수 있음을 알리고 LED의 상태(ON/OFF)를 변경한다.

void setup (){

  pinMode(LED,OUTPUT);
  pinMode(BUTTON,INPUT);

  attachInterrupt(digitalPinToInterrupt(BUTTON),BP,RISING);
}
  • LED와 BUTTON의 입출력을 선언한다.
  • attachInterrupt를 정의한다.
void loop(){
  if(LED_STATE_CHANGE){
    LED_STATE_CHANGE = false;
    digitalWrite(LED,LED_STATE);
  }
}

LED의 상태 변화값이 1이면(LED의 변화 여부가 가능하면) LED의 상태 변화 여부를 false로 설정하고 LED의 상태에 맞게 LED를 제어한다. 

728x90
반응형
댓글