2017-11-25 15 views
0

ボタンを押すまでブザー音色のパターンを演奏するPythonコードを書いています。これは、ループをwhile True:ループの次のパターンに切り替えます。私はモジュールのインポートやボタンとブザーの宣言を簡潔にするためには含めていません。また、各ループの終わりに、ブザーがオフ位置にあると仮定することができる。ループを外部で早期に終了することはできますか?

i = 1 # the current pattern 
patterns = 2 # total number of patterns, or last pattern 

def buttonClicked(): # changes i when button is pressed 
    if i > patterns: 
     i = 1 
    else: 
     i = i + 1 

while True: 

    while i == 1: 
     # buzzer on 
     # sleep 
     # buzzer off 

    while i == 2: 
     #buzzer on 
     #sleep 
     #buzzer off 
     #sleep 
     #buzzer on 
     #sleep 
     #buzzer off 

私はこの解決策が最高ではないことを知っていますが、1つのことを除いてほとんどの部分で機能しています。現在の設定では、iは、各内側ループの始めにインクリメントされた場合にのみチェックされるので、パターンが次のものに切り替えるために終了する必要があります(ボタンが押された場合)。これは、いくつかのパターン(簡略化のために示されていない)の1回の反復が10秒間続くことができるので、問題である。

良いものへ: どのようにボタンをすぐにパターンの切り替えをトリガーすることができますか?

ボタンを押した直後にボタンの標準メソッドが実行されるため、ボタンを押した後にループを停止する方法がわかりません。この動作は、JavaScriptのイベントリスナーの動作に似ています。これについてhttps://gpiozero.readthedocs.io/en/stable/api_input.html#gpiozero.Button.when_pressed

答えて

0

方法:ここで

ボタンは読みのために、私は見ていくつかのドキュメントのですか?

step = 0 # where we are in the cycle 
patterns = [ # time to sleep between on/off 
    [0.5, 1.0], 
    [2.0, 3.0, 4.5, 1.0], 
] 

while True: 
    if step % 2 == 0: # even cycle 
     # buzzer on 
    else: # odd cycle 
     # buzzer off 
    pat = patterns[i] 
    sleep(pat[step % len(pat)]) 
    step += 1 

このように、最大​​遅延はパターン全体ではなく、最大のスリープ時間です。コードはよりコンパクトで、データ駆動型です(1パターンにつき1行)。

+0

これは素晴らしい解決策ですが、ブザー自体は複数の出力に接続されているため、そのままでは機能しません。各出力はブザーに一定の電圧を与えるトランジスタに接続されています。様々な抵抗でこの設定を使用することにより、ブザーは様々な音量でノイズを発生させます。コード内では、「パターン」は本質的に、異なる出力ピンを介して変化する音のシーケンスである。申し訳ありませんが、私は元の記事でこれを言及しなかったが、とにかく感謝します。 – ERN

+0

@ERN:タプルを 'patterns'リストに入れて、どのくらい待つか、各ステップでどの出力を使うかを言うことができると思います。 –

関連する問題