728x90
반응형
앞선 포스팅에서 digitalRead 함수를 이용한 예제를 풀어보았다.
https://udangtangtang-cording-oldcast1e.tistory.com/38?category=1019061
위의 예제를 응용하여 우리는 버튼 입력값을 받아 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;
}
버튼이 눌렸을 때 실행할 함수 선언
- LED의 상태 변화를 true로 설정
- 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
반응형
'Arduino > [3] Arduino Cording' 카테고리의 다른 글
[Arduino Cording] #5. Timer1 (0) | 2022.03.06 |
---|---|
[Arduino Cording] #4. 토글(toggle) (0) | 2022.03.05 |
[Arduino Cording] #3. attachPCINT(복합주기 설정 2) (0) | 2022.03.05 |
[Arduino Cording] #1. millis 함수 (0) | 2022.03.05 |