2016-06-30 5 views
0

나는 버튼을 누르면 빨간 LED 만 밝아지고 다른 버튼을 누르면 녹색 LED 만 밝아지는 Python 프로그램을 Raspberry Pi와 함께 만들려고합니다. 버튼을 누르지 않으면 모든 LED가 꺼집니다. 하지만 그것을 실행하려고하면 두 개의 LED가 켜져 있고 단추를 누르면 모니터가 눌렀다 고 말합니다.하지만 아무 것도 바뀌지 않습니다. 이 문제를 해결하려면 어떻게해야합니까? 나는 배선 문제가 없으며 모니터에 오류가 없음을 100 % 확신합니다.Raspberry PI : 2 개의 버튼, 2 개의 LED

 import RPi.GPIO as GPIO 
     import time 

     GPIO.setwarnings(False) 
     red_walk_LED = 16 
     green_traf_LED = 15 
     Btn_one = 22 # pin12 --- button 
     Btn_two = 29 # pin29 --- 2nd button 
     # GLOBAL VARIABLES 
     red_Led_status = 1 
     Green_Led_status = 1 
     flag_btn_one_pushed = 0 
     flag_btn_two_pushed = 0 

     def all_leds_off(): 
      GPIO.output(green_traf_LED, GPIO.HIGH) 
      GPIO.output(yellow_traf_LED, GPIO.HIGH) 
      GPIO.output(red_traf_LED, GPIO.HIGH) 
      GPIO.output(red_walk_LED, GPIO.HIGH) 
      GPIO.output(white_walk_LED, GPIO.HIGH) 
    def setup(): 
     global green_LED_frequence 
     global red_LED_frequence 
     GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical location 
     #set LEDs as outputs 
     GPIO.setup(green_traf_LED, GPIO.OUT) 
     GPIO.setup(red_traf_LED, GPIO.OUT) 
     GPIO.setup(Btn_one, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Set BtnPin's mode as input, and pull up to high level(3.3V) 
     GPIO.setup(Btn_two, GPIO.IN, pull_up_down=GPIO.PUD_UP) 
     red_LED_frequence = GPIO.PWM(red_traf_LED, 1000) # set Frequece to 1KHz 
     green_LED_frequence = GPIO.PWM(green_traf_LED, 1000) 
     red_LED_frequence.start(0) # Duty Cycle = 0 
     green_LED_frequence.start(0) 

def Btn_one_push(ev=None): 
    print('OK, the 1st button was pushed') 
    global red_Led_status #we are allowed to change these variables in this function 
    global my_counter 
    global flag_btn_one_pushed 
    global red_LED_frequence 

    red_Led_status  = not red_Led_status #change LED status 0-1 or 1-0 
    flag_btn_one_pushed = 1 

    my_delay = 0.2 
    GPIO.output(green_traf_LED, GPIO.HIGH) 
    if red_Led_status == 1: #1-on 
     print('ok, reds on') 
     for dc in range(0, 101, 4): # Increase duty cycle: 0~100 
      red_LED_frequence.ChangeDutyCycle(dc) # Change duty cycle 
      time.sleep(0.02) 
     for dc in range(100, -1, -4): # Decrease duty cycle: 100~0 
      red_LED_frequence.ChangeDutyCycle(dc) 
      time.sleep(0.02) 


    all_leds_off() #turn all LEDs off!! 
    flag_btn_pushed = 0 

def Btn_two_push(ev=None): 
    print('OK, the 2nd button was pushed') 
    global Green_Led_status 
    global flag_btn_two_pushed 
    global green_LED_frequence 

    Green_Led_status  = not Green_Led_status #change LED status 0-1 or 1-0 
    flag_btn_two_pushed = 1 

    my_delay = 0.2 
    GPIO.output(red_traf_LED, GPIO.HIGH) 
    if Green_Led_status == 1: #1-on 
     print('This is supposed to work!') 
     for dc in range(0, 101, 4): # Increase duty cycle: 0~100 
      print(green_LED_frequence) 
      green_LED_frequence.ChangeDutyCycle(dc) # Change duty cycle 
      time.sleep(0.08) 
     for dc in range(100, -1, -4): # Decrease duty cycle: 100~0 
      green_LED_frequence.ChangeDutyCycle(dc) 
      time.sleep(0.08)  
    all_leds_off() #turn all LEDs off!! 
    flag_btn_two_pushed = 0 





def loop(): 
    global flag_btn_one_pushed 
    global flag_btn_two_pushed 
    GPIO.add_event_detect(Btn_one, GPIO.FALLING, callback=Btn_one_push) # wait for change in GPIO 0-1 or 1-0 
    GPIO.add_event_detect(Btn_two, GPIO.FALLING, callback=Btn_two_push) 
    while True: #when the button isn't pushed, do this 
     all_leds_off() 
    else: 
     pass 

def destroy(): 
    all_leds_off() 
    GPIO.cleanup() # Release resource 

if __name__ == '__main__': # Program start from here 
    setup() 
    try: 
     loop() 
    except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program destroy() will be executed. 
     destroy() 

답변

0

당신은이 라인을 제거하려고한다 : BTW, 여기에 코드입니다

while True: #when the button isn't pushed, do this 
    all_leds_off() 
else: 
    pass 

와로 대체 :

all_leds_off() 

콜백이 버튼을 누를 때마다 해고해야한다. 개별적으로 ON과 OFF LED의 전원을 켜고 그가 아닌 것을 입증하기 위해 버튼 누름을 감지하는 코드의 간단한 미리보기를 시도했다가, 또한

https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=102631&p=760629

: 여기

은 보는 또 다른 예이다 배선 문제? 배선에 문제가 생기는 것은 아닙니다.

+0

흠집, 엉망진창을 분류하는 데 필요한 모든 것이 확실하지 않습니다. 루프 할 필요가 있지만 loop() 함수는 콜백 설정도 수행합니다. – barny

관련 문제