from machine import Pin, I2C
import ssd1306
import time
import random
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
b13 = Pin(13, Pin.IN, Pin.PULL_UP) # влево
b14 = Pin(14, Pin.IN, Pin.PULL_UP) # вправо
b25 = Pin(25, Pin.IN, Pin.PULL_UP) # вверх
b26 = Pin(26, Pin.IN, Pin.PULL_UP) # моргнуть
def draw_eye(cx, cy, pupil_dx, pupil_dy):
# Белок глаза (эллипс ~ прямоугольник со сглаживанием)
oled.ellipse(cx, cy, 28, 20, 1)
# Зрачок
oled.fill_ellipse(cx + pupil_dx, cy + pupil_dy, 9, 9, 1)
# Добавляем ellipse в ssd1306 если нет
def ellipse(self, x0, y0, x1, y1, c):
a = abs(x1)
b = abs(y1)
for y in range(-b, b + 1):
for x in range(-a, a + 1):
if (x*x)/(a*a) + (y*y)/(b*b) <= 1:
self.pixel(x0 + x, y0 + y, c)
def fill_ellipse(self, x0, y0, x1, y1, c):
ellipse(self, x0, y0, x1, y1, c)
ssd1306.SSD1306_I2C.ellipse = ellipse
ssd1306.SSD1306_I2C.fill_ellipse = fill_ellipse
px, py = 0, 0 # смещение зрачков
blink = False
blink_timer = 0
while True:
# Управление зрачками
if b13.value() == 0:
px = -12
elif b14.value() == 0:
px = 12
else:
px = 0
if b25.value() == 0:
py = -8
elif b26.value() == 0:
blink = True
blink_timer = 5
else:
py = 0
oled.fill(0)
if blink:
# Закрытые глаза — линии
oled.hline(10, 32, 45, 1)
oled.hline(75, 32, 45, 1)
blink_timer -= 1
if blink_timer <= 0:
blink = False
else:
draw_eye(38, 32, px, py)
draw_eye(90, 32, px, py)
oled.show()
# Случайное моргание
if not blink and random.randint(0, 100) < 2:
blink = True
blink_timer = 5
time.sleep(0.05)