ボタンを押すまでブザー音色のパターンを演奏する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
これは素晴らしい解決策ですが、ブザー自体は複数の出力に接続されているため、そのままでは機能しません。各出力はブザーに一定の電圧を与えるトランジスタに接続されています。様々な抵抗でこの設定を使用することにより、ブザーは様々な音量でノイズを発生させます。コード内では、「パターン」は本質的に、異なる出力ピンを介して変化する音のシーケンスである。申し訳ありませんが、私は元の記事でこれを言及しなかったが、とにかく感謝します。 – ERN
@ERN:タプルを 'patterns'リストに入れて、どのくらい待つか、各ステップでどの出力を使うかを言うことができると思います。 –