import time
import board
import digitalio
import busio
from i2c_lcd import I2cLcd
import builtins
str = builtins.str
# I2C Setup
i2c = busio.I2C(scl=board.GP5, sda=board.GP4)
lcd = I2cLcd(i2c, 0x27, 2, 16)
# Keypad configuration (3x4)
keymap = [
['1', '2', '3'],
['4', '5', '6'],
['7', '8', '9'],
['*', '0', '#']
]
row_pins = [board.GP15, board.GP14, board.GP13, board.GP12]
col_pins = [board.GP11, board.GP10, board.GP9]
rows = [digitalio.DigitalInOut(pin) for pin in row_pins]
cols = [digitalio.DigitalInOut(pin) for pin in col_pins]
for row in rows:
row.direction = digitalio.Direction.OUTPUT
row.value = False
for col in cols:
col.direction = digitalio.Direction.INPUT
col.pull = digitalio.Pull.DOWN
# Pushbutton (submit only)
submit_button = digitalio.DigitalInOut(board.GP6)
submit_button.direction = digitalio.Direction.INPUT
submit_button.pull = digitalio.Pull.UP
# LEDs
green_led = digitalio.DigitalInOut(board.GP2)
green_led.direction = digitalio.Direction.OUTPUT
green_led.value = False
red_led = digitalio.DigitalInOut(board.GP3)
red_led.direction = digitalio.Direction.OUTPUT
red_led.value = False
# Secret Code
SECRET_CODE = "1161"
input_code = ""
def read_keypad():
for i, row in enumerate(rows):
row.value = True
for j, col in enumerate(cols):
if col.value:
while col.value:
pass # debounce
row.value = False
return keymap[i][j]
row.value = False
return None
def display_message(line1, line2=""):
try:
line1 = str(line1)[:16]
line2 = str(line2)[:16]
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr(line1)
lcd.move_to(0, 1)
lcd.putstr(line2)
except Exception as e:
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("DISPLAY ERROR")
lcd.move_to(0, 1)
try:
lcd.putstr(str(e)[:16])
except:
lcd.putstr("UNKNOWN ERROR")
print("display_message error:", e)
# Initial message
lcd.clear()
display_message("ENTER CODE:")
# Main Loop
while True:
# Handle submit button
if not submit_button.value:
if input_code == SECRET_CODE:
display_message("ACCESS GRANTED", "WELCOME AGENT")
green_led.value = True
red_led.value = False
else:
display_message("ACCESS DENIED", "NO ENTRY")
red_led.value = True
green_led.value = False
time.sleep(2)
input_code = ""
green_led.value = False
red_led.value = False
display_message("ENTER CODE:")
key = read_keypad()
if key:
if key == "*":
input_code = input_code[:-1]
display_message("ENTER CODE:", input_code)
else:
if len(input_code) < 4:
input_code += key
display_message("ENTER CODE:", input_code)