from machine import Pin, PWM
import utime
from time import time as now
# Pin definitions
pir = Pin(14, Pin.IN)
trig = Pin(27, Pin.OUT)
echo = Pin(26, Pin.IN)
led = Pin(33, Pin.OUT)
buzzer = PWM(Pin(25))
servo_pwm = PWM(Pin(13), freq=50)
from keypad import Keypad4x4
keys = [['1','2','3','A'],['4','5','6','B'],['7','8','9','C'],['*','0','#','D']]
keypad = Keypad4x4(keys, [19,18,5,17], [16,4,2,15])
correct_password = "1234"
TIMEOUT = 180
def get_distance_cm():
trig.off(); utime.sleep_us(2)
trig.on(); utime.sleep_us(10)
trig.off()
timeout = 10000
start_time = utime.ticks_us()
while echo.value() == 0:
if utime.ticks_diff(utime.ticks_us(), start_time) > timeout:
return 999
start = utime.ticks_us()
while echo.value() == 1:
if utime.ticks_diff(utime.ticks_us(), start_time) > timeout:
return 999
end = utime.ticks_us()
duration = utime.ticks_diff(end, start)
return (duration / 2) / 29.1
def servo_move(pos):
servo_pwm.duty(77 if pos=="unlock" else 25)
def stop_buzzer():
buzzer.duty(0)
try:
buzzer.deinit()
except:
pass
def alert(times=3):
for _ in range(times):
led.on()
buzzer.init()
buzzer.freq(500); buzzer.duty(200)
utime.sleep(0.3)
led.off()
buzzer.duty(0)
utime.sleep(0.3)
stop_buzzer()
def unlock_sequence():
led.off()
buzzer.init(); buzzer.freq(800); buzzer.duty(150)
utime.sleep(0.2)
stop_buzzer()
servo_move("unlock")
utime.sleep(5)
servo_move("lock")
led.on()
def check_password(timeout_s):
start = now()
typed = ""
while now() - start < timeout_s:
key = keypad.get_key()
if key:
typed += key
print("*", end="", flush=True)
if len(typed) == len(correct_password):
print()
return typed == correct_password
utime.sleep(0.1)
return None
servo_move("lock")
led.on()
stop_buzzer()
print("System ready – stand <100 cm from sensor to trigger")
while True:
dist = get_distance_cm()
print("Distance:", round(dist,1), "cm")
if dist < 100:
print("Presence detected – you have 3 minutes")
start = now()
while now() - start < TIMEOUT:
if get_distance_cm() >= 100:
print("Person left – resetting")
break
remaining = int(TIMEOUT - (now() - start))
result = check_password(remaining)
if result is True:
print("Correct password!")
unlock_sequence()
break
elif result is False:
print("Wrong password!")
alert()
break
else:
print("Timeout – no password entered")
alert(5)
utime.sleep(0.5)