プッシュボタンでイベントが多すぎる


12

LCDディスプレイに情報を書き込むmp3プレーヤーを書いています。キーボードの使用からプッシュボタンの使用に変換したいのですが、キーを何度も押し続けています。プルアップと立ち下がり/立ち上がりエッジを試しましたが、まだ同じ結果が得られます。これが既知の問題であるか、私が何か間違ったことをしているのか、誰もが知っていますか?ああ、wiringPiを使用してこれを完全にCで行っています。


1
ソフトウェアソリューションのポットに追加するだけで、マイクロコントローラーの友人をチェックしてください。arduino.cc/en/Tutorial/Debounce
Cammy_the_block

これは私がしばらく前に書いたものの抜粋です。if(digitalRead(data) && millis()-startTime > 10){forループに入るたびにstartTimeを設定します。
Cammy_the_block 14年

ただ疑問に思う; startTimeを正確に何に設定しますか?
linuxgnuru 14年

ちょっとした時間カウンター。Arduinoには、開始から時間を与える関数millisがあります。
Cammy_the_block 14年

回答:


12

機械的なボタンとスイッチは、数ミリ秒の間、開閉の間で急速に切り替わるスイッチのバウンスの影響を受ける可能性があります。

ソフトウェアまたはハードウェアでボタン/スイッチのデバウンスを試すことができます。

おそらくソフトウェアで最も簡単です。

レベルが変化した場合(オンからオフ、またはオフからオン)、xミリ秒待機してから、gpioを再度読み取ります。まだ新しい状態にある場合は、それが実際の遷移であると想定します。xの値は20のようなものです。

ハードウェアソリューションについては、この種の投稿を探してください。


8

ジャックガンスルのデバウンスガイドを読んでください。。最初のページでは問題を詳細に説明し、2番目のページではハードウェアまたはソフトウェアで問題を処理する方法を説明しています。「完璧な」デバウンス方法はありませんが、多くの悪い方法があります!

これは、ソフトウェアとスイッチをインターフェイスさせる場合に繰り返し遭遇する問題です。そのため、時間をかけて理解する価値があります。ジャックの記事は、私が見た中で最も簡潔な方法です。


2

システムティッカーがあるアプリケーションでは、通常、シフトレジスタを実装します。

unsigned char button_checker;

// inside the system ticker

button_checker <<= 1; 
button_checker += INPUT;

if (button_checker == 0xFF) 
{ 
    // button was pressed 
}

もちろん、ボタンを押すイベントは立ち上がりエッジでのみ実行する必要があります。


1
それは面白い方法です。(button_checkerの最上位ビットをマスクすることにより)簡単にカスタマイズして、さまざまな数の連続読み取りを要求します。
ジョーン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.