2016-09-08 15 views
0

プッシュボタンのデバウンスに助けが必要です。シリアルリンクに同じ文字列を2回送信することがありますが、なぜか分かりません。誰かが私を助けてくれるのですが、どこに問題がありますか?Arduinoプッシュボタンデバウンス

int reading; 
int exbutton= LOW; 
unsigned long ddelay= 200; 
unsigned long last= 0; 
void loop(){ 
    reading= digitalRead(prkgbrake); 
    if (reading== HIGH && exbutton == LOW && millis() - last> ddelay){ 
    if (brake == 0){ 
     Serial.write("brake:1\n"); 
     while(digitalRead(prkgbrake) == HIGH){ 
     } 
    } 
    else{ 
     Serial.write("brake:0\n"); 
     while(digitalRead(prkgbrake) == HIGH){ 
     } 
    } 
    last = millis(); 
    } 

ありがとうございます。

答えて

0

このコードをどこかからコピーしないことをお勧めしますが、一部のコードは意味をなさないものです。

たとえば、 'prkgbrake'とは何ですか? 「ブレーキ」とは何ですか?彼らは宣言されていません。なぜあなたは 'setup()'機能を持っていませんか?

それにもかかわらず、デバウンスは多くの方法で実現できます。私はちょうどあなたのコードを修正します。そうすれば、間違ったことを理解することができます。

int exbutton  = LOW; 
unsigned int _delay = 200; 
int pushButton  = 2; 

void setup() 
{ 
    // initialize serial communication at 9600 bits per second: 
    Serial.begin(9600); 
    pinMode(pushButton, INPUT_PULLUP); 
} 

void loop() 
{ 
    while (digitalRead(pushButton) == LOW && exbutton == LOW) 
    { 
     if((millis() - last) > _delay) 
     { 
      Serial.println("Button Pressed"); 
      while(digitalRead(pushButton) == LOW); 
     } 
    } 
    last = millis(); 
} 

Explanantion:あなたはそれをプルアップ/プルダウンを使用することをお勧めしボタンとデジタルのピンを使用する場合は、あなたのプッシュボタンを想定し
は、デジタルピン2に接続されています。あなたはそれのために外部抵抗または内部抵抗を使用することができます。内部抵抗はプルアップのみをサポートしています。

プルアップ/ダウンチェックアウトの詳細はArduino pageです。要点は、ピンを入力として使用すると、アンテナのように動作し、周囲からの信号をキャプチャすることができます。浮動状態と呼ばれます。したがって、ピンを既知の状態に保つ方が良いです。内部プルアップを使用する場合、ピンは常にHIGHになります。したがって、ボタンの構成は、ピンを押したときにピンがLOWになるようにする必要があります。プルアップ付き入力が有効として

Pull Up Configuration

コードpinMode(pushButton, INPUT_PULLUP);デジタルピン2を可能にします。

loop()は次のように動作するはずです:ボタンが押されている場合は

1)チェック(すなわち、それはLOWある場合)。

2)last変数を更新しない場合。

3)そうであれば、lastを更新し、whileループを入力します。

_delayより大きいかどうかを確認してください。そうでない場合は、whileループに戻り、ボタンがまだ押されているかどうかを確認します。はいの場合は、millis()-last_delayより大きいかどうかを確認します。前述の量のデバウンス遅延を経過するまで、これを継続します。ボタンは「_delay」時間前(すなわちHIGHに行く)が押されたら、それはlastを更新すると、ボタンが押されたかどうかと、遅延時間のカウントを開始しますされているかどうかをチェックします

5)。

N.B. _delay変数で再生します。ボタンの応答性を定義します。