2017-01-10 16 views
0

私のボタンには以下の2つを実行したいと思います。ラズベリーパイのホールド/プッシュボタンGPIO

  • ボタンが
  • 押されるたびに何かをするボタンが一定時間保持されるたびに何かをする(2秒)

私が働いている現在のコードが少し見えます

//Comfirming a letter or sending the word. 
    private void btnRightValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) 
    { 
     //if button is pressed it will confirm a letter 
     if (e.Edge == GpioPinEdge.FallingEdge) 
     { 
      //code to confirm letter 
      ConfirmLetter(); 

      //if(buttonHeldForAWhile) 
      //{ 
      //Send message 
      //SendWord(); 
      //} 
     } 
    } 

ボタンが2秒間または3秒間保持されているかどうかを確認するにはどうすればよいですか?

+0

'GpioPinValue.Low'が真であるかどうかを確認して、システムクロックと比較して確認できませんか? –

+0

ところで、興味のある人のためにgpio名前空間のMSリファレンスがあります:https://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.gpio.aspx –

+0

*「私私のボタンがするのが好きです... "* - あなたの仕様は不正確です。ほとんどのイベント報告スキームでは、レベル検出ではなくエッジ検出が使用されるため、スイッチの閉鎖(ボタンの押下など)とスイッチのオープン(ボタンの解放など)の両方が報告されます。最初の「何か」*アクションは、ボタンが押されるとすぐに(リリースを待たずに)実行されますか?ボタンを押したときに「何か」のアクションが実行され、***が2秒間保持されるべきである。ボタンを3秒以上押し続けるとどうなるでしょうか?アクションを繰り返しますか? – sawdust

答えて

0

ボタンが押されている時間を測定するストップウォッチを使用して問題を解決する方法を見つけました。

上記の名前空間の上に、Stopwatchクラスを使用するためにこれを追加する必要があります。ボタンを押すと、私のコードはFallingEdgeでそれをピックアップします保持されている

Stopwatch stopWatch; 

using System.Diagnostics; 

は、今、私たちはでストップウォッチを宣言したいです。それが押されたら、私は新しいストップウォッチを作成してそれを開始したい。

ボタンが離されたときは、RisingEdgeによってチェックされます。私はタイマーを停止し、2つのイベントの間の時間を取得します。 if文で押された時間を比較して、buttonpressで何をするかを決めることができます。この場合、SendWord、または現在のcharを追加してプレビューします。

//Comfirming the chosen letter. 
    private void btnRightValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) 
    { 
     if (e.Edge == GpioPinEdge.FallingEdge) 
     { 
      stopWatch = new Stopwatch(); 
      stopWatch.Start(); 
     } 

     if (e.Edge == GpioPinEdge.RisingEdge) 
     { 
      stopWatch.Stop(); 
      long duration = stopWatch.ElapsedMilliseconds; 

      if (duration > 2000) 
      { 
       SendWord(); 
      } 
      else 
      { 
       //Add the current character to the word 
       _currentWordSB.Append(Convert.ToString(_currentChar)); 

      // //Reset currentChar aswell 
       _currentChar = ' '; 

      // //The user confirmed the morse sequence and wants to start a new one, so we reset it. 
       _morseCode.Clear(); 

      // //Preview the word 
       PreviewLetter(); 
      } 
     } 
    } 

私の問題に取り組むための任意のより良い方法があれば、私に知らせてこれまでのところ、このソリューションは、私のために動作してください。

ボタンを使用してモールスコードを入力したRaspberry Piプロジェクトで作業していたときには、これが必要でした。その入力はLCDスクリーン上に表示されなければならなかった。ユーザーが入力に満足していれば、右ボタンを2秒間押して他のユーザーに送信することができます。