편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2021.01.06

    button_1_callback, ... , buttono_8_callback 로 정의된 동일한 패턴의 함수를 더 간단하게 하는 방법


    밑의 코딩에서 list함수를 이용하여 코딩을 더줄일수 있는 방법이 없을까요? 없거나 비효율 적이면 다른함수를 사용하는 방법을 알려주실수있나요?

    import RPi.GPIO as GPIO #GPIO 라이브러리 불러오기
    import time #시간 라이브러리 불러오기
    import datetime
    
    #I/O 리스트로 지정
    IO_do = [22,6,13,19,26,11,27,4]
    IO_di = [17,12,16,21,20,18,23,24]
    Num = [1,2,3,4,5,6,7,8]
    #불필요한 WARNING 제거
    GPIO.setwarnings(False)
    
    #GPIO 핀의 번호모드 설정
    GPIO.setmode(GPIO.BCM)
    
    #버튼 리스트 변수를 INPUT설정,PULLDOWN 저항 설정
    for i in IO_di:
        GPIO.setup([i], GPIO.IN, pull_up_down=GPIO.PUD_DOWN) 
    #LED 리스트 변수를 OUTPUT설정
    for j in IO_do:
        GPIO.setup([j], GPIO.OUT)
    
    #boolean 변수설정
    light_1_on = False
    light_2_on = False
    light_3_on = False
    light_4_on = False
    light_5_on = False
    light_6_on = False
    light_7_on = False
    light_8_on = False
    
    #프로그램 시작을 알림
    print("start")
    
    #버튼 콜백 함수를 정의함 글로벌 함수 적용
    def button_1_callback(ch):
        global light_1_on
        if light_1_on == False:
            GPIO.output(IO_do[0],1)
            print("LED1 ON")
        else:
            GPIO.output(IO_do[0],0)
            print("LED1 OFF")
        light_1_on = not light_1_on
    
    def button_2_callback(ch):
        global light_2_on
        if light_2_on == False:
            GPIO.output(IO_do[1],1)
            print("LED2 ON")
        else:
            GPIO.output(IO_do[1],0)
            print("LED2 OFF")
        light_2_on = not light_2_on
    
    def button_3_callback(ch):
        global light_3_on
        if light_3_on == False:
            GPIO.output(IO_do[2],1)
            print("LED3 ON")
        else:
            GPIO.output(IO_do[2],0)
            print("LED3 OFF")
        light_3_on = not light_3_on
    
    def button_4_callback(ch):
        print(ch)
        global light_4_on
        if light_4_on == False:
            GPIO.output(IO_do[3],1)
            print("LED4 ON")
        else:
            GPIO.output(IO_do[3],0)
            print("LED4 OFF")
        light_4_on = not light_4_on
    
    def button_5_callback(ch):
        print(ch)
        global light_5_on
        if light_5_on == False:
            GPIO.output(IO_do[4],1)
            print("LED5 ON")
        else:
            GPIO.output(IO_do[4],0)
            print("LED5 OFF")
        light_5_on = not light_5_on
    
    def button_6_callback(ch):
        print(ch)
        global light_6_on
        if light_6_on == False:
            GPIO.output(IO_do[5],1)
            print("LED6 ON")
        else:
            GPIO.output(IO_do[5],0)
            print("LED6 OFF")
        light_6_on = not light_6_on
    
    def button_7_callback(ch):
        print(ch)
        global light_7_on
        if light_7_on == False:
            GPIO.output(IO_do[6],1)
            print("LED7 ON")
        else:
            GPIO.output(IO_do[6],0)
            print("LED7 OFF")
        light_7_on = not light_7_on
    
    def button_8_callback(ch):
        print(ch)
        global light_8_on
        if light_8_on == False:
            GPIO.output(IO_do[7],1)
            print("LED8 ON")
        else:
            GPIO.output(IO_do[7],0)
            print("LED8 OFF")
        light_8_on = not light_8_on    
    # 이벤트 알림 방식 버튼핀의 Rising신호를 감지하면 콜백함수를 실행
     # 바운스타임을 설정하여 잘못된 신호를 방지합니다.
    GPIO.add_event_detect(IO_di[0],GPIO.RISING,callback=button_1_callback, bouncetime=300)
    GPIO.add_event_detect(IO_di[1],GPIO.RISING,callback=button_2_callback, bouncetime=300)
    GPIO.add_event_detect(IO_di[2],GPIO.RISING,callback=button_3_callback, bouncetime=300)
    GPIO.add_event_detect(IO_di[3],GPIO.RISING,callback=button_4_callback, bouncetime=300)
    GPIO.add_event_detect(IO_di[4],GPIO.RISING,callback=button_5_callback, bouncetime=300)
    GPIO.add_event_detect(IO_di[5],GPIO.RISING,callback=button_6_callback, bouncetime=300)
    GPIO.add_event_detect(IO_di[6],GPIO.RISING,callback=button_7_callback, bouncetime=300)
    GPIO.add_event_detect(IO_di[7],GPIO.RISING,callback=button_8_callback, bouncetime=300)
    
    while 1:
        time.sleep(0.1)
    
  • 프로필 알 수 없는 사용자님의 편집
    날짜2021.01.05

    list 함수 질문있습니다!


    밑의 코딩에서 list함수를 이용하여 코딩을 더줄일수 있는 방법이 없을까요? 없거나 비효율 적이면 다른함수를 사용하는 방법을 알려주실수있나요?

    import RPi.GPIO as GPIO #GPIO 라이브러리 불러오기 import time #시간 라이브러리 불러오기 import datetime

    I/O 리스트로 지정

    IO_do = [22,6,13,19,26,11,27,4] IO_di = [17,12,16,21,20,18,23,24] Num = [1,2,3,4,5,6,7,8]

    불필요한 WARNING 제거

    GPIO.setwarnings(False)

    GPIO 핀의 번호모드 설정

    GPIO.setmode(GPIO.BCM)

    버튼 리스트 변수를 INPUT설정,PULLDOWN 저항 설정

    for i in IO_di: GPIO.setup([i], GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

    LED 리스트 변수를 OUTPUT설정

    for j in IO_do: GPIO.setup([j], GPIO.OUT)

    boolean 변수설정

    light_1_on = False light_2_on = False light_3_on = False light_4_on = False light_5_on = False light_6_on = False light_7_on = False light_8_on = False

    프로그램 시작을 알림

    print("start")

    버튼 콜백 함수를 정의함 글로벌 함수 적용

    def button_1_callback(ch): global light_1_on if light_1_on == False: GPIO.output(IO_do[0],1) print("LED1 ON") else: GPIO.output(IO_do[0],0) print("LED1 OFF") light_1_on = not light_1_on

    def button_2_callback(ch): global light_2_on if light_2_on == False: GPIO.output(IO_do[1],1) print("LED2 ON") else: GPIO.output(IO_do[1],0) print("LED2 OFF") light_2_on = not light_2_on

    def button_3_callback(ch): global light_3_on if light_3_on == False: GPIO.output(IO_do[2],1) print("LED3 ON") else: GPIO.output(IO_do[2],0) print("LED3 OFF") light_3_on = not light_3_on

    def button_4_callback(ch): print(ch) global light_4_on if light_4_on == False: GPIO.output(IO_do[3],1) print("LED4 ON") else: GPIO.output(IO_do[3],0) print("LED4 OFF") light_4_on = not light_4_on

    def button_5_callback(ch): print(ch) global light_5_on if light_5_on == False: GPIO.output(IO_do[4],1) print("LED5 ON") else: GPIO.output(IO_do[4],0) print("LED5 OFF") light_5_on = not light_5_on

    def button_6_callback(ch): print(ch) global light_6_on if light_6_on == False: GPIO.output(IO_do[5],1) print("LED6 ON") else: GPIO.output(IO_do[5],0) print("LED6 OFF") light_6_on = not light_6_on

    def button_7_callback(ch): print(ch) global light_7_on if light_7_on == False: GPIO.output(IO_do[6],1) print("LED7 ON") else: GPIO.output(IO_do[6],0) print("LED7 OFF") light_7_on = not light_7_on

    def button_8_callback(ch): print(ch) global light_8_on if light_8_on == False: GPIO.output(IO_do[7],1) print("LED8 ON") else: GPIO.output(IO_do[7],0) print("LED8 OFF") light_8_on = not light_8_on

    이벤트 알림 방식 버튼핀의 Rising신호를 감지하면 콜백함수를 실행

    # 바운스타임을 설정하여 잘못된 신호를 방지합니다. GPIO.add_event_detect(IO_di[0],GPIO.RISING,callback=button_1_callback, bouncetime=300) GPIO.add_event_detect(IO_di[1],GPIO.RISING,callback=button_2_callback, bouncetime=300) GPIO.add_event_detect(IO_di[2],GPIO.RISING,callback=button_3_callback, bouncetime=300) GPIO.add_event_detect(IO_di[3],GPIO.RISING,callback=button_4_callback, bouncetime=300) GPIO.add_event_detect(IO_di[4],GPIO.RISING,callback=button_5_callback, bouncetime=300) GPIO.add_event_detect(IO_di[5],GPIO.RISING,callback=button_6_callback, bouncetime=300) GPIO.add_event_detect(IO_di[6],GPIO.RISING,callback=button_7_callback, bouncetime=300) GPIO.add_event_detect(IO_di[7],GPIO.RISING,callback=button_8_callback, bouncetime=300)

    while 1: time.sleep(0.1)