# Untuk Motion, LED, dan Servo
from machine import Pin, PWM, SoftI2C
from time import sleep
# Untuk Oled
import ssd1306
# Setup motion sensor
motion = False
waktu_nyala = 3 # dalam detik
def handler_function(pin):
global motion
motion = True
global interrupt_pin
interrupt_pin = pin
# Setup LED
led = Pin(19, Pin.OUT)
# Setup PIR sensor
pir = Pin(15, Pin.IN)
pir.irq(trigger=Pin.IRQ_RISING, handler=handler_function)
# Setup Servo Motor pada pin 18
servo = PWM(Pin(18), freq=50)
# Fungsi untuk mengontrol posisi servo
def set_servo_position(degrees):
# Konversi derajat ke duty cycle (0-180 derajat ke 20-120)
min_duty = 1000 # duty untuk 0 derajat
max_duty = 9000 # duty untuk 180 derajat
duty = min_duty + (max_duty - min_duty) * degrees / 180
servo.duty_u16(int(duty))
# Setup Oled
i2c = SoftI2C(scl=Pin(2), sda=Pin(4))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
# Jalankan simulasi
while True:
if motion:
print("Ada pergerakan di pin ", interrupt_pin)
# Nyalakan LED
led.value(1)
# Gerakan servo dari 0 ke 180 derajat
for angle in range(0, 181, 10):
set_servo_position(angle)
sleep(0.02)
# Tampilkan pesan di OLED
oled.fill(0) # clear display
oled.text("Ada Pergerakan!", 0, 20)
oled.text("Menyala", 0, 40)
oled.show()
# Tunggu beberapa saat
sleep(waktu_nyala)
# Gerakan servo kembali ke posisi awal
for angle in range(180, -1, -10):
set_servo_position(angle)
sleep(0.02)
# Bersihkan OLED dan matikan LED
oled.fill(0)
oled.text("Tidak ada", 0, 20)
oled.text("pergerakan", 0, 40)
oled.show()
led.value(0)
print("Tidak ada pergerakan lagi!!")
motion = False
# Tambahkan sedikit delay untuk mengurangi penggunaan CPU
sleep(0.1)