FALLING、RISING、CHANGE
CoddyのArduinoジャーニー「delayを使わないタイミング制御」セクションの一部。レッスン 13/18。
Uno には割り込みをトリガーできるピンが2つあります。ピン2とピン3です。割り込みが必要なボタンは、いずれか一方に配線する必要があります。チップ内部ではそれぞれ割り込み0と割り込み1なので、digitalPinToInterrupt()を使ってピンを番号に変換します。attachInterrupt(3, ...)は割り込み3を指定しますが、Unoには存在しないため、何も起こりません。
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プレイグラウンド