待ちなしチャタリング回避スケッチ


Arduinoタクトスイッチ Waitlessチャタリング回避プログラム

どこかのページで時間のかかる長いコードはチャタリングが発生しないと書いてあり頭の片隅にひっかかっていました。ということでArduinoで待ちなしチャタリング回避するスケッチを考えてみました。


通常のチャタリング回避とはボタンが押されてから30msほど待ってから、まだ押されている状態か判定してからコードを発砲します。今回はボタンが押されたら即発砲、ボタンをロックします。60ms後ボタンが状態が押されていなければロックを解除します。


const int ledPin1 = 13;
const int buttonPin = 12;
uint8_t addB;
uint8_t lastB;
int P = 0;
boolean led = 1;
int z = 1;
int i = 1;
boolean PushOk = true;
boolean StateOk = true;
unsigned long time1;
unsigned long time2;
unsigned long intrval_time;
unsigned long wait = 0;
void setup() {
 pinMode(buttonPin, INPUT_PULLUP);
 pinMode(ledPin1, OUTPUT);
 Serial.begin(9600);
}
void loop() {
 addB = digitalRead (buttonPin);
  if((addB != lastB) && (PushOk == true)){
   if(lastB == LOW){
    StateOk = false;
   }
   if((addB == LOW) && (lastB == HIGH) &&(PushOk == true)&&(StateOk == true)){
    time1 = millis();
   }
   lastB = addB;
  } else {
   if ((addB == HIGH) && (lastB == HIGH )&& (PushOk == true)){ //HIGHtoLOW検知の為のHIGHの確認
    StateOk = true;
     //Serial.println("Cheak stateOk");
    }
   if((millis() - time1 >= 0) && (millis() - time1 <= 1) && (addB == LOW )&& (StateOk == true)){
   /*------短押しの処理---------*/
    P ++;
    Serial.print("Count::");
    Serial.print( P );
    Serial.print(" FireEvent Time::");//Low検知からの時間
    int ajTime = millis() - time1;
    Serial.print( ajTime );
    intrval_time = millis() - time2 - ajTime ;
    time2 = millis() - ajTime;
    Serial.print(" Pushed Interval::");
    Serial.println( intrval_time );
   /*------短押しの処理---------*/
    StateOk = false;
    PushOk = false;
   }
  
   /*--長押しの繰り返し-----*/
   if((millis() - time1 >= 2) && (millis() - time1 <= 1999) && (addB == LOW )){
    wait = millis() - time1;
    z = 1;
   }
   /*-----------------------*/
   if((millis() - time1 >= 2000 * z) && (addB == LOW )) {
    z ++;
    /*-------繰り返し長押処理-------------*/
    Serial.print ("long pushed led;");
    led = !led;
    Serial.println (led);
    digitalWrite(ledPin1, led);
    /*-------繰り返し長押処理-------------*/
    StateOk = false;
    PushOk = false;
    wait = millis() - time1;
   }
   if ((millis()-time1 > 60 + wait) && (PushOk == false)){
    PushOk = true;//60ms後にボタン検知を可能にする
    //Serial.println("Cheak Pushok");
   }
  }
}

最初にストップウォッチのチャタリング回避を探してみましたが見つからずそれならばと作ってみました。そのせいでチャタリング回避プログラムと関係ないtimeが多々ありますが、チャタリング回避はtime1で測っています。


通常のタクトスイッチでは必要ないかも知れませんが、MIDIプログラムなどでは音切れ防止になるかもしれません


必要な回路はタクトスイッチを12pinと2つ横のGNDにさしてください。pullupしていますので抵抗はいらずの手抜き回路です。

default slider default slider
logo