import time
import random
from machine import Pin, I2C
from sh1107 import SH1107_I2C
from imu import BMI160
WIDTH = 128
HEIGHT = 128
BALL_SIZE = 4
NUM_BALLS = 100
# Inicializace I2C sběrnice
i2c = I2C(0, scl=Pin(1), sda=Pin(0))
# Inicializace displeje SH1107
display = SH1107_I2C(WIDTH, HEIGHT, i2c, addr=0x3C)
display.fill(0)
display.show()
# Inicializace akcelerometru BMI160
sensor = BMI160(i2c)
# === Funkce pro zobrazení GO ===
def show_go():
display.fill(0)
pixel_map = [
" XX XXXX ",
" X X X ",
" X X ",
" X X XX ",
" X X X X ",
" XX XX ",
]
for y, row in enumerate(pixel_map):
for x, char in enumerate(row):
if char == "X":
for dy in range(2):
for dx in range(2):
display.pixel(x * 6 + dx + 20, y * 6 + dy + 40, 1)
display.show()
time.sleep(3)
# === Animace přesýpajících se kuliček ===
def run_particles():
balls = []
for _ in range(NUM_BALLS):
balls.append({
'x': random.randint(0, WIDTH - BALL_SIZE),
'y': random.randint(0, HEIGHT - BALL_SIZE),
'vx': 0,
'vy': 0,
})
while True:
ax, ay, _ = sensor.get_accel()
gx = ax / 16384
gy = ay / 16384
display.fill(0)
for b in balls:
# Gravitační zrychlení ovlivní rychlost kuliček
b['vx'] += gx * 0.5
b['vy'] += gy * 0.5
# Tlumíme rychlost
b['vx'] *= 0.95
b['vy'] *= 0.95
# Pohyb kuliček
b['x'] += b['vx']
b['y'] += b['vy']
# Okraje displeje - odraz
if b['x'] < 0:
b['x'] = 0
b['vx'] *= -0.5
if b['y'] < 0:
b['y'] = 0
b['vy'] *= -0.5
if b['x'] > WIDTH - BALL_SIZE:
b['x'] = WIDTH - BALL_SIZE
b['vx'] *= -0.5
if b['y'] > HEIGHT - BALL_SIZE:
b['y'] = HEIGHT - BALL_SIZE
b['vy'] *= -0.5
# Vykreslení kuličky
for dx in range(BALL_SIZE):
for dy in range(BALL_SIZE):
display.pixel(int(b['x']) + dx, int(b['y']) + dy, 1)
display.show()
time.sleep(0.03)
# Spustit sekvenci
show_go()
run_particles()
Loading
grove-oled-sh1107
grove-oled-sh1107