import time # Import time library
import board # Import Raspberry Pi Pico pins
import digitalio # Import digital I/O library
import pwmio # Import PWM library
import busio # Import I2C library
import lcd # Import LCD library
import i2c_pcf8574_interface # Import LCD I2C interface
# LCD SETUP
i2c = busio.I2C(scl=board.GP27, sda=board.GP26) # Create I2C
i2c_interface = i2c_pcf8574_interface.I2CPCF8574Interface(i2c, 0x27) # LCD address
display = lcd.LCD(i2c_interface, num_rows=2, num_cols=16) # Create LCD
display.set_backlight(True) # LCD backlight ON
display.set_display_enabled(True) # Enable LCD
# 7 SEGMENT SETUP
bcd_ones = [board.GP6, board.GP7, board.GP8, board.GP9] # 7-segment pins
class CD4511:
def __init__(self, pins):
self.bcd = []
for pin in pins:
p = digitalio.DigitalInOut(pin)
p.direction = digitalio.Direction.OUTPUT
self.bcd.append(p)
def display(self, num):
num = max(0, min(9, num))
for i in range(4):
self.bcd[i].value = (num >> i) & 1
ones_disp = CD4511(bcd_ones)
# KEYPAD SETUP
row_pins = [board.GP10, board.GP11, board.GP12, board.GP13]
col_pins = [board.GP14, board.GP15, board.GP16, board.GP17]
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 = True
for col in cols:
col.direction = digitalio.Direction.INPUT
col.pull = digitalio.Pull.UP
keymap = [
["1", "2", "3", "A"],
["4", "5", "6", "B"],
["7", "8", "9", "C"],
["*", "0", "#", "D"]
]
# PARKING LEDS
slot1_led = digitalio.DigitalInOut(board.GP2)
slot1_led.direction = digitalio.Direction.OUTPUT
slot2_led = digitalio.DigitalInOut(board.GP3)
slot2_led.direction = digitalio.Direction.OUTPUT
slot3_led = digitalio.DigitalInOut(board.GP4)
slot3_led.direction = digitalio.Direction.OUTPUT
# STATUS LEDS
green_led = digitalio.DigitalInOut(board.GP18)
green_led.direction = digitalio.Direction.OUTPUT
red_led = digitalio.DigitalInOut(board.GP19)
red_led.direction = digitalio.Direction.OUTPUT
# BUZZER
buzzer = digitalio.DigitalInOut(board.GP20)
buzzer.direction = digitalio.Direction.OUTPUT
# BUTTONS
exit_button = digitalio.DigitalInOut(board.GP22)
exit_button.direction = digitalio.Direction.INPUT
exit_button.pull = digitalio.Pull.UP
alarm_button = digitalio.DigitalInOut(board.GP28)
alarm_button.direction = digitalio.Direction.INPUT
alarm_button.pull = digitalio.Pull.UP
# SERVOS
entry_servo_pwm = pwmio.PWMOut(board.GP21, frequency=50)
exit_servo_pwm = pwmio.PWMOut(board.GP0, frequency=50)
def set_servo(servo, angle):
duty = int(1638 + (angle / 180) * (8192 - 1638))
servo.duty_cycle = duty
# VARIABLES
password = "0571"
user_input = ""
attempts = 3
system_open = False
TOTAL_SLOTS = 3
occupied_slots = 0
parking_slots = [0, 0, 0]
# DISPLAY FUNCTION
def update_display():
available = TOTAL_SLOTS - occupied_slots
ones_disp.display(available)
# LCD FUNCTION
def show_slots():
line = ""
for i in range(3):
if parking_slots[i] == 0:
line += "S" + str(i + 1) + ":F "
else:
line += "S" + str(i + 1) + ":O "
display.clear()
display.set_cursor_pos(0, 0)
display.print("SMART PARKING")
display.set_cursor_pos(1, 0)
display.print(line[:16])
# MESSAGE FUNCTION
def show_message(line1, line2):
display.clear()
display.set_cursor_pos(0, 0)
display.print(line1)
display.set_cursor_pos(1, 0)
display.print(line2)
# LED FUNCTION
def update_leds():
slot1_led.value = parking_slots[0]
slot2_led.value = parking_slots[1]
slot3_led.value = parking_slots[2]
if occupied_slots < TOTAL_SLOTS:
green_led.value = True
red_led.value = False
else:
green_led.value = False
red_led.value = True
# KEYPAD FUNCTION
def read_key():
for r, row in enumerate(rows):
row.value = False
for c, col in enumerate(cols):
if not col.value:
time.sleep(0.2)
while not col.value:
pass
row.value = True
return keymap[r][c]
row.value = True
return None
# GATE FUNCTION
def open_gate(servo):
buzzer.value = True
time.sleep(0.2)
buzzer.value = False
set_servo(servo, 90)
time.sleep(3)
set_servo(servo, 0)
# STARTUP
set_servo(entry_servo_pwm, 0)
set_servo(exit_servo_pwm, 0)
update_display()
update_leds()
show_message("PARKING LOCKED", "ENTER PASSWORD")
# MAIN LOOP
while True:
update_display()
update_leds()
key = read_key()
# PASSWORD SYSTEM
if system_open == False:
if key:
if key == "#":
if user_input == password:
system_open = True
attempts = 3
user_input = ""
show_message("ACCESS GRANTED", "PARKING OPEN")
time.sleep(2)
update_leds()
show_slots()
else:
attempts -= 1
show_message("WRONG PASSWORD", "TRY AGAIN")
red_led.value = True
buzzer.value = True
time.sleep(1)
red_led.value = False
buzzer.value = False
if attempts == 0:
display.clear()
display.set_cursor_pos(0, 0)
display.print("SYSTEM LOCKED")
display.set_cursor_pos(1, 0)
display.print("WAIT 10 SEC")
for seconds in range(10, -1, -1):
ones_disp.display(seconds)
red_led.value = True
green_led.value = True
slot1_led.value = True
slot2_led.value = True
slot3_led.value = True
buzzer.value = True
time.sleep(0.5)
red_led.value = False
green_led.value = False
slot1_led.value = False
slot2_led.value = False
slot3_led.value = False
buzzer.value = False
time.sleep(0.5)
attempts = 3
user_input = ""
show_message("PARKING LOCKED", "ENTER PASSWORD")
elif key == "*":
user_input = user_input[:-1]
elif len(user_input) < 4:
user_input += key
if system_open == False:
display.set_cursor_pos(1, 0)
display.print(" ")
display.set_cursor_pos(1, 0)
display.print("*" * len(user_input))
# PARKING SYSTEM
else:
# EXIT BUTTON
if not exit_button.value:
show_message("CAR EXITED", "EXIT OPENING")
open_gate(exit_servo_pwm)
occupied_slots = max(0, occupied_slots - 1)
for i in range(3):
if parking_slots[i] == 1:
parking_slots[i] = 0
break
update_leds()
show_slots()
time.sleep(1)
# ALARM BUTTON
if not alarm_button.value:
display.clear()
display.set_cursor_pos(0, 0)
display.print("EMERGENCY!")
display.set_cursor_pos(1, 0)
display.print("ALARM ACTIVE")
for i in range(15):
red_led.value = True
green_led.value = True
slot1_led.value = True
slot2_led.value = True
slot3_led.value = True
buzzer.value = True
time.sleep(0.15)
red_led.value = False
green_led.value = False
slot1_led.value = False
slot2_led.value = False
slot3_led.value = False
buzzer.value = False
time.sleep(0.15)
update_leds()
show_slots()
# PARKING SLOT SELECTION
if key in ["1", "2", "3"]:
slot = int(key) - 1
if parking_slots[slot] == 0:
show_message("SLOT " + key + " FREE", "ENTRY OPENING")
open_gate(entry_servo_pwm)
parking_slots[slot] = 1
occupied_slots += 1
else:
show_message("SLOT " + key + " BUSY", "CHOOSE ANOTHER")
update_leds()
show_slots()
time.sleep(0.1)