from machine import Pin, I2C, PWM
from keypad import Keypad
from pico_i2c_lcd import I2cLcd
from time import sleep
# Initialize I2C interface
i2c = I2C(0, scl=Pin(1), sda=Pin(0))
# Initialize LCD
lcd = I2cLcd(i2c, 0x27, 2, 16) # Adjust the I2C address and dimensions as
needed
# Initialize keypad
keypad_rows = [Pin(2), Pin(3), Pin(4), Pin(5)]
keypad_cols = [Pin(6), Pin(7), Pin(8), Pin(9)]
keypad = Keypad(keypad_rows, keypad_cols, ['1', '2', '3', 'A','4', '5', '6',
'B','7', '8', '9', 'C','*', '0', '#', 'D'])
# Initialize servo motor
servo = PWM(Pin(10))
servo.freq(50) # Set PWM frequency to 50Hz (standard for servos)
# Define default password
default_password = '1234'
def set_password():
lcd.clear()
lcd.putstr("Set Password:")
print("Set Password:")
password = ''
while len(password) < 4:
key = keypad.get_key()
if key:
password += key
lcd.move_to(len(password) - 1, 1)
lcd.putchar('*')
sleep(0.5) # Add a short delay for readability
print(password)
return password
def validate_password(password):
lcd.clear()
lcd.putstr("Enter Password:")
print("Enter Password:")
entered_password = ''
while len(entered_password) < 4:
key = keypad.get_key()
if key:
entered_password += key
lcd.move_to(len(entered_password) - 1, 1)
lcd.putchar('*')
sleep(0.3) # Add a short delay for readability
print(entered_password)
return entered_password == password
def unlock_door():
for position in range(4500, 9000, 50):
servo.duty_u16(position)
sleep(0.05)
for position in range(9000, 4500, -50):
servo.duty_u16(position)
sleep(0.05)
# Main loop
def main():
lcd.putstr("Safety Door Lock")
print("Safety Door Lock")
sleep(2)
password = set_password()
lcd.clear()
lcd.putstr("Password Set")
print("Password Set")
sleep(2)
lcd.clear()
while True:
if validate_password(password):
lcd.clear()
lcd.putstr("Door Unlocked")
print("Door Unlocked")
unlock_door()
else:
lcd.clear()
lcd.putstr("Access Denied")
print("Access Denied")
sleep(2)
lcd.clear()
if __name__ == "__main__":
main()