from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
from utime import sleep
import sys
# Rozlišení displeje
pix_res_x = 128
pix_res_y = 64
# Inicializace I2C a displeje
def init_i2c(scl_pin, sda_pin):
i2c_dev = I2C(1, scl=Pin(scl_pin), sda=Pin(sda_pin), freq=200000)
i2c_addr = [hex(ii) for ii in i2c_dev.scan()]
if not i2c_addr:
print('I2C displej nenalezen')
sys.exit()
else:
print("I2C adresa : {}".format(i2c_addr[0]))
print("I2C konfigurace: {}".format(i2c_dev))
return i2c_dev
i2c_dev = init_i2c(scl_pin=27, sda_pin=26)
oled = SSD1306_I2C(pix_res_x, pix_res_y, i2c_dev)
# Konfigurace klávesnice (4x4 matice)
matice_klaves = [['1', '2', '3', 'A'],
['4', '5', '6', 'B'],
['7', '8', '9', 'C'],
['*', '0', '#', 'D']]
klavesnicove_radky = [2, 3, 4, 5]
klavesnicove_sloupce = [6, 7, 8, 9]
radkove_piny = [Pin(pin, Pin.OUT) for pin in klavesnicove_radky]
sloupcove_piny = [Pin(pin, Pin.IN, Pin.PULL_DOWN) for pin in klavesnicove_sloupce]
def nacti_klavesu():
for radek in range(4):
# Nastav všechny řádky na LOW
for r in range(4):
radkove_piny[r].value(0)
# Nastav aktuální řádek na HIGH
radkove_piny[radek].value(1)
for sloupec in range(4):
if sloupcove_piny[sloupec].value() == 1:
sleep(0.05) # debounce
if sloupcove_piny[sloupec].value() == 1:
klavesa = matice_klaves[radek][sloupec]
while sloupcove_piny[sloupec].value() == 1:
sleep(0.01)
return klavesa
return None
# Definice bludiště jako 2D pole (1 = zeď, 0 = cesta)
maze = [
[1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,1,0,0,0,0,1],
[1,0,1,0,1,0,1,1,0,1],
[1,0,1,0,0,0,0,1,0,1],
[1,0,1,1,1,1,0,1,0,1],
[1,0,0,0,0,0,0,1,0,1],
[1,1,1,1,1,1,1,1,1,1]
]
cell_size = 8 # Velikost jedné buňky v pixelech
# Počáteční pozice hráče (souřadnice v poli)
player_x = 1
player_y = 1
def draw_maze():
oled.fill(0) # Vymažeme displej
# Vykreslení bludiště
for y in range(len(maze)):
for x in range(len(maze[0])):
if maze[y][x] == 1:
# Zeď vykreslíme jako vyplněný čtverec
oled.fill_rect(x * cell_size, y * cell_size, cell_size, cell_size, 1)
# Vykreslení hráče jako menší čtverec uvnitř buňky
oled.fill_rect(player_x * cell_size + 2, player_y * cell_size + 2, cell_size - 4, cell_size - 4, 1)
oled.show()
draw_maze()
while True:
key = nacti_klavesu()
if key:
new_x = player_x
new_y = player_y
# Určení směru pohybu podle stisknuté klávesy
if key == '8': # nahoru
new_y += 1
elif key == '2': # dolů
new_y -= 1
elif key == '4': # doleva
new_x -= 1
elif key == '6': # doprava
new_x += 1
# Kontrola, zda nová pozice není mimo hranice a není zeď
if new_x >= 0 and new_x < len(maze[0]) and new_y >= 0 and new_y < len(maze):
if maze[new_y][new_x] == 0:
player_x = new_x
player_y = new_y
draw_maze()
sleep(0.1)