from machine import Pin, I2C
import ssd1306
import time
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
upbutton = Pin(33, Pin.IN,Pin.PULL_UP)
downbutton = Pin(32, Pin.IN,Pin.PULL_UP)
leftbutton = Pin(14,Pin.IN,Pin.PULL_UP)
rightbutton = Pin(12,Pin.IN,Pin.PULL_UP)
selectbutton = Pin(26, Pin.IN,Pin.PULL_UP)
backbutton = Pin(27, Pin.IN,Pin.PULL_UP)
main_items = ["Settings", "Files", "Games", "Info"]
settings_items = ["Wi-Fi"]
games_items = ["Guess Number", "Pi Game"]
menu_stack = [{"title": "Main", "items": main_items}]
items = menu_stack[-1]["items"]
row_height = 16
header_h = row_height
visible = (64 - header_h) // row_height
selected = 0
scroll = 0
def draw_menu():
oled.fill(0)
oled.text(menu_stack[-1]["title"], 0, 0, 1)
oled.framebuf.hline(0, header_h - 1, 124, 1)
start = scroll
end = min(len(items), start + visible)
for i in range(start, end):
y = header_h + (i - start) * row_height
if i == selected:
oled.framebuf.rect(0, y, 124, row_height, 1)
oled.text(items[i], 6, y + (row_height - 8) // 2, 1)
track_x = 124
track_w = 4
track_h = 64 - header_h
track_y = header_h
oled.framebuf.rect(track_x, track_y, track_w, track_h, 1)
total = len(items)
if total <= visible:
thumb_h = track_h - 2
thumb_y = track_y + 1
else:
thumb_h = max(8, int(track_h * visible // total))
max_offset = total - visible
thumb_y = track_y + int((track_h - thumb_h) * scroll // max_offset)
oled.framebuf.fill_rect(track_x + 1, thumb_y + 1, track_w - 2, max(1, thumb_h - 2), 1)
oled.show()
def open_settings_menu():
global items, selected, scroll
menu_stack.append({"title": "Settings", "items": settings_items})
items = settings_items
selected = 0
scroll = 0
def show_wifi_page():
oled.fill(0)
oled.text("Settings > Wi-Fi", 0, 0, 1)
oled.framebuf.hline(0, header_h - 1, 124, 1)
oled.show()
pbw = backbutton.value()
while True:
b3 = backbutton.value()
if pbw == 1 and b3 == 0:
break
time.sleep_ms(60)
def open_games_menu():
global items, selected, scroll
menu_stack.append({"title": "Games", "items": games_items})
items = games_items
selected = 0
scroll = 0
def run_guess_number_game():
min_num = 2
max_num = 99
guess = 2
target = int((time.ticks_us() % 98) + 2)
pu = upbutton.value()
pd = downbutton.value()
ps = selectbutton.value()
pb = backbutton.value()
while True:
u2 = upbutton.value()
d2 = downbutton.value()
s2 = selectbutton.value()
b2 = backbutton.value()
if pb == 1 and b2 == 0:
break
if pu == 1 and u2 == 0:
if guess < max_num:
guess += 1
else:
guess = min_num
pu = u2
elif pd == 1 and d2 == 0:
if guess > min_num:
guess -= 1
else:
guess = max_num
pd = d2
elif ps == 1 and s2 == 0:
if guess < target and guess > min_num:
min_num = guess
elif guess > target and guess < max_num:
max_num = guess
elif guess == target:
oled.fill(0)
oled.text("Games > Guess", 0, 0, 1)
oled.framebuf.hline(0, header_h - 1, 124, 1)
oled.text("You Win!", 20, 16, 1)
oled.text("Number:"+str(target), 8, 32, 1)
oled.text("Back to exit", 0, 48, 1)
oled.show()
pbw = backbutton.value()
while True:
b3 = backbutton.value()
if pbw == 1 and b3 == 0:
break
time.sleep_ms(80)
break
ps = s2
oled.fill(0)
oled.text("Games > Guess", 0, 0, 1)
oled.framebuf.hline(0, header_h - 1, 124, 1)
oled.text("Range:"+str(min_num)+"-"+str(max_num), 0, 16, 1)
oled.text("Guess:"+str(guess), 0, 32, 1)
oled.text("Back to exit", 0, 48, 1)
oled.show()
pu = u2
pd = d2
ps = s2
pb = b2
time.sleep_ms(80)
def run_pi_game():
digits = '3141592653589793238462643383279502884197169399375105820974944592'
idx = 0
current = 0
pu = upbutton.value()
pd = downbutton.value()
ps = selectbutton.value()
pb = backbutton.value()
start = time.ticks_ms()
while True:
u2 = upbutton.value()
d2 = downbutton.value()
s2 = selectbutton.value()
b2 = backbutton.value()
if pb == 1 and b2 == 0:
break
if pu == 1 and u2 == 0:
current = (current + 1) % 10
pu = u2
elif pd == 1 and d2 == 0:
current = (current - 1) % 10
pd = d2
elif ps == 1 and s2 == 0:
if str(current) == digits[idx]:
idx += 1
if idx >= len(digits):
oled.fill(0)
oled.text("Games > Pi", 0, 0, 1)
oled.framebuf.hline(0, header_h - 1, 124, 1)
oled.text("You Win!", 24, 16, 1)
oled.text("Len:"+str(idx), 24, 32, 1)
oled.text("Back to exit", 0, 48, 1)
oled.show()
pbw = backbutton.value()
while True:
b3 = backbutton.value()
if pbw == 1 and b3 == 0:
break
time.sleep_ms(80)
break
else:
oled.fill(0)
oled.text("Games > Pi", 0, 0, 1)
oled.framebuf.hline(0, header_h - 1, 124, 1)
oled.text("Wrong!", 32, 16, 1)
oled.text("Len:"+str(idx), 24, 32, 1)
oled.show()
time.sleep_ms(800)
break
ps = s2
elapsed = (time.ticks_ms() - start) // 1000
oled.fill(0)
oled.text("Games > Pi", 0, 0, 1)
oled.framebuf.hline(0, header_h - 1, 124, 1)
oled.text("Enter:"+str(idx+1), 0, 16, 1)
oled.text("Digit:"+str(current), 0, 32, 1)
oled.text("Time:"+str(elapsed)+"s", 0, 48, 1)
oled.show()
pu = u2
pd = d2
ps = s2
pb = b2
time.sleep_ms(80)
def select_action():
global items, selected, scroll
title = menu_stack[-1]["title"]
item = items[selected]
if title == "Main":
if item == "Settings":
open_settings_menu()
elif item == "Games":
open_games_menu()
else:
oled.fill(0)
oled.text(item, 0, 0, 1)
oled.framebuf.hline(0, header_h - 1, 124, 1)
oled.show()
pbw = backbutton.value()
while True:
b3 = backbutton.value()
if pbw == 1 and b3 == 0:
break
time.sleep_ms(60)
elif title == "Settings":
if item == "Wi-Fi":
show_wifi_page()
elif title == "Games":
if item == "Guess Number":
run_guess_number_game()
elif item == "Pi Game":
run_pi_game()
prev_up = upbutton.value()
prev_down = downbutton.value()
prev_select = selectbutton.value()
prev_left = leftbutton.value()
prev_right = rightbutton.value()
prev_back = backbutton.value()
draw_menu()
while True:
u = upbutton.value()
d = downbutton.value()
s = selectbutton.value()
l = leftbutton.value()
r = rightbutton.value()
b = backbutton.value()
changed = False
if prev_up == 1 and u == 0:
if selected > 0:
selected -= 1
if selected < scroll:
scroll = selected
changed = True
elif prev_down == 1 and d == 0:
if selected < len(items) - 1:
selected += 1
if selected >= scroll + visible:
scroll = selected - visible + 1
changed = True
elif prev_left == 1 and l == 0:
if selected > 0:
selected = max(0, selected - visible)
scroll = selected
changed = True
elif prev_right == 1 and r == 0:
if selected < len(items) - 1:
selected = min(len(items) - 1, selected + visible)
scroll = max(0, selected - visible + 1)
changed = True
elif prev_select == 1 and s == 0:
select_action()
changed = True
elif prev_back == 1 and b == 0:
if len(menu_stack) > 1:
menu_stack.pop()
items = menu_stack[-1]["items"]
selected = 0
scroll = 0
changed = True
else:
selected = 0
scroll = 0
oled.fill(0)
oled.text("Back", 0, 0, 1)
oled.show()
time.sleep_ms(500)
changed = True
if changed:
draw_menu()
prev_up = u
prev_down = d
prev_select = s
prev_left = l
prev_right = r
prev_back = b
time.sleep_ms(60)