from machine import Pin, PWM
from time import sleep
from hcsr04 import HCSR04
from machine import I2C
import ssd1306
# Initialize components
servo_pin = PWM(Pin(4), freq=50) # Servo motor control pin
pir_pin = Pin(14, Pin.IN) # PIR sensor input pin
button_servo_pin = Pin(16, Pin.IN, Pin.PULL_UP) # Button pin for servo control
button_led_pin = Pin(17, Pin.IN, Pin.PULL_UP) # Button pin for LED control
led_pin = Pin(5, Pin.OUT) # LED pin
i2c = I2C(-1, scl=Pin(22), sda=Pin(21)) # I2C communication for OLED display
oled = ssd1306.SSD1306_I2C(128, 64, i2c) # Initialize OLED display
ultrasonic = HCSR04(trigger_pin=19, echo_pin=18) # Ultrasonic sensor pins
# Function to set servo position for curtain
def set_curtain_position(position):
servo_pin.duty(position)
# Function to fully open the curtain
def open_curtain():
# Start continuous rotation
servo_pin.duty(115) # Move to position 20 (fully closed)
sleep(1)
servo_pin.duty(70) # Start rotation (adjust duty cycle based on calibration)
sleep(5) # Rotate for 5 seconds (adjust as needed)
# Stop rotation
servo_pin.duty(50) # Stop at midpoint (adjust as needed)
# Function to fully close the curtain
def close_curtain():
# Start continuous rotation
servo_pin.duty(20) # Move to position 115 (fully open)
sleep(1)
servo_pin.duty(70) # Start rotation (adjust duty cycle based on calibration)
sleep(5) # Rotate for 5 seconds (adjust as needed)
# Stop rotation
servo_pin.duty(50) # Stop at midpoint (adjust as needed)
# Function to display message on OLED
def display_message(message):
oled.fill(0)
oled.text(message, 0, 0)
oled.show()
# Main loop
while True:
# Check for motion detected by PIR sensor
if pir_pin.value():
display_message("Motion Detected")
# Turn on LED
led_pin.value(1)
# Activate buzzer (for future expansion)
else:
display_message("No Motion Detected")
# Turn off LED
led_pin.value(0)
# Deactivate buzzer (for future expansion)
# Check button for servo control
if not button_servo_pin.value():
sleep(0.1) # debounce
if not button_servo_pin.value():
# Toggle curtain state
if led_state:
close_curtain()
else:
open_curtain()
sleep(0.5) # debounce
# Check button for LED control
if not button_led_pin.value():
sleep(0.1) # debounce
if not button_led_pin.value():
# Toggle LED state
led_pin.value(not led_pin.value())
sleep(0.5) # debounce
# Measure distance using ultrasonic sensor
distance = ultrasonic.distance_cm()
display_message("Distance: {} cm".format(distance))
sleep(1) # Display message for 1 second