import machine, utime
utime.sleep(0.1) # Wait for USB to become ready
# LED related
led_onboard = machine.Pin(25, machine.Pin.OUT)
LEDS = tuple(machine.Pin(i, machine.Pin.OUT) for i in range(0, 8))
LED_mask = 0
top_to_down = True
move_LEDS = False
# button related
big_blue_button = machine.Pin(8, machine.Pin.IN, machine.Pin.PULL_UP)
big_red_button = machine.Pin(9, machine.Pin.IN, machine.Pin.PULL_UP)
button_state = 0 # 0 --> switch_not_pressed; 1 --> switch_pressed
button_pressed_released = False
last_time = 0 # the last time the button is pressed
debounce_time = 30 #ms
# FSM related
FSM_state = 0
do_sense = False
do_compute = False
do_actuate = False
# ISR callbacks
def sense_ISR(time):
global do_sense
do_sense = True
def compute_ISR(time):
global do_compute
do_compute = True
def actuate_ISR(time):
global do_actuate
do_actuate = True
# define the timers
timer_sense = machine.Timer()
timer_compute = machine.Timer()
timer_actuate = machine.Timer()
# freq in Hz, period in ms, mode= PERIODIC, ONE_SHOT, callback --> tic(timer)
timer_sense.init(period = 50, mode = machine.Timer.PERIODIC, callback = sense_ISR)
timer_compute.init(period = 100, mode = machine.Timer.PERIODIC, callback = compute_ISR)
timer_actuate.init(period = 300, mode = machine.Timer.PERIODIC, callback = actuate_ISR)
# function definitions
def check_button():
global button_state, button_pressed_released, last_time
now = utime.ticks_ms()
if button_state == 0:
if big_blue_button.value() == 0 and utime.ticks_diff(now, last_time) > debounce_time:
last_time = now
button_state = 1
elif button_state == 1:
if big_blue_button.value() == 1 and utime.ticks_diff(now, last_time) > debounce_time:
last_time = now
button_state = 0
button_pressed_released = True
def initialize_game():
global LED_mask, top_to_down
LED_mask = 0
top_to_down = True
def FSM():
global FSM_state, move_LEDS, button_pressed_released
if FSM_state == 0:
FSM_state = 1
initialize_game()
elif FSM_state == 1:
if button_pressed_released:
FSM_state = 2
move_LEDS = True
button_pressed_released = False
elif FSM_state == 2:
if button_pressed_released:
FSM_state = 3
move_LEDS = False
button_pressed_released = False
else: # FSM_state = 3
if button_pressed_released:
FSM_state = 0
button_pressed_released = False
def led_move_one_step():
global LED_mask, top_to_down, move_LEDS
if not move_LEDS:
return
if top_to_down:
if LED_mask == 0:
LED_mask = 0b10000000
return
if LED_mask != 0b00000001:
LED_mask >>= 1
else:
LED_mask <<= 1
top_to_down = False
else:
if LED_mask != 0b10000000:
LED_mask <<= 1
else:
LED_mask >>= 1
top_to_down = True
def move_lights():
# output LED_mask onto LEDs
# converts an 8-bit software variable into
# 8 physical LED outputs by extracting each bit
# and writing it to a GPIO pin.
for i, led in enumerate(LEDS):
bit = 7 - i
led.value((LED_mask >> bit) & 1)
def clear_leds():
global LED_mask
LED_mask = 0
move_lights()
# ---- main loop: STOP when red button pressed ----
print("Game started!")
while big_red_button.value() == 1:
if do_sense:
do_sense = False
check_button()
if do_compute:
do_compute = False
FSM()
if do_actuate:
do_actuate = False
led_move_one_step()
move_lights()
print("Finished the game!")
clear_leds()
timer_sense.deinit()
timer_compute.deinit()
timer_actuate.deinit()