하강, 상승 및 변화
Coddy Arduino 여정의 delay 없이 타이밍 제어하기 섹션에 포함된 레슨. 18개 중 13번째.
Uno에는 인터럽트를 트리거할 수 있는 핀이 두 개 있습니다. 핀 2와 핀 3입니다. 인터럽트가 필요한 버튼은 이 중 하나에 연결해야 합니다. 칩 내부에서는 각각 인터럽트 0과 인터럽트 1이므로, digitalPinToInterrupt()를 사용해 핀을 번호로 변환하세요. attachInterrupt(3, ...)은 인터럽트 3을 요청하지만, Uno에는 인터럽트 3이 없으므로 아무 일도 일어나지 않습니다.
attachInterrupt()의 마지막 부분은 어떤 변화에 반응할지 지정합니다.
FALLING: 핀이HIGH에서LOW로 바뀝니다(풀업을 사용하는 경우 버튼을 누를 때).RISING: 핀이LOW에서HIGH로 바뀝니다(버튼에서 손을 뗄 때).CHANGE: 두 변화 모두
CHANGE를 사용하면 버튼을 누를 때와 놓을 때 모두 ISR이 실행됩니다. 어느 상황이 발생했는지 확인하기 위해 핀을 읽습니다.
void onChange() {
if (digitalRead(buttonPin) == LOW) {
// 버튼이 눌렸다
} else {
// 버튼에서 손을 뗐다
}
}
attachInterrupt(digitalPinToInterrupt(buttonPin), onChange, CHANGE);챌린지
쉬움버튼은 핀 3에 연결되어 있고, loop()는 느린 작업을 하느라 바쁩니다. 핀 13의 LED가 버튼을 즉시 따라가도록 만드세요:
onChange()에서 버튼을 읽습니다:LOW이면 LED가 켜지고,HIGH이면 꺼집니다CHANGE를 사용해 버튼 핀에onChange()를 연결합니다
Run을 누르고, 버튼을 눌렀다가 놓은 다음 Check를 누르세요.
직접 해보기
const int ledPin = 13;
const int buttonPin = 3;
// 버튼 핀의 상태가 바뀔 때마다 실행됩니다.
void onChange() {
// 버튼을 누르면 LED를 켜고, 버튼에서 손을 떼면 끕니다
}
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
// 여기서 버튼 핀에 onChange()를 연결합니다
}
void loop() {
// 시간이 오래 걸리는 작업: 그대로 둡니다
Serial.println("working");
delay(2000);
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
delay 없이 타이밍 제어하기의 모든 레슨
직접 연습해 보세요: Arduino 플레이그라운드