import machine, time
time_last_pressed = 0
mux_input = machine.Pin(12, machine.Pin.IN, machine.Pin.PULL_DOWN)
selector_a = machine.Pin(13, machine.Pin.OUT)
selector_b = machine.Pin(14, machine.Pin.OUT)
buttons = [machine.Pin(2 + i, machine.Pin.OUT, machine.Pin.PULL_DOWN) for i in range(3)]
access_code = [buttons[0], buttons[2], buttons[1]]
input_sequence = []
status_indicators = [machine.Pin(16 + i, machine.Pin.OUT) for i in range(9)]
def button_interrupt_handler(pin):
global time_last_pressed
if time.ticks_diff(time.ticks_ms(), time_last_pressed) > 200:
time_last_pressed = time.ticks_ms()
input_sequence.append(pin)
print(f'Button Pressed: {buttons.index(pin)}')
def system_control():
global input_sequence, access_code
event_watchers = [btn.irq(trigger=machine.Pin.IRQ_FALLING, handler=button_interrupt_handler) for btn in buttons]
last_state = -1
while True:
signal_value = 0
for selection in range(4):
selector_a.value((selection >> 0) & 1)
selector_b.value((selection >> 1) & 1)
time.sleep_us(5) # Allow signal stabilization
signal_value |= (mux_input.value() << selection)
if last_state != signal_value:
print(f"Decoded Value: {signal_value}\n")
last_state = signal_value
time.sleep(0.1)
if len(input_sequence) >= len(access_code):
if input_sequence == access_code:
if signal_value > 8:
print("Access Granted: Invalid Range (Valid: 0-8)")
else:
print(f"\nLED {signal_value}")
status_indicators[signal_value].toggle()
print(f"✨ Success! You're In.\nSequence: {[buttons.index(x) for x in input_sequence]}")
else:
print(f"⛔ Nope! That's not the right code.\nSequence: {[buttons.index(x) for x in input_sequence]}")
input_sequence = input_sequence[len(access_code):]
if __name__ == "__main__":
system_control()