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 |