"""
LCD 화면에 문자나 이미지를 출력합니다.
Class:
:obj:`~openpibo.oled.Oled`
:obj:`~openpibo.oled.OledbyST7735`
:obj:`~openpibo.oled.OledbyILI9341`
"""
from .modules.oled import ili9341, st7735, ssd1306, board, busio, digitalio
from PIL import Image, ImageDraw, ImageFont, ImageOps
import cv2,os
import numpy as np
import openpibo_models
[문서]class Oled:
"""
Functions:
:meth:`~openpibo.oled.Oled.show`
:meth:`~openpibo.oled.Oled.clear`
:meth:`~openpibo.oled.Oled.set_font`
:meth:`~openpibo.oled.Oled.draw_text`
:meth:`~openpibo.oled.Oled.draw_image`
:meth:`~openpibo.oled.Oled.draw_data`
:meth:`~openpibo.oled.Oled.draw_rectangle`
:meth:`~openpibo.oled.Oled.draw_ellipse`
:meth:`~openpibo.oled.Oled.draw_line`
:meth:`~openpibo.oled.Oled.invert`
파이보의 OLED를 통해 다양한 그림을 표현합니다.
* 사진 보기
* 문자 그리기
* 도형 그리기
그림을 그리면 인스턴스 변수 ``image`` 에 저장됩니다. 이를 ``show`` 메소드를 사용하여 oled 화면에 출력할 수 있습니다.
본 class에서 문자 또는 그림을 그리는 행위는 인스턴스 변수 ``image`` 의 데이터를 변경시키는 것으로 정의합니다.
example::
from openpibo.oled import Oled
oled = Oled()
# 아래의 모든 예제 이전에 위 코드를 먼저 사용합니다.
"""
def __init__(self, w=128, h=64):
"""
Oled 클래스를 초기화
"""
self.width = w
self.height = h
self.font_path = openpibo_models.filepath("KDL.ttf") # KoPub Dotum Light
self.font_size = 10
spi = busio.SPI(11, 10, 9)
rst_pin = digitalio.DigitalInOut(board.D24) # any pin!
cs_pin = digitalio.DigitalInOut(board.D8) # any pin!
dc_pin = digitalio.DigitalInOut(board.D23) # any pin!
self.oled = ssd1306.SSD1306_SPI(self.width, self.height, spi, dc_pin, rst_pin, cs_pin)
self.font = ImageFont.truetype(self.font_path, self.font_size)
self.image = Image.new("1", (self.width, self.height))
self.oled.fill(0)
self.oled.show()
[문서] def show(self):
"""
인스턴스 변수 ``image`` 를 oled 화면에 표시합니다.
**이 메소드를 사용하지 않으면 그림을 그려도 oled 화면에 아무것도 출력되지 않습니다.**
example::
# 그림을 그린 후
oled.show()
"""
self.oled.image(self.image)
self.oled.show()
[문서] def clear(self, image=True, fill=True, show=True):
"""
인스턴스 변수 ``image`` 를 초기화 하고, oled 화면을 지웁니다.
example::
oled.clear()
:param bool image: image 초기화 여부
:param bool fill: oled 초기화 여부
:param bool show: 화면 표시 여부
"""
if image == True:
self.image = Image.new("1", (self.width, self.height))
if fill == True:
self.oled.fill(0)
if show == True:
self.oled.show()
[문서] def set_font(self, filename=None, size=None):
"""
``draw_text`` 메소드에 사용할 폰트를 설정합니다.
example::
# 불러올 폰트의 경로가 /home/pi/mydata/font.ttf 라면,
oled.set_font('/home/pi/mydata/font.ttf', 10)
:param str filename: 폰트 파일 경로
폰트 확장자는 **ttf** 와 **otf** 모두 지원합니다.
:param int size: 폰트 사이즈
단위는 픽셀 입니다. (default 10)
"""
if filename == None:
filename = self.font_path
if size == None:
size = self.font_size
if not os.path.isfile(filename):
raise Exception(f'"{filename}" does not exist')
self.font = ImageFont.truetype(filename, size)
[문서] def draw_text(self, points, text:str):
"""
문자를 그립니다.(한글, 영어 지원)
example::
oled.draw_text((10, 10), '안녕하세요!')
:param tuple(int, int) points: 문자열 좌측상단 좌표 (x, y)
:param str text: 문자열 내용
"""
if type(points) is not tuple:
raise Exception(f'"{points}" must be tuple type')
if len(points) != 2:
raise Exception(f'len({points}) must be 2')
ImageDraw.Draw(self.image).text(points, text, font=self.font, fill=255)
[문서] def draw_image(self, filename):
"""
그림을 그립니다.
**128x64** 크기의 **png** 확장자만 허용됩니다.
example::
oled.draw_image('/home/pi/openpibo-files/image/clear.png')
:param str filename: 그림파일 경로
"""
if not os.path.isfile(filename):
raise Exception(f'"{filename}" does not exist')
self.image = Image.open(filename).resize((self.width, self.height)).convert('1')
[문서] def draw_data(self, img):
"""
numpy 이미지 데이터를 입력받아 이미지로 변환합니다.
카메라 출력값이 numpy 형식이므로, 이를 oled화면에 띄우기 위해 사용됩니다.
example::
from openpibo.vision import Camera
camera = Camera()
img = camera.read()
oled.draw_data(img)
oled.show()
:param numpy.ndarray img: 이미지 객체
"""
if type(img) is not np.ndarray:
raise Exception('"img" must be image data from opencv.')
self.image = Image.fromarray(img).resize((self.width, self.height)).convert('1')
[문서] def draw_rectangle(self, points, fill=None):
"""
직사각형을 그립니다.
example::
oled.draw_rectangle((10, 10, 80, 40), True)
:param tuple points: 사각형의 좌측상단 좌표, 사각형의 우측하단 좌표 (x1, y1, x2, y2)
:param bool fill:
* ``True`` : 사각형 내부를 채웁니다.
* ``False`` : 사각형 내부를 채우지 않습니다.
"""
if type(points) is not tuple:
raise Exception(f'"{points}" must be tuple type')
if len(points) != 4:
raise Exception(f'len({points}) must be 4')
if not fill in [None, True, False]:
raise Exception(f'"{fill}" must be (None|True|False)')
ImageDraw.Draw(self.image).rectangle(points, outline=1, fill=fill)
[문서] def draw_ellipse(self, points, fill=None):
"""
타원을 그립니다.
example::
oled.draw_ellipse((10, 10, 80, 40), False)
:param tuple points: 타원에 외접하는 직사각형의 좌측상단 좌표, 우측하단 좌표 (x1, y1, x2, y2)
:param bool fill:
* ``True`` : 타원 내부를 채웁니다.
* ``False`` : 타원 내부를 채우지 않습니다.
"""
if type(points) is not tuple:
raise Exception(f'"{points}" must be tuple type')
if len(points) != 4:
raise Exception(f'len({points}) must be 4')
if not fill in [None, True, False]:
raise Exception(f'"{fill}" must be (None|True|False)')
ImageDraw.Draw(self.image).ellipse(points, outline=1, fill=fill)
[문서] def draw_line(self, points):
"""
직선을 그립니다.
example::
oled.draw_line((30, 20, 60, 50))
:param tuple points: 선의 시작 좌표, 선의 끝 좌표 (x1, y1, x2, y2)
"""
if type(points) is not tuple:
raise Exception(f'"{points}" must be tuple type')
if len(points) != 4:
raise Exception(f'len({points}) must be 4')
ImageDraw.Draw(self.image).line(points, fill=True)
[문서] def invert(self):
"""
그려진 이미지를 흑백 반전시킵니다.
example::
oled.invert()
"""
self.image = ImageOps.invert(self.image.convert("L")).convert("1")
[문서]class OledbyST7735:
"""
Functions:
:meth:`~openpibo.oled.OledbyST7735.show`
:meth:`~openpibo.oled.OledbyST7735.clear`
:meth:`~openpibo.oled.OledbyST7735.set_font`
:meth:`~openpibo.oled.OledbyST7735.draw_text`
:meth:`~openpibo.oled.OledbyST7735.draw_image`
:meth:`~openpibo.oled.OledbyST7735.draw_data`
:meth:`~openpibo.oled.OledbyST7735.draw_rectangle`
:meth:`~openpibo.oled.OledbyST7735.draw_ellipse`
:meth:`~openpibo.oled.OledbyST7735.draw_line`
파이보의 OLED를 통해 다양한 그림을 표현합니다.
* 사진 보기
* 문자 그리기
* 도형 그리기
그림을 그리면 인스턴스 변수 ``image`` 에 저장됩니다. 이를 ``show`` 메소드를 사용하여 oled 화면에 출력할 수 있습니다.
본 class에서 문자 또는 그림을 그리는 행위는 인스턴스 변수 ``image`` 의 데이터를 변경시키는 것으로 정의합니다.
example::
from openpibo.oled import OledbyST7735 as Oled
oled = Oled()
# 아래의 모든 예제 이전에 위 코드를 먼저 사용합니다.
"""
def __init__(self, w=128, h=64):
"""
Oled 클래스를 초기화
"""
self.width = w
self.height = h
self.font_path = openpibo_models.filepath("KDL.ttf") # KoPub Dotum Light
self.font_size = 10
cs_pin = digitalio.DigitalInOut(board.D8)
dc_pin = digitalio.DigitalInOut(board.D23)
reset_pin = digitalio.DigitalInOut(board.D24)
spi = busio.SPI(11,10,9)
self.oled = st7735.ST7735S(spi, rotation=270, width=self.height, height=self.width, cs=cs_pin, bl=cs_pin, dc=dc_pin, rst=reset_pin, x_offset=1, y_offset=2)
self.font = ImageFont.truetype(self.font_path, self.font_size)
self.image = Image.new("RGB", (self.width, self.height), (0,0,0))
self.oled.fill(0)
[문서] def show(self):
"""
인스턴스 변수 ``image`` 를 oled 화면에 표시합니다.
**이 메소드를 사용하지 않으면 그림을 그려도 oled 화면에 아무것도 출력되지 않습니다.**
example::
# 그림을 그린 후
oled.show()
"""
self.oled.image(self.image)
[문서] def clear(self, image=True, fill=True, show=True):
"""
인스턴스 변수 ``image`` 를 초기화 하고, oled 화면을 지웁니다.
example::
oled.clear()
:param bool image: image 초기화 여부
:param bool fill: oled 초기화 여부
:param bool show: 화면 표시 여부
"""
if image == True:
self.image = Image.new("RGB", (self.width, self.height), (0,0,0))
if fill == True:
self.oled.fill(0)
if show == True:
self.oled.image(self.image)
[문서] def set_font(self, filename=None, size=None):
"""
``draw_text`` 메소드에 사용할 폰트를 설정합니다.
example::
# 불러올 폰트의 경로가 /home/pi/mydata/font.ttf 라면,
oled.set_font('/home/pi/mydata/font.ttf', 10)
:param str filename: 폰트 파일 경로
폰트 확장자는 **ttf** 와 **otf** 모두 지원합니다.
:param int size: 폰트 사이즈
단위는 픽셀 입니다. (default 10)
"""
if filename == None:
filename = self.font_path
if size == None:
size = self.font_size
if not os.path.isfile(filename):
raise Exception(f'"{filename}" does not exist')
self.font = ImageFont.truetype(filename, size)
[문서] def draw_text(self, points, text:str, colors=(255,255,255)):
"""
문자를 그립니다.(한글, 영어 지원)
example::
oled.draw_text((10, 10), '안녕하세요!')
:param tuple(int, int) points: 문자열 좌측상단 좌표 (x, y)
:param str text: 문자열 내용
"""
if type(points) is not tuple:
raise Exception(f'"{points}" must be tuple type')
if len(points) != 2:
raise Exception(f'len({points}) must be 2')
ImageDraw.Draw(self.image).text(points, text, font=self.font, fill=colors)
[문서] def draw_image(self, filename):
"""
그림을 그립니다.
**128x64** 크기의 **png** 확장자만 허용됩니다.
example::
oled.draw_image('/home/pi/openpibo-files/image/clear.png')
:param str filename: 그림파일 경로
"""
if not os.path.isfile(filename):
raise Exception(f'"{filename}" does not exist')
self.image = Image.open(filename).resize((self.width, self.height)).convert('RGB')
[문서] def draw_data(self, img):
"""
numpy 이미지 데이터를 입력받아 이미지로 변환합니다.
카메라 출력값이 numpy 형식이므로, 이를 oled화면에 띄우기 위해 사용됩니다.
example::
from openpibo.vision import Camera
camera = Camera()
img = camera.read()
oled.draw_data(img)
oled.show()
:param numpy.ndarray img: 이미지 객체
"""
if type(img) is not np.ndarray:
raise Exception('"img" must be image data from opencv.')
self.image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)).resize((self.width, self.height))
[문서] def draw_rectangle(self, points, fill=None):
"""
직사각형을 그립니다.
example::
oled.draw_rectangle((10, 10, 80, 40), True)
:param tuple points: 사각형의 좌측상단 좌표, 사각형의 우측하단 좌표 (x1, y1, x2, y2)
:param bool fill:
* ``True`` : 사각형 내부를 채웁니다.
* ``False`` : 사각형 내부를 채우지 않습니다.
"""
if type(points) is not tuple:
raise Exception(f'"{points}" must be tuple type')
if len(points) != 4:
raise Exception(f'len({points}) must be 4')
if not fill in [None, True, False]:
raise Exception(f'"{fill}" must be (None|True|False)')
ImageDraw.Draw(self.image).rectangle(points, outline=(255,255,255), width=1, fill= (255,255,255) if fill else None)
[문서] def draw_ellipse(self, points, fill=None):
"""
타원을 그립니다.
example::
oled.draw_ellipse((10, 10, 80, 40), False)
:param tuple points: 타원에 외접하는 직사각형의 좌측상단 좌표, 우측하단 좌표 (x1, y1, x2, y2)
:param bool fill:
* ``True`` : 타원 내부를 채웁니다.
* ``False`` : 타원 내부를 채우지 않습니다.
"""
if type(points) is not tuple:
raise Exception(f'"{points}" must be tuple type')
if len(points) != 4:
raise Exception(f'len({points}) must be 4')
if not fill in [None, True, False]:
raise Exception(f'"{fill}" must be (None|True|False)')
ImageDraw.Draw(self.image).ellipse(points, outline=(255,255,255), width=1, fill= (255,255,255) if fill else None)
[문서] def draw_line(self, points):
"""
직선을 그립니다.
example::
oled.draw_line((30, 20, 60, 50))
:param tuple points: 선의 시작 좌표, 선의 끝 좌표 (x1, y1, x2, y2)
"""
if type(points) is not tuple:
raise Exception(f'"{points}" must be tuple type')
if len(points) != 4:
raise Exception(f'len({points}) must be 4')
ImageDraw.Draw(self.image).line(points, fill=(255,255,255))
[문서]class OledbyILI9341:
"""
Functions:
:meth:`~openpibo.oled.OledbyILI9341.show`
:meth:`~openpibo.oled.OledbyILI9341.clear`
:meth:`~openpibo.oled.OledbyILI9341.set_font`
:meth:`~openpibo.oled.OledbyILI9341.draw_text`
:meth:`~openpibo.oled.OledbyILI9341.draw_image`
:meth:`~openpibo.oled.OledbyILI9341.draw_data`
:meth:`~openpibo.oled.OledbyILI9341.draw_rectangle`
:meth:`~openpibo.oled.OledbyILI9341.draw_ellipse`
:meth:`~openpibo.oled.OledbyILI9341.draw_line`
파이보의 OLED를 통해 다양한 그림을 표현합니다.
* 사진 보기
* 문자 그리기
* 도형 그리기
그림을 그리면 인스턴스 변수 ``image`` 에 저장됩니다. 이를 ``show`` 메소드를 사용하여 oled 화면에 출력할 수 있습니다.
본 class에서 문자 또는 그림을 그리는 행위는 인스턴스 변수 ``image`` 의 데이터를 변경시키는 것으로 정의합니다.
example::
from openpibo.oled import OledbyILI9341 as Oled
oled = Oled()
# 아래의 모든 예제 이전에 위 코드를 먼저 사용합니다.
"""
def __init__(self, w=240, h=320):
"""
Oled 클래스를 초기화
"""
self.width = w
self.height = h
self.font_path = openpibo_models.filepath("KDL.ttf") # KoPub Dotum Light
self.font_size = 10
cs_pin = digitalio.DigitalInOut(board.D8)
dc_pin = digitalio.DigitalInOut(board.D23)
reset_pin = digitalio.DigitalInOut(board.D24)
spi = busio.SPI(11,10,9)
self.oled = ili9341.ILI9341(spi, rotation=0, rst=reset_pin, cs=cs_pin, dc=dc_pin, baudrate=36000000)
self.font = ImageFont.truetype(self.font_path, self.font_size)
self.image = Image.new("RGB", (self.width, self.height), (0,0,0))
self.oled.fill(0)
[문서] def show(self):
"""
인스턴스 변수 ``image`` 를 oled 화면에 표시합니다.
**이 메소드를 사용하지 않으면 그림을 그려도 oled 화면에 아무것도 출력되지 않습니다.**
example::
# 그림을 그린 후
oled.show()
"""
self.oled.image(self.image)
[문서] def clear(self, image=True, fill=True, show=True):
"""
인스턴스 변수 ``image`` 를 초기화 하고, oled 화면을 지웁니다.
example::
oled.clear()
:param bool image: image 초기화 여부
:param bool fill: oled 초기화 여부
:param bool show: 화면 표시 여부
"""
if image == True:
self.image = Image.new("RGB", (self.width, self.height), (0,0,0))
if fill == True:
self.oled.fill(0)
if show == True:
self.oled.image(self.image)
[문서] def set_font(self, filename=None, size=None):
"""
``draw_text`` 메소드에 사용할 폰트를 설정합니다.
example::
# 불러올 폰트의 경로가 /home/pi/mydata/font.ttf 라면,
oled.set_font('/home/pi/mydata/font.ttf', 10)
:param str filename: 폰트 파일 경로
폰트 확장자는 **ttf** 와 **otf** 모두 지원합니다.
:param int size: 폰트 사이즈
단위는 픽셀 입니다. (default 10)
"""
if filename == None:
filename = self.font_path
if size == None:
size = self.font_size
if not os.path.isfile(filename):
raise Exception(f'"{filename}" does not exist')
self.font = ImageFont.truetype(filename, size)
[문서] def draw_text(self, points, text:str, colors=(255,255,255)):
"""
문자를 그립니다.(한글, 영어 지원)
example::
oled.draw_text((10, 10), '안녕하세요!')
:param tuple(int, int) points: 문자열 좌측상단 좌표 (x, y)
:param str text: 문자열 내용
"""
if type(points) is not tuple:
raise Exception(f'"{points}" must be tuple type')
if len(points) != 2:
raise Exception(f'len({points}) must be 2')
ImageDraw.Draw(self.image).text(points, text, font=self.font, fill=colors)
[문서] def draw_image(self, filename):
"""
그림을 그립니다.
**128x64** 크기의 **png** 확장자만 허용됩니다.
example::
oled.draw_image('/home/pi/openpibo-files/image/clear.png')
:param str filename: 그림파일 경로
"""
if not os.path.isfile(filename):
raise Exception(f'"{filename}" does not exist')
self.image = Image.open(filename).resize((self.width, self.height)).convert('RGB')
[문서] def draw_data(self, img):
"""
numpy 이미지 데이터를 입력받아 이미지로 변환합니다.
카메라 출력값이 numpy 형식이므로, 이를 oled화면에 띄우기 위해 사용됩니다.
example::
from openpibo.vision import Camera
camera = Camera()
img = camera.read()
oled.draw_data(img)
oled.show()
:param numpy.ndarray img: 이미지 객체
"""
if type(img) is not np.ndarray:
raise Exception('"img" must be image data from opencv.')
self.image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)).resize((self.width, self.height))
[문서] def draw_rectangle(self, points, fill=None):
"""
직사각형을 그립니다.
example::
oled.draw_rectangle((10, 10, 80, 40), True)
:param tuple points: 사각형의 좌측상단 좌표, 사각형의 우측하단 좌표 (x1, y1, x2, y2)
:param bool fill:
* ``True`` : 사각형 내부를 채웁니다.
* ``False`` : 사각형 내부를 채우지 않습니다.
"""
if type(points) is not tuple:
raise Exception(f'"{points}" must be tuple type')
if len(points) != 4:
raise Exception(f'len({points}) must be 4')
if not fill in [None, True, False]:
raise Exception(f'"{fill}" must be (None|True|False)')
ImageDraw.Draw(self.image).rectangle(points, outline=(255,255,255), width=1, fill= (255,255,255) if fill else None)
[문서] def draw_ellipse(self, points, fill=None):
"""
타원을 그립니다.
example::
oled.draw_ellipse((10, 10, 80, 40), False)
:param tuple points: 타원에 외접하는 직사각형의 좌측상단 좌표, 우측하단 좌표 (x1, y1, x2, y2)
:param bool fill:
* ``True`` : 타원 내부를 채웁니다.
* ``False`` : 타원 내부를 채우지 않습니다.
"""
if type(points) is not tuple:
raise Exception(f'"{points}" must be tuple type')
if len(points) != 4:
raise Exception(f'len({points}) must be 4')
if not fill in [None, True, False]:
raise Exception(f'"{fill}" must be (None|True|False)')
ImageDraw.Draw(self.image).ellipse(points, outline=(255,255,255), width=1, fill= (255,255,255) if fill else None)
[문서] def draw_line(self, points):
"""
직선을 그립니다.
example::
oled.draw_line((30, 20, 60, 50))
:param tuple points: 선의 시작 좌표, 선의 끝 좌표 (x1, y1, x2, y2)
"""
if type(points) is not tuple:
raise Exception(f'"{points}" must be tuple type')
if len(points) != 4:
raise Exception(f'len({points}) must be 4')
ImageDraw.Draw(self.image).line(points, fill=(255,255,255))