import board
import digitalio
import time
import busio
import pwmio
# LCD libraries
import lcd
import i2c_pcf8574_interface
# === LCD SETUP ===
i2c = busio.I2C(scl=board.GP5, sda=board.GP4)
address = 0x27
i2c_interface = i2c_pcf8574_interface.I2CPCF8574Interface(i2c, address)
display = lcd.LCD(i2c_interface, num_rows=2, num_cols=16)
display.set_backlight(True)
display.set_display_enabled(True)
# === PIR SENSOR ===
pir = digitalio.DigitalInOut(board.GP16)
pir.direction = digitalio.Direction.INPUT
# === LED SETUP ===
led = digitalio.DigitalInOut(board.GP7)
led.direction = digitalio.Direction.OUTPUT
# === BUZZER SETUP (initial dummy assignment) ===
buzzer = pwmio.PWMOut(board.GP15, duty_cycle=0, frequency=1000)
# === SYSTEM VARIABLES ===
ALARM_DURATION = 5 # seconds
# === TRIGGER ALARM FUNCTION ===
def trigger_alarm(duration):
global buzzer # Allow modifying the global buzzer object
start_time = time.monotonic()
while (time.monotonic() - start_time) < duration:
print("!! Motion Detected !!")
led.value = True
display.clear()
display.print("ALERT!\nMotion Detected")
# Siren effect: alternate between 1000 Hz and 2000 Hz
for _ in range(5):
buzzer.deinit()
buzzer = pwmio.PWMOut(board.GP15, frequency=1000, duty_cycle=32768)
time.sleep(0.2)
buzzer.deinit()
buzzer = pwmio.PWMOut(board.GP15, frequency=2000, duty_cycle=32768)
time.sleep(0.2)
# Pause LED and buzzer
led.value = False
buzzer.deinit()
time.sleep(0.3)
# Reset after alarm
led.value = False
buzzer.deinit()
display.clear()
display.print("System Ready")
# === MAIN LOOP ===
display.print("System Ready")
while True:
if pir.value:
print("PIR: Motion Detected")
trigger_alarm(ALARM_DURATION)
else:
print("PIR: No Motion")
time.sleep(0.1)