import time
from machine import Pin, I2C
import ssd1306
# OLED setup
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# PIR sensor
pir = Pin(13, Pin.IN)
# A4988 stepper driver pins
step_pin = Pin(19, Pin.OUT)
dir_pin = Pin(18, Pin.OUT)
enable_pin = Pin(5, Pin.OUT)
enable_pin.value(0) # LOW = enable driver
# Stepper setting
STEPS_PER_REVOLUTION = 200
MAX_REVOLUTIONS = 2
MAX_STEPS = STEPS_PER_REVOLUTION * MAX_REVOLUTIONS
direction = 1 # 1 = CW, -1 = CCW
def update_oled(status):
oled.fill(0)
oled.text("IoT Motion Sys", 0, 0)
oled.text("Status:", 0, 15)
oled.text(status, 0, 30)
oled.text("Dir: " + ("CW" if direction == 1 else "CCW"), 0, 50)
oled.show()
def step_motor():
step_pin.value(1)
time.sleep_us(2000)
step_pin.value(0)
time.sleep_us(2000)
def move_stepper():
global direction
if direction == 1:
dir_pin.value(1)
update_oled("Rotating CW")
else:
dir_pin.value(0)
update_oled("Rotating CCW")
for i in range(MAX_STEPS):
step_motor()
update_oled("Limit Reached")
time.sleep(1)
# Reverse direction for next motion detection
direction *= -1
update_oled("Waiting Motion")
time.sleep(1)
# Initial display
update_oled("No Motion")
while True:
if pir.value() == 1:
update_oled("Motion Detected")
time.sleep(0.5)
move_stepper()
# Cooldown to avoid repeated trigger
time.sleep(2)
else:
update_oled("No Motion")
time.sleep(0.5)