【Arduino電子工作】タクトスイッチでダブルクリック判定
目的
タクトスイッチを素早く二回押した際、それをダブルクリックとして認識する
また、一回しか押さなかった場合、シングルクリックとして認識するプログラム
今回使うもの
- Arduino Micro
- タクトスイッチ
- ブレッドボード
- ジャンパワイヤ
回路
プログラム
//目的:タクトスイッチのダブルクリック&シングルクリック判定
/*前提条件として
スイッチはプルアップ方式で抵抗を繋げた状態でデジタルピン9番に接続している
スイッチが押されていると、1
スイッチが押されていない場合は、0
がそれぞれ9番ピンに入力されるダブルクリックはスイッチが一回押された後、離し、コンマ数秒後にもう一度押された場合のことを指す
シングルクリックはスイッチが一回押された後、離し、コンマ数秒たっても再び押されなかった場合のことを指す
*///click_flag_1は一回目のクリック判定に使う、click_flag_2は二回目のクリック判定に使う
int click_flag_1 = 1 , click_flag_2 = 1;
int switch_pin = 9;void setup() {
pinMode(switch_pin, INPUT);
Serial.begin(9600);
}void loop() {
//一回目のクリック確認 ONの時0 OFFの時1が入力される
click_flag_1 = digitalRead(switch_pin);
//一回目のクリックがされた場合
if(click_flag_1 == 0){
//0.2秒内にスイッチが離された場合、click_flag_1==1の状態でループから出る
for(int i=0; i<10; i++){
click_flag_1 = digitalRead(switch_pin);
if(click_flag_1 == 1)break;
delay(20);
}
//もしスイッチが離されたならダブルクリックか
//シングルクリックなのかを確認するループに入る
if(click_flag_1 == 1){
//0.2秒内にスイッチが押された場合、clck_flag_2==0の状態でループから出る
for(int i=0; i<10; i++){
click_flag_2 = digitalRead(switch_pin);
if(click_flag_2==0)break;
delay(20); //20ms
}
//click_flag==0であればそれをダブルクリックとする
if(click_flag_2 == 0){
Serial.println("Double");
click_flag_2 = 1;
delay(50);
//もしclick_flag==0でない場合はシングルクリックとする
}else{
Serial.println("Single");
}
}
}
delay(100); //ここの数値を小さくすると上手く動かなくなるので注意
}
プログラムのポイントになりそうなことは、プログラム内のコメントに書いてあります。
今回のプログラムで悩んだのは、シングルとダブルクリックの見分け方をどうするかです。
for文でコンマ数秒のループをつくり、その間にスイッチが押されるか、押されないかで判断することにしました
実際の動作
カメラ撮影と、PC画面キャプチャそれぞれ撮って編集するのが結構面倒だったので、今回は手抜きのカメラ撮影のみです。
もっとスマートなプログラムが書けないのかと思いましたが、最初に思いついたのがこれなので一応記事にしておきます。
なにか思いついたらまたつくってみようと思います
おわり