import time
import board
import digitalio
# Assign segment pins (a to g) to GPIOs
segment_pins = {
'a': board.GP8,
'b': board.GP9,
'c': board.GP10,
'd': board.GP11,
'e': board.GP12,
'f': board.GP13,
'g': board.GP14,
}
# Set up segment pins as outputs
segments = {}
for name, pin in segment_pins.items():
seg = digitalio.DigitalInOut(pin)
seg.direction = digitalio.Direction.OUTPUT
segments[name] = seg
# === Setup LEDs ===
red_led = digitalio.DigitalInOut(board.GP15)
red_led.direction = digitalio.Direction.OUTPUT
green_led = digitalio.DigitalInOut(board.GP16)
green_led.direction = digitalio.Direction.OUTPUT
# === Setup Buzzer ===
buzzer = digitalio.DigitalInOut(board.GP17)
buzzer.direction = digitalio.Direction.OUTPUT
# === Keypad Layout ===
key_map = [
["1", "2", "3", "A"],
["4", "5", "6", "B"],
["7", "8", "9", "C"],
["*", "0", "#", "D"]
]
# Segment patterns for characters (common cathode display)
segment_map = {
'0': ['a', 'b', 'c', 'd', 'e', 'f'],
'1': ['b', 'c'],
'2': ['a', 'b', 'g', 'e', 'd'],
'3': ['a', 'b', 'c', 'd', 'g'],
'4': ['f', 'g', 'b', 'c'],
'5': ['a', 'f', 'g', 'c', 'd'],
'6': ['a', 'f', 'e', 'd', 'c', 'g'],
'7': ['a', 'b', 'c'],
'8': ['a', 'b', 'c', 'd', 'e', 'f', 'g'],
'9': ['a', 'b', 'c', 'd', 'f', 'g'],
'L': ['d', 'e', 'f'],
'U': ['b', 'c', 'd', 'e', 'f'],
'*': [],
'#': ['c', 'e', 'f', 'g']
}
def display_char(char):
pattern = segment_map.get(char.upper(), [])
for seg in segments:
segments[seg].value = not seg in pattern
# === Setup Keypad Pins ===
row_pins = [board.GP0, board.GP1, board.GP2, board.GP3]
col_pins = [board.GP4, board.GP5, board.GP6, board.GP7]
rows = []
cols = []
for pin in row_pins:
row = digitalio.DigitalInOut(pin)
row.direction = digitalio.Direction.OUTPUT
row.value = False
rows.append(row)
for pin in col_pins:
col = digitalio.DigitalInOut(pin)
col.direction = digitalio.Direction.INPUT
col.pull = digitalio.Pull.DOWN
cols.append(col)
# === Variables ===
PASSWORD = "1114"
input_code = ""
attempts = 0
locked = True
# === Functions ===
def buzz(duration=0.1):
buzzer.value = True
time.sleep(duration)
buzzer.value = False
def lock_system():
global locked
locked = True
red_led.value = True
green_led.value = False
display_char('L')
print("🔒 Locked. Enter PIN:")
def unlock_system():
global locked
locked = False
red_led.value = False
green_led.value = True
display_char('U')
print("✅ Unlocked. Welcome!")
buzz(0.1)
def lockout_alert():
print("⛔ Too Many Attempts!")
for _ in range(6):
red_led.value = not red_led.value
buzz(0.1)
time.sleep(0.2)
red_led.value = True
time.sleep(5)
lock_system()
def scan_keypad():
for row_idx, row in enumerate(rows):
row.value = True
for col_idx, col in enumerate(cols):
if col.value:
row.value = False
return key_map[row_idx][col_idx]
row.value = False
return None
# === Initialize System ===
lock_system()
# === Main Loop ===
while True:
key = scan_keypad()
if key:
buzz(0.05)
print("Key Pressed:", key)
if key == "#":
if input_code == PASSWORD:
unlock_system()
time.sleep(5)
lock_system()
else:
print("❌ Wrong PIN. Try again.")
buzz(0.5)
attempts += 1
if attempts >= 3:
lockout_alert()
attempts = 0
input_code = ""
display_char('*') # Clear display after attempt
elif key == "*":
input_code = ""
print("🔄 Cleared. Enter PIN.")
display_char('*')
elif key in "0123456789":
input_code += key
print("Code so far:", "*" * len(input_code))
display_char(key) # Show last digit entered
time.sleep(0.3) # debounce