from machine import Pin
from machine import Timer
class Button:
def __init__(self, pin, debounce_time=5):
self.pin = Pin(pin, mode=Pin.IN, pull=Pin.PULL_UP)
self.state = False
self.state_last = None
self.counter = 0
self.debounce_time = debounce_time
self.ft = False
def force_trigger(self):
if not self.state:
self.ft = True
def trigger(self):
self.state_last = self.state
if self.ft:
self.state = True
self.ft = False
return True
if self.pin.value() == 0: # PULL_UP -> 0 = pressed
if not self.state:
self.counter += 1
if self.pin.value() == 1: # PULL_UP -> 1 = not pressed
self.state = False
self.counter = 0
if self.counter == self.debounce_time:
self.state = True
return self.state_last != self.state
class SoftTimer:
def __init__(self):
self.counter = 0
self.ft = False
def force_trigger(self):
self.counter = 0
self.ft = True
def run(self, time):
self.counter = time
def trigger(self):
if self.ft:
self.ft = False
return True
elif self.counter > 0:
self.counter -= 1
if self.counter == 0:
return True
return False
class Controller:
def __init__(self):
self.pin_inhibit = Pin(12, Pin.OUT, value=0)
self.pin_forward_reverse = Pin(13, Pin.OUT, value=0)
self.pin_speed0 = Pin(33, Pin.OPEN_DRAIN, value=0)
self.pin_speed1 = Pin(32, Pin.OPEN_DRAIN, value=0)
self.pin_speed2 = Pin(0, Pin.OPEN_DRAIN, value=0)
#
self.pin_led_mode = Pin(4, Pin.OUT, value=0)
#
self.button_start_stop = Button(2)
#
self.button_start_stop_pressed = False
#
self.state = "IDLE"
self.state_last = None
#
self.timer = SoftTimer()
#
Timer(1).init(period=10, mode=Timer.PERIODIC, callback=self.loop)
#
print()
print()
print("*" * 60)
print("* Controller ready")
print("*" * 60)
print()
print()
def goto_state_end_of_run(self):
self.timer.run(200)
self.state = "END_OF_RUN"
def loop(self, t):
self.state_last = self.state
#
button_start_stop_trigger = self.button_start_stop.trigger()
button_start_stop_pressed = (
button_start_stop_trigger and self.button_start_stop.state
)
#
timer_trigger = self.timer.trigger()
# ----------------------------------------------------------
if self.state == "IDLE":
if button_start_stop_pressed:
self.pin_led_mode.on()
self.timer.run(200)
self.state = "RUN"
# ----------------------------------------------------------
elif self.state == "RUN":
if button_start_stop_pressed:
self.pin_led_mode.off()
self.state = "IDLE"
elif timer_trigger:
self.goto_state_end_of_run()
# ----------------------------------------------------------
elif self.state == "END_OF_RUN":
if timer_trigger:
self.pin_led_mode.off()
self.state = "IDLE"
#
if self.state_last != self.state:
print("*" * 30, f" New state {self.state} ", "*" * 30)
controller = Controller()
Hello