2017-03-27 10 views
0

ラズベリーパイのウィンドウカウンタ10のiotコアでパルスカウンタ(コインカウンタ)を開発しています。このように25ミリ秒のインターバル時間を持つパルスをカウントする必要があります:パルス入力を何らかのインターバル時間でカウントするにはどうすればよいですか?

,0,05 - 1パルス 0,10€ - 2パルス 0,20€ - 4パルス 0,50€ - 10パルス 1€ - 20パルス 2€ - 40のパルスこの画像等

pulses

Iインターバル時間がdifのときにパルスの数を印字する(値を挿入する)必要がある25ミリ秒の間に。

私はこのコードを持っている:

public MainPage() 
    { 
     this.InitializeComponent(); 
     InitGPIO(); 
    } 

    private void InitGPIO() 
    { 
     var gpio = GpioController.GetDefault(); 

     if (gpio == null) 
     { 
      GpioStatus.Text = "There is no GPIO controller on this device."; 
     } 

     coinPin = gpio.OpenPin(coin_Pin); 

     if (coinPin.IsDriveModeSupported(GpioPinDriveMode.InputPullUp)) 
     { 
      coinPin.SetDriveMode(GpioPinDriveMode.InputPullUp); 
     } else 
     { 
      coinPin.SetDriveMode(GpioPinDriveMode.Input); 
     } 

     coinPin.DebounceTimeout = TimeSpan.FromMilliseconds(25); 

     coinPin.ValueChanged += coinPin_ValueChanged; 

     GpioStatus.Text = "GPIO pins initialized correctly."; 
    } 

    private void coinPin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) 
    { 
     if (e.Edge == GpioPinEdge.FallingEdge) 
     { 
      counter++; 
     } 

     var task = Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
     { 
      if (e.Edge == GpioPinEdge.FallingEdge) 
      { 
       //counter++; 
       var time = PulseIn(coinPin, e.Edge); 
       value = (counter * 5); 
       value100 = value/100; 
       //money.Text = "Eur: " + (decimal)value100 + " €"; 

       if (time != 25) 
       { 
        money.Text = "Eur: " + (decimal)value100 + " €"; 
        GpioStatus.Text = "" + time; 
       } else 
       { 
        GpioStatus.IsEnabled = false; 
       } 
       //GpioStatus.Text = "" + time + ""; 
      } else 
      { 
       ///GpioStatus.Text = "" + coinPin.DebounceTimeout; 
      } 


     }); 
    } 

    private double PulseIn(GpioPin pin, GpioPinEdge edge) 
    { 
     var sw = new Stopwatch(); 

     while (edge.Equals(GpioPinEdge.RisingEdge)) 
     { 
      //sw.Start(); 
     } 

     sw.Start(); 

     if (!edge.Equals(GpioPinEdge.RisingEdge)) 
     { 
      //sw.Stop(); 
     } 

     sw.Stop(); 

     return sw.Elapsed.TotalMilliseconds; 
    } 


    private const int coin_Pin = 24; 
    private int counter = 0; 
    private double value = 0; 
    private double value100 = 0; 
    private GpioPin coinPin; 

あなたは私助けてくださいことはできますか? ありがとうございます。あなたのコードから

答えて

0

sw.Start(); 

    if (!edge.Equals(GpioPinEdge.RisingEdge)) 
    { 
     //sw.Stop(); 
    } 

    sw.Stop(); 

それは実際にsw.Start()sw.Stop()間のことif文の実行時間を計測します。これは意味をなさない。立ち下がりエッジが到着したらwatch.Elapsed.TotalMillisecondsを記録し、パルス間隔時間を測定するためにストップウォッチを再起動します。これを行うには、counter++の下に次の2つのコード行を追加し、var time = PulseIn(coinPin, e.Edge)を削除し、代わりにGpioStatus.Text = "" + timeintervaltimeintervalを使用します。

  timeinterval = watch.Elapsed.TotalMilliseconds; 
      watch.Restart(); 

次は、完全なコード部分である:

private Stopwatch watch = new Stopwatch(); 
    private void coinPin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) 
    { 
     double timeinterval = 0; 
     if (e.Edge == GpioPinEdge.FallingEdge) 
     { 
      counter++; 
      timeinterval = watch.Elapsed.TotalMilliseconds; 
      watch.Restart(); 
     } 

     var task = Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
     { 
      if (e.Edge == GpioPinEdge.FallingEdge) 
      { 
       //var time = PulseIn(coinPin, e.Edge); 
       value = (counter * 5); 
       value100 = value/100; 

       if (timeinterval != 25) 
       { 
        money.Text = "Eur: " + (decimal)value100 + " €"; 
        GpioStatus.Text = "" + timeinterval; 
       } 
       //... 
      } 
     }); 
    } 

あなたはそれがあなたの精度要件を満たしているかどうかを確認するために、コードピースの上に試すことができます。

注ソフトウェアジッタは常に予測できないため、ソフトウェアレベルでハードウェアパルス間隔を測定することは適切ではありません。

+0

私は2コイン(0,2€と0,05€)の入力例で質問を更新しました。結果は0,20€と0,25€になり、今度は "0,05 0,1 0,15 0,20 0,25 "...私は合計値を表示するだけです。 – rmntavares

+0

どのように0,2ユーロを入力しますか? 4つのパルスはありませんか? –

関連する問題