import machine
import ssd1306
import framebuf
import time
# 1. Налаштування периферії (дисплея та шини I2C)
i2c = machine.I2C(0, scl=machine.Pin(22), sda=machine.Pin(21), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Створення тіньового буфера в оперативній пам'яті ESP32
buffer = bytearray(128 * 64 // 8)
fb = framebuf.FrameBuffer(buffer, 128, 64, framebuf.MONO_VLSB)
# 2. Змінні для логіки руху (заміна для абстрактної функції update_game_physics)
x = 0
y = 30
dx = 2 # Швидкість зсуву по осі X (пікселів за кадр)
# Налаштування таймера для стабільних 30 FPS (~33 мілісекунди на кадр)
TARGET_FPS = 30
FRAME_MIN_MS = 1000 // TARGET_FPS
while True:
start_time = time.ticks_ms() # Фіксуємо точний час початку кадру
# --- ЗАМІНА update_game_physics(): Оновлюємо координати об'єктів тут ---
x += dx
if x > 108 or x < 0:
dx *= -1 # Відскок від лівого або правого краю екрана
# --- ЗАМІНА render_to_buffer(): Очищення та малювання у буфер ---
fb.fill(0) # Очищаємо RAM-буфер перед малюванням нової сцени
fb.text("FPS Stabilized", 10, 10, 1)
fb.rect(x, y, 20, 20, 1) # Малюємо рухомий квадратик
# Перенесення готового кадру з пам'яті на фізичний дисплей OLED
oled.blit(fb, 0, 0)
oled.show()
# --- СТАБІЛІЗАЦІЯ ЧАСТОТИ КАДРІВ (FPS) ---
# Рахуємо, скільки мілісекунд процесор витратив на логіку та малювання
elapsed_ms = time.ticks_diff(time.ticks_ms(), start_time)
# Якщо кадр обробився швидше за ліміт — робимо паузу на залишок часу
if elapsed_ms < FRAME_MIN_MS:
time.sleep_ms(FRAME_MIN_MS - elapsed_ms)
Loading
esp32-devkit-c-v4
esp32-devkit-c-v4
Loading
ssd1306
ssd1306