라즈베리

다시 쓰는 라즈베리 파이선3 tkinter 버튼에 의한 LED ON OFF

coding art 2019. 7. 5. 21:17
728x90

 

아래 그림은 20178월 중순에 작성했던 블로그로서 라즈베리 파이에서 버튼을 생성할 수 있는 Tkinter 라이브러리를 사용하였다.

 

2년이 지난 지금 실행시켜보니 그다지 마음에 들지 않는 에러 메시지가 발생했다.

 

2년 전에 별 문제가 없었지만 워낙 시간이 경과했으며 아울러 OS Jessie에서 Stretch 로 업그레이드 한게 1년이 되어 가며 현재의 OS는 파이선2 sms djelfh 날라갔는지 보이지도 않으며 파이선3만 들어 있는 시스템이다.

터미널에서 sudo apt-get udate sudo apt-get upgrade를 실행하자. 오랫동안 내버려둬서 그런지 거의 30분가량 시간을 소모했다. 그런 조치 후 실행해도 동일한 에러 메시지가 발생하여 세 가지 조치를 취하였다.

하나는 파이선 코드 헤더 영역에서 파이선 2.7 버전용인 대문자 Tk를 파이선3 버전용인 소문자 tk 로 바꾸었다. 물론 RPI.GPIO tkinter는 코드 시작 전에 라즈베리 파이 보드에 설치되어 있어야 한다. tkinter의 경우는 다음과 같다.

sudo apt-get install python3-tk

 

두번째는 파이선 코드 본문을 새롭게 renovation 했다. 완전히 새로 작성하는 것은 아니고 tk 가 크라스 명령으로 쓰이므로 과거 win 으로 쓰던 부분을 찾아 죄다 수정하였다. 아울러 일부 .pack() 으로 수정한 곳도 있다.

 

아래에서 박스 친 부분이 수정된 곳이다.

 

라즈베리 파이 보드와 T 바를 사용하여 빵판에서 LED 양극을 16번 핀에 연결하였다. LED에 흐르는 전류의 최대 값을 제한 할 수 있도록 220옴 저항을 LED 과 음극과 연결하고 저항의 다른 쪽은 GND 0V 에 배선 한다.

 

세 번째로 터미널 창에서 실행 코드가 위치한 디렉토리에서 command line 방식으로 명령을 실행시켰다.

sudo python3 tkinter_root_led_on_off.py

버튼 창이 뜨면 LED on을 누르면 LED OFF 버튼으로 바뀜과 동시에 16번 핀에 설치된 LED ON 됨을 확인할 수 있다. 마지막으로 Exit 버튼을 누르면 실행이 끝난다.

 

유튜브 동영상에서 LED on 버튼 사용을 참조하자.

https://youtu.be/tXrZYdpiwlo

  

#tkinter_toot_led_on_off.py

import RPi.GPIO as GPIO

import tkinter as tk

from tkinter import font

 

GPIO.setmode(GPIO.BCM)

GPIO.setup(16, GPIO.OUT)

GPIO.output(16, GPIO.LOW)

 

root = tk.Tk()

 

frame = tk.Frame(root)

frame.pack()

 

myFont = font.Font(family = 'Helvetica', size = 36, weight = 'bold')

 

def ledON():

    print("LED button pressed")

    if GPIO.input(16):

        GPIO.output(16, GPIO.LOW)

        ledButton["text"] = "LED on"

 

    else:

        GPIO.output(16, GPIO.HIGH)

        ledButton["text"] = "LED OFF"

 

def exitProgram():

    print("Exit button pressed")

    GPIO.cleanup()

    root.quit()

 

root.title("First GUI")

 

root.geometry("600x300")

 

exitButton = tk.Button(root,text="Exit",font=myFont,command=exitProgram,height=2,width=6)

exitButton.pack()

 

ledButton = tk.Button(root,text="LED on", font = myFont,command = ledON,height=2,width=8)

ledButton.pack()

 

root.mainloop()