Загрузка данных


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)