본문 바로가기
임베디드/Arduino

button Interrupt : ISR (인터럽트 핸들러) // mode : Falling, Rising, Change, Low

by sj0020 2020. 9. 1.
const int buttonPin1 = 2; //인터럽트 0
const int buttonPin2 = 3; //인터럽트 1
const int buttonPin3 = 4;

void setup() {
 Serial.begin(9600);
 pinMode(buttonPin1, INPUT);
 pinMode(buttonPin2, INPUT);
 pinMode(buttonPin3, INPUT);

 //////////////////////////////////////////
 // 0 :인터럽트 번호 (UNO 0,1 인터럽트 번호)
 // buttonInterrupt : ISR (인터럽트 핸들러)
 // mode : Falling, Rising, Change, Low
 //+++++++++++++++++++++++++++++++++++++++++
 //Falling : 신호가 High 에서 Low로 바뀔 때 인터럽트 발생 #눌렀다 뗐을 때
 //Rising : 신호가 Low 에서 High로 바뀔 때 인터럽트 발생 #눌렀을 때
 //Change : 신호가 바뀔 때 인터럽트 발생 (핀입력값이 변경될 때)
 //Low : 신호가 Low 일 때 인터럽트 발생, Low인 동안 반복 호출 됨
 //++++++++++++++++++++++++++++++++++++++++++

 attachInterrupt (digitalPinToInterrupt (buttonPin1), buttonInterrupt1,  FALLING);
 attachInterrupt (digitalPinToInterrupt (buttonPin2), buttonInterrupt2,  RISING);
 
}

void loop() {  //polling 방식
  int val = digitalRead (buttonPin3);
  if (val ==1){
    Serial.println("1번 버튼 누름");
    }
}

void buttonInterrupt1(){ //interrupt방식
  Serial.println("2번 버튼 누름");
}

void buttonInterrupt2(){ //interrupt방식 rising
  Serial.println("3번 버튼 누름");
}

 

falling 눌렀다 뗐을 때 / Rising 눌렀을 때

시리얼 모니터에 뜸  - 위의 값은 풀다운/풀업 저항이냐에 따라 반대로 달라짐

(지금은 자세히 알 필요없고 falling/rising 에 따라 달라지는구나 .. 정도만 알면 됨)

 

 

코드 내용은 별로 좋지 않은코드임. 이게 인터럽트 핸들러다~ 라는 개념만 보기 위함

 

Debounce 적용 1

const int buttonPin1 = 2; //인터럽트 0
const int buttonPin2 = 3; //인터럽트 1
const int buttonPin3 = 4;

// Variables will change:
int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers
void setup() {
 Serial.begin(9600);
 pinMode(buttonPin1, INPUT);
 pinMode(buttonPin2, INPUT);
 pinMode(buttonPin3, INPUT);

 //////////////////////////////////////////
 // 0 :인터럽트 번호 (UNO 0,1 인터럽트 번호)
 // buttonInterrupt : ISR (인터럽트 핸들러)
 // mode : Falling, Rising, Change, Low
 //+++++++++++++++++++++++++++++++++++++++++
 //Falling : 신호가 High 에서 Low로 바뀔 때 인터럽트 발생
 //Rising : 신호가 Low 에서 High로 바뀔 때 인터럽트 발생
 //Change : 신호가 바뀔 때 인터럽트 발생 (핀입력값이 변경될 때)
 //Low : 신호가 Low 일 때 인터럽트 발생, Low인 동안 반복 호출 됨
 //++++++++++++++++++++++++++++++++++++++++++

 attachInterrupt (digitalPinToInterrupt (buttonPin1), buttonInterrupt1,  RISING);
 attachInterrupt (digitalPinToInterrupt (buttonPin2), buttonInterrupt2,  FALLING);
 
}

void loop() {
  // read the state of the switch into a local variable:
  int reading = digitalRead(buttonPin3);

  // check to see if you just pressed the button
  // (i.e. the input went from LOW to HIGH), and you've waited long enough
  // since the last press to ignore any noise:

  // If the switch changed, due to noise or pressing:
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (buttonState == HIGH) {
        ledState = !ledState;
        Serial.println("1번버튼 누름");
      }
    }
  }

  // save the reading. Next time through the loop, it'll be the lastButtonState:
  lastButtonState = reading;
}

void buttonInterrupt1(){
  Serial.println("2번 버튼 누름");
}

void buttonInterrupt2(){
  Serial.println("3번 버튼 누름");
}

 

Debounce 적용 2 (더 간단하게)

const int buttonPin1 = 2; // 인터럽트 0
const int buttonPin2 = 3; // 인터럽트 1
const int buttonPin3 = 4;

//int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
//int lastButtonState = LOW;   // the previous reading from the input pin

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
//unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
//unsigned long debounceDelay = 50;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  // 0 : 인터럽트 번호 (UNO 0 ,1 인터럽트 번호)
  // buttonInterrupt : ISR (인터럽트 핸들러)
  // mode : FALLING, RISING, CHANGE, LOW
  // FALLING : 신호 HIGH -> LOW 인터럽트 발생
  // RISING : 신호 LOW -> HIGH 인터럽트 발생
  // CHANGE : 신호가 바뀔 때 인터럽트 발생 (핀 입력값이 변경될 때)
  // LOW : 신호가 LOW일 때, 인터럽트 발생, LOW인 동안 반복 호출 
  attachInterrupt(digitalPinToInterrupt(buttonPin1), buttonInterrupt1, FALLING);
  attachInterrupt(digitalPinToInterrupt(buttonPin2), buttonInterrupt2, RISING);
}

void loop() {
  // put your main code here, to run repeatedly:
  int reading = digitalRead(buttonPin3); // 폴링 방식 //클럭주파수 때문에 쫙 떨어지면서 뜬다.
  

  // if the button state has changed:
  if (reading != buttonState) { // buttonState의 값은 전역변수 0 => reading이 1일 때,
    buttonState = reading; // buttonState 값을 0으로 바꿔라

    // only toggle the LED if the new button state is HIGH
    if (buttonState == 1) { // if 버퍼 -> 시간차 조정
      Serial.println("1번 누름");
    }
  }
}

void buttonInterrupt1() {
  Serial.println("2번 누름"); // 인터럽트 방식
}

void buttonInterrupt2() {
  Serial.println("3번 누름"); // 인터럽트 방식
}

 

 

'임베디드 > Arduino' 카테고리의 다른 글

키입력인터럽트 + LED + buzzer  (0) 2020.09.02
키입력 인터럽트  (0) 2020.09.02
인터럽트  (0) 2020.09.01
button_led  (0) 2020.09.01
CDS 조도센서 , Potentiometer 가변저항  (0) 2020.08.21