// 外部割込み。2番ピンに割り込みが発生(LOWからHIGHへ変化)した時にLEDの状態(点灯・消灯)を切り替える
// ★★★ Bounce チェックの有でもうまくいく【チャタリング対策版】★★★
// ★★★ チャタリング防止策の考え方 <一定時間待ち後に状態確認> ★★★
// 割込処理関数内ではdelay()関数使えないため、フラグを用いloop()関数内で処理
boolean state = LOW; //LED点灯・消灯を決める変数。
volatile int i_flg = 0; //割込み検知フラグ。
//volatile修飾子を付けることで最適化による誤動作を防止することができる(変数の最適化を抑える)
//割り込みは、意図しない最適化により変数が変更される可能性があるのでvolatile修飾子を付ける
void setup() {
Serial.begin(9600); //通信速度を9600bpsに
pinMode(9, OUTPUT);
pinMode(2, INPUT); //2番ピンの状態確認(チャタリング防止用)
attachInterrupt(0,int_ledact,RISING); //割り込みの設定(D2ピンがLOWからHIGHへ変化したとき)
//外部割込みint0はD2ピンで固定(int1=D3)
}
void loop() {
int val;
if (i_flg == 1) {
//★★★チャタリング防止のシーケンス(一定時間後のHIGHの確認)
delay(50); //立上り時のチャタリング対応
if (digitalRead(2) == HIGH) { //delayと合わせ立下り時のチャタリング対応(LOWならチャタリングと判断)
val = analogRead(0); //ボリュームにかかる電圧を読み込む
Serial.print("value = "); //文字列を送信(改行コードなし)
Serial.println(val); //値を送信(改行コード付き)
state = !state; //点灯と消灯を切り替える
digitalWrite(9, state);
}
i_flg = 0;
}
}
void int_ledact() {
i_flg = 1; //割込み検知
}