2017-03-11 6 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 루프의 두 상태를 단추가 전환하도록하는 다른 [better?] 메서드가 있습니까?

답변

0

button.when_pressed 함수는 인수를 사용할 수 없다는 것을 깨달았습니다.

while 루프에서 서로 다른 두 상태 사이의 버튼 토글을 갖는 내 원래의 목표를 달성하기 위해, 나는 버튼이 while 루프에서 자신의 스레드에서 전역 변수로 정수의 부호를 전환 필요하고, 가진 결국 전역 변수의 부호는 원래 while 루프의 다른 스레드에서 조건을 전환합니다. 이것은 실제로는 적절한 방법은 아니지만 작동 시키려고합니다.

1

gpiozero 버튼 'when_pressed'속성에 매개 변수를 전달할 수는 있지만 잘 설명되어 있지 않습니다. 어떤 예도 찾을 수 없었습니다. (큐는 gpiozero 제작자에게 도움을 요청합니다!)

내가 한 것은 함수에 액세스 할 변수가 들어있는 'when_pressed'에 람다 함수를 전달하는 것입니다. 나는 원래 '의 X'변수의 컨테이너 클래스를 사용했다

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를 사용하여 똑같은 작업을 시도했지만 작동하지 않았습니다! 이유를 정말로 이해하지 마라. 어쨌든 클래스를 사용하면 둘 이상의 변수를 추가 할 수 있습니다.

다른 점은 'while True'루프는 모든 CPU 시간을 소모하므로이 방법으로는 작동하지 않는다는 것입니다. 'do_something_when_button_is_released'라고하는 함수를 사용하면 다른 작업을 수행하는 것이 더 좋습니다.