import machine
import ssd1306
import time
# 1. Настройка I2C для OLED дисплея (контакты D21 и D22)
sda_pin = machine.Pin(21)
scl_pin = machine.Pin(22)
i2c = machine.I2C(0, sda=sda_pin, scl=scl_pin, freq=400000)
# Инициализация дисплея 128x64
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# 2. Настройка контактов кнопок с внутренней подтяжкой к питанию
btn1 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP)
btn2 = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP)
btn3 = machine.Pin(25, machine.Pin.IN, machine.Pin.PULL_UP)
btn4 = machine.Pin(26, machine.Pin.IN, machine.Pin.PULL_UP)
# 3. Кадры анимации кота (размер 24x24 пикселя)
# Кадр 1: Кот поднял левые лапки
cat_frame1 = [
0x00, 0x18, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x42, 0x00,
0x01, 0x81, 0x80, 0x02, 0x42, 0x40, 0x04, 0x3C, 0x20, 0x04, 0x00, 0x20,
0x08, 0x18, 0x10, 0x08, 0x24, 0x10, 0x08, 0x24, 0x10, 0x04, 0x18, 0x20,
0x04, 0x00, 0x20, 0x02, 0x00, 0x40, 0x01, 0x81, 0x80, 0x00, 0x7E, 0x00,
0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x42, 0x00,
0x00, 0x42, 0x00, 0x00, 0x81, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00
]
# Кадр 2: Кот поднял правые лапки
cat_frame2 = [
0x00, 0x18, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x42, 0x00,
0x01, 0x81, 0x80, 0x02, 0x42, 0x40, 0x04, 0x3C, 0x20, 0x04, 0x00, 0x20,
0x08, 0x18, 0x10, 0x08, 0x24, 0x10, 0x08, 0x24, 0x10, 0x04, 0x18, 0x20,
0x04, 0x00, 0x20, 0x02, 0x00, 0x40, 0x01, 0x81, 0x80, 0x00, 0x7E, 0x00,
0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x24, 0x00,
0x00, 0x24, 0x00, 0x00, 0x81, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00
]
# Функция для отрисовки кадра из массива байт
def draw_frame(frame, x_offset, y_offset):
for row in range(24):
# Каждый ряд состоит из 3 байт (24 пикселя)
b1 = frame[row * 3]
b2 = frame[row * 3 + 1]
b3 = frame[row * 3 + 2]
# Объединяем в одно 24-битное число
line = (b1 << 16) | (b2 << 8) | b3
for col in range(24):
# Проверяем каждый бит
if line & (1 << (23 - col)):
oled.pixel(x_offset + col, y_offset + row, 1)
# Начальная скорость анимации (в секундах)
speed = 0.2
toggle = True
print("Анимация запущена!")
while True:
# Меняем скорость в зависимости от нажатой кнопки
if btn1.value() == 0:
speed = 0.1 # Быстро
elif btn2.value() == 0:
speed = 0.2 # Нормально
elif btn3.value() == 0:
speed = 0.4 # Медленно
elif btn4.value() == 0:
speed = 0.6 # Очень медленно
oled.fill(0) # Очищаем экран
# Выводим статус кнопок вверху экрана
oled.text("B1:{} B2:{} B3:{}".format(not btn1.value(), not btn2.value(), not btn3.value()), 0, 0)
# Рисуем кота по центру (X=52, Y=24)
if toggle:
draw_frame(cat_frame1, 52, 24)
else:
draw_frame(cat_frame2, 52, 24)
oled.show() # Обновляем дисплей
toggle = not toggle # Переключаем кадр
time.sleep(speed) # Задержка между кадрами