from machine import Pin, SoftI2C
import ssd1306
import time
# ---------------------------
# I2C and OLED Setup
# ---------------------------
i2c = SoftI2C(scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# ---------------------------
# BUTTON SETUP
# ---------------------------
btn1 = Pin(17, Pin.IN, Pin.PULL_UP) # Accept / Next
btn2 = Pin(18, Pin.IN, Pin.PULL_UP) # Reject / Reboot
# ---------------------------
# GAME VARIABLES
# ---------------------------
dare_numbers = [4, 7, 2, 3, 8, 10, 1, 9, 6, 5, 7]
dare_index = 0
current_screen = 'ADMIM' # ADMIM / GAME_MENU / DARE / REACTION
# ---------------------------
# HELPER FUNCTIONS
# ---------------------------
def wait_button(timeout=None):
start = time.ticks_ms()
while True:
if btn1.value() == 0:
time.sleep(0.2) # debounce
return 'accept'
if btn2.value() == 0:
time.sleep(0.2)
return 'reject'
if timeout:
if time.ticks_diff(time.ticks_ms(), start) > timeout*1000:
return None
time.sleep(0.01)
def show_text(lines):
oled.fill(0)
for i, line in enumerate(lines):
oled.text(line, 0, i*10)
oled.show()
def show_dot():
oled.fill(0)
oled.text('●', 60, 25) # Big dot at center
oled.show()
# ---------------------------
# MAIN LOOP
# ---------------------------
while True:
if current_screen == 'ADMIM':
show_text(["--- ADMIM ---", "Btn1=continue", "Btn2=reboot"])
choice = wait_button()
if choice == 'accept':
current_screen = 'GAME_MENU'
elif choice == 'reject':
show_text(["Already at ADMIM"])
time.sleep(1)
elif current_screen == 'GAME_MENU':
show_text(["Choose Game:", "Btn1=Dare", "Btn2=Reaction"])
choice = wait_button()
if choice == 'accept':
current_screen = 'DARE'
elif choice == 'reject':
current_screen = 'REACTION'
elif current_screen == 'DARE':
number = dare_numbers[dare_index]
show_text([f"Dare Number: {number}", "Btn1=Accept", "Btn2=Reject/ADMIM"])
choice = wait_button()
if choice == 'accept':
show_text([f"Dare {number} ACCEPTED!"])
time.sleep(1)
elif choice == 'reject':
show_text([f"Dare {number} REJECTED!"])
time.sleep(1)
# Next dare
dare_index = (dare_index + 1) % len(dare_numbers)
current_screen = 'ADMIM'
elif current_screen == 'REACTION':
intervals = [1, 1, 3, 2, 1, 1]
count = 0
for interval in intervals:
show_dot()
start = time.ticks_ms()
pressed = False
while time.ticks_diff(time.ticks_ms(), start) < interval*1000:
if btn1.value() == 0:
pressed = True
time.sleep(0.2) # debounce
break
time.sleep(0.01)
if pressed:
count += 1
show_text(["Good!"])
time.sleep(0.5)
else:
show_text(["Missed!"])
time.sleep(1)
break
show_text([f"Total correct: {count}", "Btn2 to return"])
# Wait until Button 2 is pressed to return
while wait_button() != 'reject':
time.sleep(0.01)
current_screen = 'ADMIM'