from machine import Pin, I2C, PWM
import ssd1306
import time
# =========================
# 1. OLED & RTC Initialization
# =========================
oled = None
try:
# تعديل الـ Pins لـ D1 (SCL) و D2 (SDA)
# D1 = GPIO 5, D2 = GPIO 4
i2c = I2C(0, scl=Pin(5), sda=Pin(4))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
print("✅ OLED & I2C initialized on D1/D2.")
except Exception as e:
oled = None
print("❌ OLED initialization failed:", e)
# =========================
# 2. Servo Motor Setup (PWM)
# =========================
# السيرفو على D18 (GPIO 18) كما هو
servo = PWM(Pin(18), freq=50)
def set_angle(angle):
# تحويل الزاوية لنبضات (16-bit resolution)
min_duty = 1638 # 0 degree
max_duty = 8192 # 180 degree
duty = int(min_duty + (angle / 180) * (max_duty - min_duty))
servo.duty_u16(duty)
# =========================
# 3. Sensor and Actuator Setup
# =========================
pir_sensor = Pin(27, Pin.IN) # حساس الحركة على D27
buzzer = Pin(13, Pin.OUT) # البوزر على D13
# =========================
# 4. Functions
# =========================
def update_display(msg):
if oled is not None:
try:
oled.fill(0)
oled.text("CureConnect AI", 10, 5)
oled.text("----------------", 0, 20)
oled.text("Status:", 0, 40)
oled.text(msg, 60, 40)
oled.show()
except Exception as e:
print("OLED runtime error:", e)
def dispense_medicine():
print("🚨 Motion detected! Dispensing...")
update_display("Working")
set_angle(90) # فتح الدرج
time.sleep_ms(800)
set_angle(0) # غلق الدرج
# تنبيه صوتي
buzzer.value(1)
time.sleep_ms(300)
buzzer.value(0)
update_display("Ready")
print("✅ Done.")
# =========================
# 5. Main Loop
# =========================
set_angle(0) # وضع البداية
update_display("Ready")
while True:
if pir_sensor.value() == 1:
dispense_medicine()
# انتظار خروج الشخص من أمام الحساس (Debounce)
while pir_sensor.value() == 1:
time.sleep(0.1)
time.sleep(2) # انتظار قبل السماح بصرف جرعة أخرى
time.sleep(0.1)