2017-03-11 37 views
0

変数mod 2が0かどうかをチェックして、whileループ内の条件の間を行き来できるように、別の整数に整数を追加するためにRaspberry Piのボタンをプログラムしようとしています。私は本質的に変数が奇数か偶数かをチェックすることによってループをwhileループの条件を反転しようとしています。gpiozero button.when_pressed関数を使用して、整数を入力および出力する関数を使用するにはどうすればよいですか?

私はgpiozeroライブラリのwhen_pressed関数を使用しようとしていますが、整数を加算して出力する関数を呼び出すことはできないようです。

だから、私のコードは次のとおりです。

from gpiozero import Button 
btn = Button(17) #the button is wired to GPIO pin 17 

def addSurf(a): 
    a = a + 1 
    return(a) 

x = 0 
btn.when_pressed = addSurf(x) 

while True: 
    if x == 0: 
     #do some stuff 
    else: 
     #do some other stuff 

私はこれを実行しようとするのはなぜ、私はTypeError: unsupported operand type(s) for +: 'Button' and 'int'を取得します。

btn.when_pressed関数を使用して整数を入力および出力する関数を使用するにはどうすればよいですか?

また、whileループの2つの状態をボタンが切り替えるようにするには、いくつかの[better?]メソッドがありますか?

答えて

0

button.when_pressed関数は引数を取ることができないことに気付きました。

whileループに2つの異なる状態間のボタンのトグルを持つことの私の当初の目標を達成するために、私はボタンが whileループで独自のスレッドでグローバル変数として整数の符号を切り替えた、となってしまいましたグローバル変数のその符号は、元の whileループの別のスレッドの条件を切り替えます。これは実際にそれを行う適切な方法ではありませんが、私はそれを働かせました。

1

gpiozeroボタンの 'when_pressed'プロパティにパラメータを渡すことは可能ですが、あまりよく書かれていません。私は例を見つけることができませんでした。 (キューはgpiozeroクリエイターに助けを求めます)

私が行ったことは、関数にアクセスさせたい変数を含む 'when_pressed'にラムダ関数を渡すことです。

はここにあなたのプログラムの私のバージョンです:

from gpiozero import Button 
from signal import pause 

btn = Button(17) #the button is wired to GPIO pin 17 

class X(): 
    value = 0 


def addSurf(x): 
    x.value += 1 
    print('Adding 1') 

def do_something_when_button_is_released(x): 
    print('x = ',x.value) 


x = X() 
btn.when_pressed = lambda : addSurf(x) 
btn.when_released = lambda : do_something_when_button_is_released(x) 
pause() 

私はあなたの元「X」変数のコンテナとしてクラスを使用していました。これはおそらく過剰ですが、私は整数としてxを使って同じことをしようとしましたが、うまくいかなかったのです!理由を本当に理解していない。とにかくクラスでは、複数の変数を追加することができます。

もう1つのポイントは、すべてのCPU時間を浪費するため、このメソッドで 'while True'ループが機能しないことです。私が 'do_something_when_button_is_released'と呼んでいる関数を使って、他のものをやるようにするのが良いでしょう。

関連する問題