import machine
import utime
# LED related
led_onboard = machine.Pin(25, machine.Pin.OUT)
led_0 = machine.Pin(0, machine.Pin.OUT)
led_1 = machine.Pin(1, machine.Pin.OUT)
led_2 = machine.Pin(2, machine.Pin.OUT)
led_3 = machine.Pin(3, machine.Pin.OUT)
led_4 = machine.Pin(4, machine.Pin.OUT)
led_5 = machine.Pin(5, machine.Pin.OUT)
led_6 = machine.Pin(6, machine.Pin.OUT)
led_7 = machine.Pin(7, machine.Pin.OUT)
LEDS = (led_0, led_1, led_2, led_3, led_4, led_5, led_6, led_7)
LED_mask = 0
LED_state = 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
button_pressed_released = False
last_time = 0 # the last time the button is pressed
debounce_time = 30 #ms
# FSM related
FSM_state = 0
# callback functions for the timers
def sense_ISR(timer):
check_button()
def compute_ISR(timer):
FSM()
def actuate_ISR(time):
led_move_one_step()
move_lights()
# 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
if button_state == 0:
if big_blue_button.value() == 0:
new_time = utime.ticks_ms()
if (new_time - last_time > debounce_time):
last_time = new_time
button_state = 1
elif button_state == 1:
if big_blue_button.value() == 1:
new_time = utime.ticks_ms()
if (new_time - last_time > debounce_time):
last_time = new_time
button_state = 0
button_pressed_released = 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 initialize_game():
global LED_state, LED_mask, top_to_down
LED_state = 0
LED_mask = 0
top_to_down = True
def led_move_one_step():
global LED_mask, top_to_down, move_LEDS
if move_LEDS:
if top_to_down:
if LED_mask == 0:
LED_mask = 0b10000000
return
if LED_mask != 0b00000001:
LED_mask = LED_mask >> 1
else:
LED_mask = LED_mask << 1
top_to_down = False
else:
if LED_mask != 0b10000000:
LED_mask = LED_mask << 1
else:
LED_mask = LED_mask >> 1
top_to_down = True
def move_lights():
global LED_state
LED_state = LED_mask
LED_bit = 7
for led in LEDS:
led.value((LED_state >> LED_bit) & 1)
LED_bit = LED_bit - 1
def clear_leds():
LED_mask = 0
move_lights()
# Main Loop
while big_red_button.value():
pass
clear_leds()
timer_sense.deinit()
timer_actuate.deinit()
timer_compute.deinit()